x86, 우분투 10.04 리눅스 커널에서(대부분 비슷하지만)
커널영역의 가상주소는 0xC0000000 ~ 0xFFFFFFFF 이고 이것은
물리주소 0번지부터 선형매핑됩니다(ZONE_DMA, ZONE_NORMAL).
그리고 모든 페이지디렉토리, 페이지테이블은 이 영역에 존재합니다.
CR3 레지스터에는 페이지 디렉토리의 물리주소가 들어있습니다.
이 전제하에...
"페이지 디렉토리의 커널가상주소에 대해서 페이징을 하면 페이지 디렉토리의 물리주소가 나타나야 한다"
는 가정을 확인해보기위해 아래와같이 실험을 했지만 뭔가 이상합니다.
아래의 실험에서 제가 잘못 알고있는 부분이나 실수한 부분은 어디일까요?
1. 커널모듈 A 의 insmod 초기화함수(init_module)에서 CR3 레지스터 값을 읽어옴
unsigned int cr3=0;
asm ("movl %%cr3, %0\n" :"=r"(cr3));
printk("cr3 : %p\n", cr3);