🌌[Pintos] 3-1. VIRTUAL MEMORY

μ΄κ°•μš±Β·2022λ…„ 12μ›” 6일
8

🌌 Pintos

λͺ©λ‘ 보기
3/6
post-thumbnail

μ„Έ 번째 ν”„λ‘œμ νŠΈμ˜ 절반이 지났닀.
μ§§κ²Œλ‚˜λ§ˆ κ΅¬ν˜„ν•˜λ©΄μ„œ μ•Œκ²Œλœ 것을 남겨둔닀.

λ‚˜μ€‘μ— μžμ„Ένžˆ μ •λ¦¬ν•˜κ² μ§€λ§Œ, 가상메λͺ¨λ¦¬(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 ( 222^2 ) 인 32 bit μ»΄ν“¨ν„°μ—μ„œ ν•˜λ‚˜μ˜ νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ— λ“€μ–΄κ°ˆ 수 μžˆλŠ” μ—”νŠΈλ¦¬μ˜ κ°œμˆ˜λŠ” 1024개 ( 2102^{10} ) 이닀. ( 22βˆ—210=2122^{2} * 2^{10} = 2^{12} 즉, νŽ˜μ΄μ§€ ν•˜λ‚˜μ˜ 크기인 4 KiBκ°€ λœλ‹€.)
μƒμœ„ νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μΈ Page-DirectoryλŠ” 1024개의 μ—”νŠΈλ¦¬λ₯Ό κ°€μ§ˆ 수 있고, 각 μ—”νŠΈλ¦¬λŠ” ν•˜μœ„ νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ˜ μ‹œμž‘μ£Όμ†Œλ₯Ό λ‹΄κ³  μžˆμ„ 것이닀. ν•˜μœ„ νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μΈ Page-Table λ˜ν•œ 1024개의 PTEλ₯Ό κ°€μ§ˆ 수 μžˆλ‹€. κ·Έλ ‡λ‹€λ©΄ 총 κ°€λŠ₯ν•œ PTE의 κ°œμˆ˜κ°€ 2202^{20}κ°œκ°€ 되고, 이 PTE에 ν•΄λ‹Ήν•˜λŠ” νŽ˜μ΄μ§€ μ•ˆμ—μ„œμ˜ μ˜€ν”„μ…‹ λ˜ν•œ νŽ˜μ΄μ§€μ˜ λ°”μ΄νŠΈ 크기(4 KiB = 4096 Byte = 2122^{12}) 만큼 κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— κ²°κ΅­ κ°€λŠ₯ν•œ μ£Όμ†Œμ˜ κ°œμˆ˜λŠ” 220βˆ—212=2322^{20} * 2^{12} = 2^{32}κ°œκ°€ λœλ‹€.

ν•˜μ§€λ§Œ 64bit μ»΄ν“¨ν„°μ˜ λ“±μž₯으둜 νŽ˜μ΄μ§€ ν…Œμ΄λΈ” κ°œμˆ˜κ°€ 증가할 수 밖에 μ—†μ—ˆλ‹€. 이 쀑 48bit만 μ‚¬μš©ν•œλ‹€κ³  해도 νŽ˜μ΄μ§€ ν…Œμ΄λΈ”μ΄ 4λ‹¨κ³„μ˜ ꡬ성을 지녀야 ν•œλ‹€. μ΄μœ λŠ”, bit의 개수 μžμ²΄λ„ λŠ˜μ—ˆμ„ 뿐만 μ•„λ‹ˆλΌ 64bitμ—μ„œλŠ” μ£Όμ†Œκ°’ 자료의 크기가 8 Byte μ΄λ―€λ‘œ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” λ‹Ή μ—”νŠΈλ¦¬ κ°œμˆ˜κ°€ 512개 ( 292^{9} )둜 쀄어듀기 λ•Œλ¬Έμ΄λ‹€. κ²°κ΅­ 4λ‹¨κ³„μ˜ νŽ˜μ΄μ§€ ν…Œμ΄λΈ” ꡬ성을 톡해 총 κ°€λŠ₯ν•œ PTE의 κ°œμˆ˜κ°€ 29βˆ—29βˆ—29βˆ—29=2362^{9} * 2^{9} * 2^{9} * 2^{9} = 2^{36} κ°œκ°€ 되고, νŽ˜μ΄μ§€ μ˜€ν”„μ…‹ 개수 2122^{12} λ₯Ό κ³±ν•΄μ£Όλ©΄ κ°€λŠ₯ν•œ μ£Όμ†Œμ˜ κ°œμˆ˜λŠ” μ •ν™•νžˆ 236βˆ—212=2482^{36} * 2^{12} = 2^{48} κ°œκ°€ λœλ‹€.
κ·Έλž˜μ„œ 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ν•˜λŠ” '경둜' λ˜ν•œ ꡬ뢄될 수 μžˆλ‹€λŠ” 것이닀.

base_pml4


μ΄λ ‡κ²ŒκΉŒμ§€ μžμ„Ένžˆ λ“€μ—¬λ‹€ λ³Έ μ΄μœ λŠ” 각 ν”„λ‘œμ„ΈμŠ€κ°€ 고유둜 κ°€μ§€λŠ” 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' 해진닀.

profile
I think I think too much.

4개의 λŒ“κΈ€

comment-user-thumbnail
2022λ…„ 12μ›” 6일

λ‘λ²ˆ 보고 κΆκΈˆν•œκ±° 있으면 λ¬Όμ–΄λ³΄λŸ¬ κ°€λ„λ˜λ‚˜μ—¬

1개의 λ‹΅κΈ€
comment-user-thumbnail
2022λ…„ 12μ›” 6일

make sense

1개의 λ‹΅κΈ€