swapper_pg_dir 과 pg0의 관계?

erdos의 이미지

안녕하세요.

커널 페이지 테이블 관련하여 보던 도중

컴퓨터 부팅시 초기화 단계에서 쓰인 마스터 커널 페이지 전역 디렉토리에 관한 초기화 부분에서 막혀서 질문드립니다.

<<리눅스 커널의 이해>> 라는 책에 따르면 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그리고

erdos의 이미지

렉걸리더니 그대로 저장되버렸네요...

마지막으로 질문하려 했던 부분은 paging_init 함수에서 patetable_init 이후에 swapper_pg_dir을 cr3에 또 저장한다고 나옵니다.

startup_32함수에서 했는데도 말이죠...

대체 어떻게 이 책을 해석해서 봐야될지 모르겠습니다.. ㅠㅠ

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.