과목명 : 운영체제(Operating System)
수업일자 : 2023년 05월 03일 (수)
1. Segmentation in x86 - Descriptor Table
2. Segmentation in x86 - GDT(Global Descriptor Table)
2-1. kd> dg 0 40
3. Segmentation in x86 - Kernel Mode
3-1. kd> r
4. Segmentation in x86 - User Mode (1/2)
4-1. kd> !process 0 0, .process /p /r ffffdc0b04613080
4-2. kd> bp kernel32!readfile, bl, g
5. Segmentation in x86 - User Mode (2/2)
5-1. kd> r
5-2. kd> dg 0 40
6. Segmentation in x86 - TIB (Thread Information Block)
6-1. FS
(1) TIB (Thread Information Block)
- TIB은 스레드 정보 블록이라고도 불리며, Win32의 자료 구조(Data Structure)로써 현재 실행 중인 스레드에 대한 정보를 저장하고 있습니다. 해당 구조체는 스레드 환경 블록으로도 알려져 있습니다.
6-2. kd> dt nt!_KPCR
6-3. kd> dt ntdll!_NT_TIB
6-4. kd> dt ntdll!_KPRCB
7. Segmentation in x86 - Memory Addressing
7-1. GDTR(Global Descriptor Table Register) : kd> r gdtr, dd gdtr
8. Segmentation in x86 - Descriptor Table LAB
8-1. Descriptor Table (1)
8-2. Descriptor Table (2) : kd> dg 0 20
9. Segmentation in x86 - GDTR(Global Descriptor Table Register) and LDTR(Local Descriptor Table Register)
9-1. GDTR (Global Descriptor Table Register)
- GDTR 레지스터는 GDT의 32 Bit의 기본 주소(Base address)와 16 Bit의 Table Limit을 포함합니다.
9-2. LDTR(Local Descriptor Table Register)
- LDT는 GDT 내부에 존재하는 LDT Segment Descriptor(2번 System Segment Descriptor)를 통해 접근할 수 있는 Segment입니다. 이에 따라 LDT Segment의 경우 GDT 내부에 존재해야 하며 LDTR 레지스터는 Segment Selector, LDT의 기본 주소(Base address), LDT의 Segment Attributes(속성)를 담고 있습니다.
9-3. GDTR (Global Descriptor Table Register)
9-4. Segment Selector
9-5. Example) Selector = 0x8. 0x9. 0xA. 0xB
(1) kd> r gdtr
(2) kd> dg 0 30
(3) kd> db gdtr
(4) kd> dw gdtr
(5) kd> dd gdtr
(6) kd> !pte gdtr ( // kd> !pte va )
10. Paging in x86 - Control Registers
11. Paging in x86 - PAE(Physical Address Extensions) and PSE(Page Size Extensions)
■ PAE(Physical Address Extensions)
(1) 변환 프로세스는 Page Table 참조가 생략된 것을 제외하고 2 MB 및 4 KB Page에 대해 동일합니다.
(2) Paging 단위에 32 Bit Linear address를 제시하면 여러 필드로 나누어집니다.
- CR3는 기본 주소(Base address)를 가리킵니다.
- Linear address의 주소 비트 A[31, 30]은 PDPT에 대한 2 Bit 인덱스를 형성합니다. PDPT 항목에는 Page Directory의 기본 주소(Base address, 및 일부 제어 정보)가 포함되어 있습니다.
- 주소 비트 A[29 ... 21]는 Page Directory(Base 내부)에 대한 인덱스를 형성합니다. 이 Page Directory Entry(PDE)는 Page Table의 기본 주소(Base address)를 가리킵니다.(PDE.PS = 0, only) 또한 이 Page Table Entry(PTE)는 메모리의 4 KB 부분의 기본 주소(Base address)를 가리키고 있습니다.
- 나머지 주소 비트 A[20 ... 0](2 MB Page), A[11 ... 0](4 KB Page)는 메모리의 실제 페이지에 대한 인덱스(Offset)를 형성합니다.
- 모든 경우에 이러한 Table(PDPT, PDE 및 PTE)에 포함된 기본 주소는 물리적 주소이며 Paging 변환의 대상은 아니라는 특징을 가집니다.
11-1. PAE(Physical Address Extensions) / PSE(Page Size Extensions) Page Size Precedence
11-2. LAB (2/5)
(1) kd> !dlls, !peb
(2) kd> r cr3, .formats cr3
(3) kd> !dq cr3 (or !dd cr3), !pte 0x7c800000, .formats 0x7c800000
(4) kd> !pte eip, db eip L10, .formats cr4, r cr3
11-3. No PAE(Physical Address Extensions)
(1)
(2)
(3)
11-4. PDE(Page Directory Entry) and PTE(Page Table Entry) for No PAE(Physical Address Extensions)
11-5. PDE(Page Directory Entry) and PTE(Page Table Entry)
11-6. PAE(Physical Address Extensions)
12. Paging in x86 - PDPT(Page Directory Pointer Table)
12-1. Example)
13. Paging in x86 - Format of CR3 with PAE(Physical Address Extensions)
13-1. Example)
14. Paging Structures for PAE(Physical Address Extensions)
14-1. LAB (1/5)
(1) kd> !process 0 0, .process /i ffffdc0b4613080, g, !process ffffdc0b04613080
(2) kd> dt nt!_EPROCESS ffffdc0b04613080 Pcb.DirectoryTableBase, !vad ffffdc0b4d2ca60
15. Paging in x86 - VA 2 PA for EIP
15-1. LAB (3/5)
(1) kd> !dq 00a25000, !dq 00a25000 + 0xF20
15-2. LAB (4/5)
(1) kd> !pte 0x7c800000, !dq 086ea000
15-3. LAB (5/5)
(1) kd> !dq 0b0c2000, dq 0x7c800000, dd 0x7c800000
16. Etc Note
(1) kd> .formats 8f2f0000, !dd @cr3, dt -p nt!_hardware_pte 3fed4510
(2) kd> dt -p nt!_hardware_pte ((0x36716*@$pagesize)+(0x79*@@(sizeof(nt!_hardware_pte))),
dt -p nt!_hardware_pte ((0x2201e*@$pagesize)+(0xF0*@@(sizeof(nt!_hardware_pte)))
(3) kd> dt -p nt!_hardware_pte ((0x2201e*@$pagesize)+(0xF0*@@(sizeof(nt!_hardware_pte))),
!dq (0x102d963 & 0xFFFFFF000) + (0x000010000*@@(sizeof(nt! _MMPTE))) L1
17. Paging
18. Paging in x86 - !pte
(1) kd> !pte b742a310, dd /p 3edb1000 + 2DD * 4, dd C0300B74, dd b742a310, dd /p 28857000 + 310
(2) kd> dd /p ba7000 + 2A * 4, dd C02DD0A8, rm ff, .formats b742a310
(3) kd> r
(4) kd> !process 0 0, !process ffffdc0b04613080, !vad ffffdc0b04d2ca60, .process /p ffffdc0b04613080
(5) kd> !dc 6c40000, !dc abcde000, !dc dcdef000
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 댓글로 남겨주시면 감사하겠습니다!
댓글