[OS개발자료] x86 페이징에 대해

cppig1995의 이미지

제가 OS 만들다가 페이징 때문에 골머리 썩힌뒤 만든 정리입니다.
대충대충 썼습니다. 잘못된 부분이 있으면 지적해 주세요.

x86 Paging wrote:
80386 이상의 보호 모드 CPU에서는 페이징 기능을 지원한다. 페이징을 통해 4GiB 에 달하는 광대한 가상 메모리 공간에 접근할 수 있다. 보통 페이지는 4KiB (4,096 bytes) 이며, 일부 CPU에서는 다른 단위를 제공하기도 한다. 보통 4KiB 단위로 매핑하는 것이 일반적이다.
이러한 유용한 기능을 활성화시키기 위해서는 CR0 레지스터의 최상위 비트인 PG 비트를 설정하면 된다. 그러기 위해서는 보통 CR0 레지스터의 값과 0x80000000 을 OR하게 되는데, CR0 레지스터는 직접 연산할 수 없으므로 EAX 등 다른 32비트 레지스터를 경유하여 연산하면 될 것이다. 해제시키기 위해서는 0x7FFFFFFF 값과 AND 연산하면 되고, 반전시키기 위해서는 0x80000000 값과 XOR 연산을 하면 된다.
페이징이 활성화된 이후 주소의 표현 방식은 완전히 달라진다. PG 비트가 0일 때는 주소는 바로 물리 메모리의 오프셋을 가리켰지만, PG 비트가 1로 설정되고 페이징이 활성화된 이후에는 MSB부터 첫 10비트는 페이지 디렉토리 인덱스, 다음 10비트는 페이지 테이블 인덱스, 나머지 12비트는 페이지 오프셋이 된다.
CR3 레지스터가 가리키는 페이지 디렉토리의 엔트리 중 페이지 디렉토리 인덱스가 가리키는 값에는 페이지 테이블에 대한 참조가 들어 있다. 페이지 테이블의 엔트리 중 페이지 테이블 인덱스가 가리키는 곳에는 페이지의 시작 위치에 대한 참조가 있는데, 여기에 페이지 오프셋을 더해 주면 실제 주소가 된다.
PG 비트를 1로 설정하면, CPU를 보호 모드로 전환하는 것만큼이나 멋지게 재부팅되고 만다. 페이지 디렉토리와 페이지 테이블이 제대로 설정되지 않은 상태이기 때문이다. PG 비트를 1로 설정하기 전 필요한 준비를 마쳐야 한다. 사실 이런 면에서 볼 때 페이징 기능을 사용하는 것은 32비트 보호 모드를 사용하는 것만큼이나 힘들다.
참고로 보호 모드를 사용하려면 같은 CR0 레지스터의 최하위 비트를 1로 설정하면 되는데, 이렇게 하면 16비트로 해석되던 명령이 32비트로 해석되며 이 둘은 완전히 다른 것이 된다. 세그먼트 레지스터와 피연산자에 대한 해석도 완전히 달라진다.

참고 : 이 문서는 곧 돼지군의 위키페이지에 모판으로 심어질 예정입니다.

Forums: 

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.