2012-07-05 4 views
2

번역 테이블의 항목을 업데이트하는 단계는 무엇입니까?일부 MMU 변환 테이블 항목 변경 - 올바른 방법?

일부 메모리 보호를 위해 ARM920T의 MMU를 사용합니다. 프로세스간에 전환 할 때 다른 프로세스의 메모리를 보호하기 위해 일부 항목을 변경해야합니다. 테이블을 업데이트 한 후 (메모리에서) 전체 TLB 무효화를 실행하지만 (확실한 것은 잠긴 항목이 없음) 새로운 프로세스가 이전의 데이터에 계속 액세스 할 수 있습니다.

테이블을 가로 질러 다닐 때 (다른 프로세스 영역이 "USR 모드에서 액세스 할 수 없음"으로 설정 됨) 의미가있는 것처럼 보입니다.

편집 나는 또한 TLB 무효화 전 (모두 캐시에) 전체 캐시가 깨끗하고 무효화 할 수 있지만, 아무것도 변경되지 않습니다.

답변

1

페이지 변경 후 TLB가 유지되어야하는 것은 아니며, 특히 실행 코드가 포함 된 TLB가 유일한 것입니다. 먼저 변경 사항이 실제 메모리로 전파되었는지 확인해야합니다 (예 : 수정 한 페이지 테이블을 가리키는 캐시 된 영역 정리). 이전 코드 영역의 행을 포함 할 수 있으므로 명령 캐시를 무효화해야합니다. 캐시 유형에 따라 페이지 테이블을 업데이트하기 전에 데이터 캐시를 지우고 변경 후에 데이터 캐시를 무효화해야 할 수도 있습니다. 마지막으로 작업을 지정한 순서대로 완료 할 수있는 충분한 장벽이 있는지 확인해야합니다.

1

테이블 테이블에 기록한 후 또는 메모리 장벽을 발행 한 후 전체 캐시를 플러시하는 것보다 더 나은 성능을 발휘할 수 있지만 좋은 이유로 인해 페이지 테이블이 강하게 정렬 된 영역을 매핑해야합니다.

난 정말 당신이 물어하려고하는, 또는 당신은 정확히 문제가 있지만, 내가 내 소프트웨어 중 하나를 사용하고 무엇을 어디에 무엇을 이해하지 않습니다

.align 
arch_mmu_map_section: 
#if ARM_WITH_MMU 
    ldr  r3, =MMU_TLB   @ r3 = &table 
    add  r1, r3, r1, lsr #18 @ r1 = &table + offset(entry) 
    ldr  r3, =0xFFFFF   @ r3 = (1<<20) - 1 
    bic  r0, r0, r3   @ Align r0 to 1 MB 
    orr  r0, r0, r2   @ ORR the flags 
    str  r0, [r1]    @ Write entry to r1, pointer to entry 
    @ Invalidate UTLB 
    mov  r3, #0 
    mcr  p15, 0, r3, c8, c7, 0 
#endif 
    bx  lr 

MMU_TLB가 포인터 테이블은 mmu_init 동안 강하게 정렬 된 것으로 매핑됩니다. 이 함수의 프로토 타입은

void arch_mmu_map_section(addr_t paddr, addr_t vaddr, uint flags); 
+0

입니다. 질문은 다음과 같습니다. 번역 테이블에서 업데이트를 수행하기 위해 수행해야 할 단계는 무엇입니까? 성능은 지금 기준이 아닙니다. 그리고 내 질문에 명시된 바와 같이 : 문제는, 내가 테이블을 업데이 트하지만 변경 사항이 mmu에 의해 고려되지 않는 것 같습니다. 또한 지금은 실제 매핑을 사용하지 않는다는 것을 유의하십시오 (모든 것이 단지 평면으로 매핑됨을 의미 함). – Nobody

+0

평면 매핑은 메모리 모델에 영향을주지 않습니다. 메모리 매핑시 플래그, TX, CB 및 기타 비트가 매핑되는 메모리의 일부에 대한 메모리 모델을 결정해야합니다. 그 입구에 테이블에. ARM에는 여러 메모리 모델이 있습니다. 프로세서 매뉴얼에서 읽어야합니다. 강력하게 처리 된 명령은 모든 캐시가 자동으로 플러시되고 쓰기 작업이 순서대로 실행되지 않으므로 가장 쉽게 처리 할 수 ​​있습니다. Strongly ordered memory를 사용하고 UTLB를 플러시하십시오. – sgupta