본문 바로가기
코딩코딩/운영체제

Paging, MLP4, Linux 페이징

by g0n1 2022. 6. 1.
728x90
  • 선형적인 가상 주소 -> 실제 물리주소로 번역해주는 메커니즘
  • 페이징 모드에는 3가지가 있다. (1) 32비트 페이징, (2) PAE 페이징, (3) IA-32e 페이징
  • 우리가 살펴볼 건 IA-32e 페이징 (활성화를 위해 CR0.pg, CR4.PAE, IA32_EFER.LME 비트 설정 필요)

Paging structures

  • 페이징은 선형 주소 공간을 일정한 사이즈(4096, 4kb in x86_64)로 나누는 건데, 물리 주소 공간이나 외부 저장소에 매핑될 수 있다.
  • x86-64 linux의 모든 structures는 4096의 사이즈와 512개의 entry로 이루어져있다.
  • 리눅스는 계층을 갖는 4 level의 페이지를 사용한다.
  • cr3에 최상단 레벨의 주소가 적혀있다.
  • page table을 만들고 최상단 structure의 주소를 cr3에 저장
  • cr3레지스터는 프로세스 컨텍스트의 일부라 문맥 전환시에 같이 restore, save 된다.

대략적인 구조

  • Bits 63:52 - reserved must be 0.
  • Bits 51:12 - stores the address of the top level paging structure;
  • Bits 11: 5 - reserved must be 0;
  • Bits 4 : 3 - PWT(or Page-Level Writethrough) and PCD( or Page-level cache disable indicate).하드웨어 캐시가 어떻게 이 테이블을 다룰지 제어.
  • Bits 2 : 0 - ignored;

paging 과정

  • MMU에 가상 주소가 도착, (memory bus에 가는 것 아님)
  • 64bit 선형 주소는 여러 조각들로 split 되는데, 하위 48비트가 중요하다.(2^48개의 주소공간만  접근 가능)
    9 / 9 / 9 / 9 / 12 가 각각 Page-Map-Level-4 Offset, Page-Directory-Pointer Offset, Page-Directory Offset, Page-Table Offset, PPO임.
  • cr3가(정확히는 51~12에) 4 top-level 페이지 구조의 주소를 저장하고 있음.

Top Level Page Table

  • 선형주소에 대한 모든 접근은 커널(supervisor)모드거나 유저모드다.
  • 이 접근은 CPL에 의해 결정된다.  CPL이 3미만임녀 커널(supervisor)모드이고 그 외에는 유저모드이다.
    (CPL < 3 ? 커널모드 : 유저모드)
  • Multi level page의 최상단 테이블은 다음과 같이 생겼다.
63  62                  52 51                                                    32
 --------------------------------------------------------------------------------
| N |                     |                                                     |
|   |     Available       |     Address of the paging structure on lower level  |
| X |                     |                                                     |
 --------------------------------------------------------------------------------
31                                              12 11  9 8 7 6 5   4   3 2 1     0
 --------------------------------------------------------------------------------
|                                                |     | M |I| | P | P |U|W|    |
| Address of the paging structure on lower level | AVL | B |G|A| C | W | | |  P |
|                                                |     | Z |N| | D | T |S|R|    |
 --------------------------------------------------------------------------------
  • 63: XD 또는 NX (Execute disabled or No Execute)
  • 62~52 : CPU는 사용하지 않고, software가 사용
  • 51~12: 하위 테이블들의 물리 주소
  • 11~9 : CPU 사용 X
  • MBZ(must be zero): 그냥 0이다.
  • IGN(ignored): 안 씀
  • A(accessed): MMU가 읽거나 쓸 때 set 되고, software가 clear한다.
  • PCD: 자식 페이지 테이블의 캐싱 여부
  • PWT(write-through, write-back)
  • U/S(user/supervisor) : 사용자 모드에서 접근 가능한지
  • R/W(read/write) : 읽기/쓰기 허용인지 읽기 허용인지
  • P(present) : 물리 메모리에 존재하는지

Paging structures in the Linux Kernel

x86_64의 리눅스 커널에서는 4-level page tables를 사용한다. 각 테이블의 이름은 다음과 같다.

  • Page Global Directory
  • Page Upper Directory
  • Page Middle Directory
  • Page Table Entry

 

 

 

리얼모드 세그먼테이션에서는 물리 주소가 세그먼트 레지스터를 4만큼 쉬프트하고 오프셋을 더하는 방식으로 계산된다?
보호모드에서의 세그먼테이션에서 디스크립터 테이블, 디스크립터로 부터의 기준주소 및 오프셋을 물리주소를 계산하기 위해 사용

728x90

'코딩코딩 > 운영체제' 카테고리의 다른 글

[번역] 왜 caller-saved와 callee-saved가 필요할까?  (0) 2022.06.05
kernel_of_linux  (0) 2022.05.30
PCB(Process Control Block)  (0) 2022.05.30
쉘이 명령어를 실행시키는 방법  (0) 2022.05.30

댓글