μΈ λ²μ§Έ νλ‘μ νΈμ μ λ°μ΄ μ§λ¬λ€.
짧κ²λλ§ κ΅¬ννλ©΄μ μκ²λ κ²μ λ¨κ²¨λλ€.
λμ€μ μμΈν μ 리νκ² μ§λ§, κ°μλ©λͺ¨λ¦¬(VM)λ μ΄μ체μ μ ν΅μ¬ designμΈ protection, isolation, sharing(space)μ μν΄ νμμ μΌλ‘ μ¬μ©λλ μΆμνμ΄λ€. λͺ¨λ μ μ νλ‘μΈμ€λ (μ¬μ§μ΄ 컀λ μ½λ μ체κΉμ§λ) μ΄ κ°μλ©λͺ¨λ¦¬ νκ²½μ κ°μμ£Όμ(virtual address) μμμ λμνλ©°, μ΄μ λν μ€μ 물리주μλ‘μ λ²μμ MMU(memory management unit)λΌλ νλμ¨μ΄κ° μ§μν΄μ€λ€. λ¨ MMUκ° μ΄λ₯Ό μν΄ 'νμ΄μ§ ν μ΄λΈ'μ walkingνλλ°, μ΄ νμ΄μ§ ν μ΄λΈμ ꡬμ±νλ κ²μ μ¬μ ν μννΈμ¨μ΄ μ¦, 컀λμ λͺ«μ΄λ€. 컀λμ μμ μ μ£Όμ곡κ°μ νλ‘μΈμ€λ³ νμ΄μ§ ν μ΄λΈμ ꡬμ±ν΄ λκ³ , κ° νλ‘μΈμ€κ° μ€νλ λ λ§λ€ CR3 λ μ§μ€ν°μ ν΄λΉ νμ΄μ§ ν μ΄λΈ μ£Όμλ₯Ό μ μ΄μ€μΌλ‘μ¨ MMUκ° κ·Έ νμ΄μ§ ν μ΄λΈμ walkingν μ μλλ‘ ν΄μ€λ€. walking νλ€λ μλ―Έλ νμ΄μ§ ν μ΄λΈμ μνΈλ¦¬λ€μ νκ³ νκ³ λ€μ΄κ°μ μ΅νλ¨ νμ΄μ§ ν μ΄λΈμ PTE(Page Table Entry)λ₯Ό μ°Ύμ 물리주μλ₯Ό μμλΈλ€λ κ²μ΄λ€. μ£Όμν μ μ νμ΄μ§ ν μ΄λΈμ μνΈλ¦¬μλ '물리주μ'κ° μ νμΌ νλ€λ μ μ΄λ€. νλμ¨μ΄μΈ MMUλ κ°μμ£ΌμλΌλ κ°λ μ μ΄ν΄νμ§ λͺ»νλ€. λ¨μ§ κ·Έ PTEμ μ ν μ΄λ€ κ°(물리주μ)λ₯Ό μ°Έκ³ ν΄μ μμ μ μ무λ₯Ό μνν λΏμ΄λ€. μ μκ°ν΄λ³΄λ©΄ νμ΄μ§ ν μ΄λΈ μμ²΄κ° κ°μμ£Όμ μ§μμ μν κ²μΈλ°, κ·Έκ³³μ κ°μμ£Όμλ₯Ό μ λλ€λ κ²μ΄ μ¬μ€ μ΄λΆμ±μ€μ΄λ€.
32bit μ»΄ν¨ν°λ₯Ό μν΄μλ νμ΄μ§ ν
μ΄λΈμ΄ λ± 2λ¨κ³λ§ μμΌλ©΄ μΆ©λΆνλ€. κ° νμ΄μ§ ν
μ΄λΈμ ν¬κΈ° μ체λ νμ΄μ§ νλμ ν¬κΈ°λ₯Ό κ°μ ΈμΌ νλλ°, μ£Όμκ° μλ£μ ν¬κΈ° (μ¦, ν¬μΈν°μ ν¬κΈ°) κ° 4 Byte
( ) μΈ 32 bit μ»΄ν¨ν°μμ νλμ νμ΄μ§ ν
μ΄λΈμ λ€μ΄κ° μ μλ μνΈλ¦¬μ κ°μλ 1024
κ° ( ) μ΄λ€. ( μ¦, νμ΄μ§ νλμ ν¬κΈ°μΈ 4 KiB
κ° λλ€.)
μμ νμ΄μ§ ν
μ΄λΈμΈ Page-Directoryλ 1024
κ°μ μνΈλ¦¬λ₯Ό κ°μ§ μ μκ³ , κ° μνΈλ¦¬λ νμ νμ΄μ§ ν
μ΄λΈμ μμμ£Όμλ₯Ό λ΄κ³ μμ κ²μ΄λ€. νμ νμ΄μ§ ν
μ΄λΈμΈ Page-Table λν 1024
κ°μ PTEλ₯Ό κ°μ§ μ μλ€. κ·Έλ λ€λ©΄ μ΄ κ°λ₯ν PTEμ κ°μκ° κ°κ° λκ³ , μ΄ PTEμ ν΄λΉνλ νμ΄μ§ μμμμ μ€νμ
λν νμ΄μ§μ λ°μ΄νΈ ν¬κΈ°(4 KiB
= 4096 Byte
= ) λ§νΌ κ°λ₯νκΈ° λλ¬Έμ κ²°κ΅ κ°λ₯ν μ£Όμμ κ°μλ κ°κ° λλ€.
νμ§λ§ 64bit μ»΄ν¨ν°μ λ±μ₯μΌλ‘ νμ΄μ§ ν
μ΄λΈ κ°μκ° μ¦κ°ν μ λ°μ μμλ€. μ΄ μ€ 48bitλ§ μ¬μ©νλ€κ³ ν΄λ νμ΄μ§ ν
μ΄λΈμ΄ 4λ¨κ³μ ꡬμ±μ μ§λ
μΌ νλ€. μ΄μ λ, bitμ κ°μ μ체λ λμμ λΏλ§ μλλΌ 64bitμμλ μ£Όμκ° μλ£μ ν¬κΈ°κ° 8 Byte
μ΄λ―λ‘ νμ΄μ§ ν
μ΄λΈ λΉ μνΈλ¦¬ κ°μκ° 512
κ° ( )λ‘ μ€μ΄λ€κΈ° λλ¬Έμ΄λ€. κ²°κ΅ 4λ¨κ³μ νμ΄μ§ ν
μ΄λΈ ꡬμ±μ ν΅ν΄ μ΄ κ°λ₯ν PTEμ κ°μκ° κ°κ° λκ³ , νμ΄μ§ μ€νμ
κ°μ λ₯Ό κ³±ν΄μ£Όλ©΄ κ°λ₯ν μ£Όμμ κ°μλ μ νν κ°κ° λλ€.
κ·Έλμ 4λ¨κ³μ νμ΄μ§ ν
μ΄λΈ ꡬμ±μ ν΅ν΄ 64bit μ»΄ν¨ν°μ κ°μ μ£Όμκ° λμνλ€. κ° λ¨κ³λ³λ‘ νμ΄μ§ ν
μ΄λΈ μ΄λ¦μ΄ μ‘΄μ¬νλ€.
PML4(page-map level 4) - PDP(page-directory pointer) - PD(page-directory) - PT(page-table)
μ΄λ κ² νμ΄μ§ ν
μ΄λΈμ΄ ꡬμ±λμ΄ μμ λ, MMUλ μ΄λ»κ² μ΄ νμ΄μ§ ν
μ΄λΈμ walking νλ©΄μ μ£Όμλ₯Ό λ²μνλ κ²μΌκΉ. κ°μ μ£Όμ 'κ°'μ κ·Έ ν΄λ΅μ΄ μλ€. μ¬μ€ κ°μ μ£Όμλ μμμ μΈκΈν λ¨κ³λ³ νμ΄μ§ ν
μ΄λΈμ μΈλ±μ€ μ 보λ₯Ό κ°μ§ μ΄λ€ κ°μ΄λ€.
λ°λΌμ MMUλ μ΄λ€ κ°μ μ£Όμλ₯Ό κ°μ§κ³ , κ·Έ μμ ν¬ν¨λ μΈλ±μ€ μ 보λ₯Ό νμ©νμ¬ walkingν ν, ν΄λΉνλ PTEλ₯Ό μ°Ύμ μ μλ€. μμΈν μμλ pintosμ ꡬνμ μ΄ν΄λ³΄λ©΄μ μ 리ν΄λ³΄λ €κ³ νλ€.
LOADER_KERN_BASE
pintos μμ κ°μ μ£Όμ곡κ°μ 2κ°μ§λ‘ λλλ€ : 컀λ κ°μ μ£Όμ (kernel virtual address) μ μ μ κ°μ μ£Όμ (user virtual address). κ·Έ λ μ¬μ΄μ ꡬλΆμ LOADER_KERN_BASE
λΌλ 맀ν¬λ‘λ₯Ό ν΅ν΄ μ μνλ λ° κ·Έ κ°μ 0x8004000000
μ΄λ€. μ¦, 컀λ κ°μ μ£Όμλ LOADER_KERN_BASE
κ°λ³΄λ€ κ°κ±°λ ν° μ£Όμλ₯Ό μλ―Ένκ² λλ€.
μμ λ§νλ―μ΄ κ°μ μ£Όμλ λ¨κ³λ³ νμ΄μ§ ν
μ΄λΈμ μΈλ±μ€ μ 보λ₯Ό λ΄κ³ μλ€.
LOADER_KERN_BASE
λν λ§μ°¬κ°μ§μ΄λ€.
κ·Έλ¦Όμμ 보μ΄λ― 0x8004000000
λΌλ κ°μ μ£Όμλ pml4 μ offsetμ΄ (i.e. ν
μ΄λΈμμμ μΈλ±μ€κ°) 1
λ‘ μ€μ λμ΄ μλ μ£Όμμ΄λ€. λν PDμ offsetμ΄ 32
λ‘ μ€μ λμ΄ μλ μ£Όμμ΄λ€. κ·Έλμ 컀λ κ°μ μ£Όμλ₯Ό μ΄μ©νλ€λ λ§μ 곧 MMUκ° μμ offsetμ ν΄λΉνλ walkingμ νλ©΄μ PTEλ₯Ό μ°Ύκ²λλ€λ λ§κ³Ό κ°κ²λλ€. λ¬Όλ‘ μ£Όμ κ°μ΄ μ¦κ°ν¨μ λ°λΌ offsetμ΄ λ³ν μ μκ² μΌλ, pml4μ offset 1
μ μ¦κ°λ 512 GiB
λ§νΌμ λ©λͺ¨λ¦¬ μ¦κ°μ λμΌνκΈ° λλ¬Έμ(pml4μ μνΈλ¦¬ νλκ° coverνλ λ©λͺ¨λ¦¬μ ν¬κΈ°κ° 512 GiB
μ΄λ€.) pml4μ offsetμ λ³νμ§ μλλ€κ³ λ΄λ 무방νλ€.
κ·Έλ λ€λ©΄ μ΄ LOADER_KERN_BASE
= 0x8004000000
λ³΄λ€ μμ μ£Όμμ ν΄λΉνλ μ μ κ°μ μ£Όμμ μΈλ±μ€ μ 보λ μ΄λ¨κΉ. LOADER_KERN_BASE
- 1
= 0x8003FFFFFF
μ ν΄λΉνλ μ£Όμμ μΈλ±μ€ μ 보λ₯Ό μ΄ν΄λ³΄μ.
pml4μ offsetμ μ¬μ ν 1
μ΄μ§λ§, PDμ offsetμ΄ 31
λ‘ κ°μν κ²μ μ μ μλ€. λ¬Όλ‘ μ£Όμκ° λ κ°μνλ€λ©΄ PD offsetκ³Ό PT offset λλ€ κ°μνκ² λ κ²μ΄λ€. κ²°λ‘ μ LOADER_KERN_BASE
λΌλ κΈ°μ€μ μ λ°λΌμ νμ΄μ§ ν
μ΄λΈμ walkingνλ 'κ²½λ‘' λν ꡬλΆλ μ μλ€λ κ²μ΄λ€.
μ΄λ κ²κΉμ§ μμΈν λ€μ¬λ€ λ³Έ μ΄μ λ κ° νλ‘μΈμ€κ° κ³ μ λ‘ κ°μ§λ pml4μ μμ± κ³Όμ μ νμ
νκΈ° μν΄μμλ€. κ²°λ‘ λΆν° λ¨Όμ λ§νμλ©΄, 컀λμ base_pml4
λΌλ κΈ°λ³Έ λ°νμ΄ λλ pml4λ₯Ό λΆν
μμ λ§λ€μ΄ μ μλ³μλ‘ λ±λ‘ν΄λμλ€κ°, κ° νλ‘μΈμ€κ° μμ μ pml4λ₯Ό μμ±νκ³ μ ν λ, λΉ νμ΄μ§μ base_pml4
μ κ°μ 볡μ¬ν΄μ€ ν κ·Έ νμ΄μ§λ₯Ό νλ‘μΈμ€μ κ³ μ pml4λ‘ λ±λ‘ν΄μ€λ€. (κΈμ νμμ²λΌ 볡μ¬λ₯Ό λ¬ μ’
μ΄λ₯Ό λκ²¨μ€ ν μμ λ‘κ² μ°κ²νλ κ²μ΄λΌκ³ μ΄ν΄νλ©΄ μ¬μΈμ§λ λͺ¨λ₯΄κ² λ€.)
base_pml4
μλ 컀λ κ°μ μ£Όμμ λν PTEλ€μ΄ μμ±λλ€. μ μ΄κ²μ΄ νμ΄μ§ ν
μ΄λΈμ 'κΈ°λ³Έ μμ'μ΄ λλκ²μΈκ° νλ©΄, 컀λ κ°μ μ£Όμμ λν νμ΄μ§ ν
μ΄λΈ μ 보λ λͺ¨λ νλ‘μΈμ€κ° κ°κΈ° λλ¬Έμ΄λ€. 컀λμ νλ‘μΈμ€μ λ€λ₯΄κ² μμ μ κ°λ³μ μΈ pml4λ₯Ό κ°μ§ νμκ° μλ€. λ¨μ§ κ° νλ‘μΈμ€μ pml4μμ LOADER_KERN_BASE
μ΄μμΈ μ£Όμμ ν΄λΉνλ PTEκ° μ»€λ κ°μ μ£Όμμ λ§κ² μμ±μ΄ λμ΄μμΌλ©΄ λλ€. κ·Έλ λ€λ©΄ μ 컀λμ΄ μμ μ pml4λ₯Ό κΈ°μ΅νλ©΄μ μ¬μ©νμ§ μκ³ , κ΅³μ΄ νλ‘μΈμ€ λ³λ‘ 컀λ κ°μ μ£Όμ μ 보λ₯Ό 볡μ¬νλ©΄μ νλ‘μΈμ€μ pml4λ₯Ό λ§λ€μ΄ μ£Όλ κ²μΈκ° μλ¬Έμ΄ μκΈΈ μ μλ€. μ΄λ λ€μμ μμΈν μ€λͺ
νκ² λ€.
κ·Έλ λ€λ©΄ κ°μ₯ λ¨Όμ , 컀λμ΄ base_pml4
λ₯Ό λ§λλ κ³Όμ μ μ΄ν΄λ³΄μ.
palloc_get_page()
μ PAL_ZERO
νλκ·Έλ₯Ό ν΅ν΄ 0μΌλ‘ μ΄κΈ°νλ λΉ νμ΄μ§λ₯Ό ν λΉλ°κ³ κ·Έκ²μ base_pml4
λ‘ μΌμμ νμ΄μ§ ν
μ΄λΈ μμ±μ μμνλ€. pintosλ 컀λ κ°μ μ£Όμμ 물리 λ©λͺ¨λ¦¬κ° (물리 λ©λͺ¨λ¦¬μ ν¬κΈ°λ§νΌλ§) 1λ1λ‘ λμλλ identical mapping λ°©μμΌλ‘ ꡬνλμ΄ μκΈ° λλ¬Έμ μ μ½λμμ 보μ΄λ λ°λ³΅λ¬Έμ ν΅ν΄ νμ΄μ§ ν
μ΄λΈμ μ μμ±νκ² λλ€. μ¦, LOADER_KERN_BASE
~ LOADER_KERN_BASE + mem_end
λ²μ λ΄μ 컀λ κ°μ μ£Όμμ λν entryκ° base_pml4
μ μ νκ² λλ€.pml4e_walk()
ν¨μλ va
λ₯Ό μΈμλ‘ λ°μ λ°©κΈμ κΉμ§ μ€λͺ
νλ 'walking'μ μ§ννλ€. LOADER_KERN_BASE
μ ν΄λΉνλ pml4 offset : 1
κ³Ό PD offset : 32
μ ν΄λΉνλ μνΈλ¦¬ 'κ²½λ‘'λ₯Ό μμμΌλ‘, μ¦κ°νλ μ£Όμμ λ°λΌ offsetμ΄ μ¦κ°νλ©΄μ walkingμ νκ² λ κ²μ΄λ€.
μ΄λ κ² λ§λ€μ΄μ§ base_pml4
λ, process λ³ pml4λ₯Ό μμ±νλ ν¨μ pml4_create()
μμ νμ©λλ€.
컀λ poolμμ λΉ νμ΄μ§ νλλ₯Ό ν λΉ λ°κ³ (νμ΄μ§ ν
μ΄λΈ μ체λ 컀λ μμμ μ μ₯λμ΄μΌ νλ€), κ·Έ νμ΄μ§ νλλ₯Ό μλ‘μ΄ pml4λ‘ μΌλλ€. κ·Έλ¦¬κ³ pml4μ κΈ°λ³Έ ν base_pml4
λ₯Ό κ·Έλλ‘ κ·Έ νμ΄μ§μ memcpy()
(볡μ¬) ν΄μ€λ€. νμ νμ΄μ§ ν
μ΄λΈμΈ PDPλ PDλ₯Ό 볡μ¬νμ§ μμλ λλ μ΄μ λ, μ΅μλ¨μΈ pml4μ μνΈλ¦¬λ§ κ±°μΉλ©΄, base_pml4
λ₯Ό λ§λ€λ μ΄λ―Έ 물리μ μΌλ‘ μ‘΄μ¬νκ² λ PDPλ PD κ°μ νμ νμ΄μ§ ν
μ΄λΈμ μ κ·Όν μ μκΈ° λλ¬Έμ΄λ€. κ·Έλ¬λ κ·Έ νμ΄μ§ ν
μ΄λΈκΉμ§ 볡μ¬ν νμκ° μλ€.
μ κ·Έλ¦Όμ pml4μ μμ±κ³Όμ μμ base_pml4
μ νμ©μ λν μ΄ν΄λ₯Ό λκΈ°μν΄ λ§λ€μ΄μ‘λ€. μ€μ λ‘λ pml4μ μΈλ±μ€ 0κ³Ό 1λ‘ μ μ μ 컀λμ μνΈλ¦¬κ° μ ννκ² λλμ§ μλλ€. pintosμμλ LOADER_KERN_BASE
λ―Έλ§μ μ£Όμλ λͺ¨λ μ μ μ κ°μ μ£ΌμλΌλ μ μκ° μκΈ° λλ¬Έμ, μλμ κ°μ offsetμ ν΄λΉνλ μ£Όμ μ΄νμ μνΈλ¦¬μ λν΄ λͺ¨λ μ μ κ°μ μ£ΌμλΌκ³ ν μ μμ κ²μ΄λ€.
μ΄μ¨λ μ΄λ κ² pml4_create()
λ₯Ό ν΅ν΄ νλ‘μΈμ€μ pml4λ₯Ό λ§λ€μ μλ€. pml4_create()
λ load()
κ³Όμ μμ λλ do_fork()
루ν΄μμ νΈμΆλλ€.
νΈμΆλ μ΄ν pml4μ μμμ£Όμλ κ·Έ νλ‘μΈμ€μ PCBμΈ μ€λ λ ꡬ쑰체μ λ©€λ² pml4μ λ±λ‘νλ€. μ΄ pml4λ pml4_create()
μ΄ λ°νλ μ΄ν λ¨μ κ³Όμ μ ν΅ν΄, μ μ κ° μ¬μ©ν λΆλΆμ ν΄λΉνλ μνΈλ¦¬ μ 보λ€λ‘ μ±μμ§ κ²μ΄λ€. λ¬Όλ‘ μ΄κ² λν νμ΄μ§ ν
μ΄λΈμ ꡬμ±νλ μμ
μ΄κΈ°μ 컀λμ΄ λ΄λΉνλ€. μ μ λ νμ΄μ§ ν
μ΄λΈμ μ λ μ κ·Όν μ μλ€λ μ μ λͺ
μ¬ν΄μΌ νλ€.
κ·Έλ¦¬κ³ νλ‘μΈμ€λ³λ‘ pml4λ₯Ό μμ±νμΌλ, νΉμ νλ‘μΈμ€κ° μ€νλ λλ κ·Έ νλ‘μΈμ€μ pml4λ₯Ό CR3 λ μ§μ€ν°μ loadν΄μ€μΌ ν κ²μ΄λ€. μ΄κ²μ μν ν¨μκ° pml4_activate()
μ΄λ€. (process_activate()
ν¨μ λ΄μμ νΈμΆ λλ€.)
load()
κ³Όμ μμ λλ do_fork()
루ν΄μμ pml4_create()
μ΄ν λ°λ‘ process_activate()
λ₯Ό ν΅ν΄ ν΄λΉ pml4λ₯Ό μ¬μ©νλ κ²μ μ μ μλ€. κ·Έλ¦¬κ³ νΉμ νλ‘μΈμ€κ° μ€νλλ κ²½μ°κ° ν κ°μ§ λ μλ€. μ€μΌμ€λ§μ μν΄ μ€ν νλ‘μΈμ€κ° λ°λ λμ΄λ€. κ·Έλμ schedule()
ν¨μλ₯Ό μ΄ν΄λ³΄λ©΄ process_activate(next)
νΈμΆμ ν΅ν΄ λ€μμΌλ‘ μ€νλ νλ‘μΈμ€ next
κ° κ°μ§ pml4λ₯Ό activate ν΄μ€λ€λ κ²μ μ μ μλ€.
μ΄μ λ¨μ건 μμ λ¨κ²¨λ νλμ μλ¬Έμ΄λ€.
λΉλ‘ μ΅μμ νμ΄μ§ ν μ΄λΈμΈ pml4λ§ λ³΅μ¬νκΈ΄ νμ§λ§,
μ κ΅³μ΄ νλ‘μΈμ€ λ³λ‘ 컀λ κ°μ μ£Όμ μ 보λ₯Ό 볡μ¬νλ κ²μΈκ°.
μμ€ν
μ½(system call) λλ¬Έμ΄λ€. μ§μ²΄μμ΄ write()
μμ€ν
μ½μ μ΄ν΄λ³΄μ.
컀λμ write()
λΌλ μ μ μ μμ²μ λνμ¬, μ μ buffer
μ λ΄μ©μ fd
μ ν΄λΉνλ open fileμ 'write' ν¨μΌλ‘μ¨ μμ²μ μ²λ¦¬νλ€. μ¬κΈ°μ μ μ buffer
μ λ΄μ©μ μ½κΈ° μν΄μλ buffer
μ£Όμλ₯Ό μμμΌ ν κ²μ΄λ€. κ·Έλ°λ° μ μ κ° λ겨주λ buffer
μ μ£Όμλ μ μ κ°μ μ£Όμμ΄λ€. λ§μ½ 컀λλͺ¨λμ μ§μ
ν λ λ§λ€ 컀λλ§μ΄ μ¬μ©ν μ μλ νΉλ³ν pml4λ₯Ό μ¬μ©νκ² λλ€λ©΄ μ΄λ¬ν μμ€ν
μ½μ μ²λ¦¬νλ λμμ΄ λΆνμνκ² λ³΅μ‘ν΄μ§ μ μλ€. λ°λΌμ κ° νλ‘μΈμ€κ° μμ ν pml4λ§λ€ 컀λ κ°μ μ£Όμμ λν μνΈλ¦¬λ₯Ό 볡μ¬ν΄μ€μΌλ‘μ¨, μ΄λ€ νλ‘μΈμ€μ μ€ν κ³Όμ μ μ μ λͺ¨λμμλ 컀λ λͺ¨λμμλ κ°μ pml4λ₯Ό μ¬μ©ν μ μκ² νλ€. μ΄λ κ² νλ©΄ μμ€ν
μ½μ΄ 'make sense' ν΄μ§λ€.
λλ² λ³΄κ³ κΆκΈνκ±° μμΌλ©΄ λ¬Όμ΄λ³΄λ¬ κ°λλλμ¬