swapper_pg_dir 과 pg0의 관계?
안녕하세요.
커널 페이지 테이블 관련하여 보던 도중
컴퓨터 부팅시 초기화 단계에서 쓰인 마스터 커널 페이지 전역 디렉토리에 관한 초기화 부분에서 막혀서 질문드립니다.
<<리눅스 커널의 이해>> 라는 책에 따르면 swapper_pg_dir이라는 변수로써 임시 페이지 전역 디렉토리가 정의되어있고, 커널 컴파일시에 정적으로 초기화되있다고 합니다.
그렇다는 것은 결국 이미지 올라갈때 해당 변수가 나중에 만들어지는 것이 아니라 특정 물리 메모리 영역에 바로 지정되서 올라간다는 의미일 겁니다.
이때 설명 뒷자락에
"임시 페이지 전역 디렉토리는 swapper_pg_dit 변수에 들어있고,
커널의 초기화되지 않은 데이터 세그먼트 끝(심볼 _end)의 바로 뒷주소 pg0에 저장된다"
라는 말이 있습니다.
그런데 실제 코드를 보면
.org 0x1000
321 ENTRY(swapper_pg_dir)
322 /*
323 * The page tables are initialized to only 4MB here - the final page
324 * tables are set up later depending on memory size.
325 */
326 .org 0x2000
327 ENTRY(pg0)
328
329 .org 0x3000
330 ENTRY(empty_bad_page)
이렇게 나와있습니다. 바로 뒷주소가 pg0라고 했지만 실제로 pg0는 해당 swapper_pg_dir이 들어있는 페이지 프레임 바로 뒷 프레임인것을 알수 있습니다.
<<리눅스 커널의 이해>> 번역본이 하도 오타 오역이 많아서 확신이 안가서 원서를 같이 보는데 원서에도 똑같이 나와있더라구요.
그런데 실제 코드는 다르죠... 제가 이것을 어떻게 받아들여야될지 모르겠습니다.
게다가
그 뒷장에서
swapper_pg_dir의 엔트리에 pg0의 주소를 초기화 하는 것이 나옵니다.
상식적으로 자기 테이블를 자신이 참조하게 하는 것은 말이 안되고 특히 초기화 상태에서 그렇게 하는 것이 납득이 안됩니다.
그리고 설명에는 swapper_pg_dir의 총 4개의 엔트리를 초기화 하는데요.
각 두개씩 pg0주소와 pg0 주소 다음 페이지 프레임의 주소라고 되있습니다.
하지만 위의 코드에서 보시면 아시겠지만 pg0 다음 페이지 프레임은 empty_bad_page 로 이미 할당되어져있습니다.
물론 단순히 처음 8MB를 한다고 가정한것이지만 그렇다면 실제로 초기화때는 4MB 만 페이지 테이블을 만드는것인가요?(pg0)
또한 movl $swapper_pg_dir - 0xc0000000, %eax 의 의미가 대체 뭔가요.?
코드상에서는 그냥 swapper_pg_dir 주소를 cr3에 넣는데 여기서는 저렇게 빼서 넣는다고 나옵니다.
asdfs그리고
렉걸리더니 그대로 저장되버렸네요... 마지막으로
렉걸리더니 그대로 저장되버렸네요...
마지막으로 질문하려 했던 부분은 paging_init 함수에서 patetable_init 이후에 swapper_pg_dir을 cr3에 또 저장한다고 나옵니다.
startup_32함수에서 했는데도 말이죠...
대체 어떻게 이 책을 해석해서 봐야될지 모르겠습니다.. ㅠㅠ
댓글 달기