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 |
댓글