PintOS. Virtual Memory ๊ตฌํ˜„ํ•˜๊ธฐ(Anonymous Page)

Moonยท2022๋…„ 12์›” 13์ผ
0

๐ŸŒป๊ตฌํ˜„ ์˜ˆ์ • ๋ฆฌ์ŠคํŠธ๐ŸŒผ
1. Memory Management
2. Anonymous Page
3. Stack Growth
4. Memory Mapped Files
5. Swap in/out


2. Anonymous Page(์ต๋ช…ํŽ˜์ด์ง€)

์ต๋ช…ํŽ˜์ด์ง€ : ํŒŒ์ผ(๋””์Šคํฌ) ๊ธฐ๋ฐ˜์ด ์•„๋‹Œ ์–ด๋–ค ํ•˜๋‚˜์˜ ์ด๋ฏธ์ง€ ๊ฐ™์€ non-disk ํŽ˜์ด์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ปค๋„๋กœ๋ถ€ํ„ฐ ํ• ๋‹น๋œ ํŽ˜์ด์ง€๋กœ์„œ, ์ต๋ช… ๋งตํ•‘์€ ๋ฐฑ์—… ํŒŒ์ผ์ด๋‚˜ ์žฅ์น˜๊ฐ€ ์—†๋‹ค. ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์™€ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๋Š” ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€์—์„œ load ๋˜๋Š” ๋ฐ˜๋ฉด, ์ต๋ช… ํŽ˜์ด์ง€๋Š” ์Šคํƒ๊ณผ ํž™์„ ํ• ๋‹นํ•ด์ค€๋‹ค. ์ต๋ช… ํŽ˜์ด์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ตฌ์กฐ์ฒด์ธ anon_page๋Š” anon.h์— ์„ ์–ธ๋˜์–ด ์žˆ๋‹ค. ๋˜ํ•œ struct page๋ฅผ ๋ณด๋ฉด, ํŽ˜์ด์ง€๊ฐ€ ์ต๋ช…ํŽ˜์ด์ง€์ธ ๊ฒฝ์šฐ๋ฅผ ์œ„ํ•ด struct anon_page anon์„ ๋ฉค๋ฒ„๋กœ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.

์ง€์—ฐ ๋กœ๋”ฉ์„ ํ™œ์šฉํ•œ ํŽ˜์ด์ง€ ์ดˆ๊ธฐํ™” : ์ง€์—ฐ ๋กœ๋”ฉ์€ ํ•„์š” ์‹œ์ ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋กœ๋”ฉ์„ ์ง€์—ฐ์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ํ• ๋‹น๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋Œ€์‘๋˜๋Š” ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋Š” ์žˆ์ง€๋งŒ ์—ฐ๊ฒฐ๋œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ”„๋ ˆ์ž„์ด ์•„์ง ์—†๊ณ  ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์‹ค์ œ ๋‚ด์šฉ๋“ค์ด ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ํ†ตํ•ด ์‹ค์ œ๋กœ ๋กœ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์‹œ๊ทธ๋„์„ ๋ฐ›์„ ๋•Œ ๋‚ด์šฉ๋“ค์ด ๋กœ๋“œ ๋  ๊ฒƒ์ด๋‹ค.
ํŽ˜์ด์ง€๋Š” 3๊ฐ€์ง€ ํƒ€์ž…์ด ์žˆ๊ณ , ๊ฐ ํŽ˜์ด์ง€ ํƒ€์ž… ๋ณ„๋กœ ์ดˆ๊ธฐํ™” ๋ฃจํ‹ด์ด ๋‹ค๋ฅด๋‹ค. high-level ๊ด€์ ์—์„œ ํŽ˜์ด์ง€ ์ดˆ๊ธฐํ™” ๊ณผ์ •์„ ๋ณด์ž.

  1. ์ปค๋„์ด ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด, vm_alloc_page_with_initializer๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ , ํŽ˜์ด์ง€ ํƒ€์ž…์— ๋งž๋Š” ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์„ธํŒ…ํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ œ์–ด๊ถŒ์„ ๋„˜๊ธด๋‹ค.
  2. ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ, ์ง€์—ฐ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ์ฝ˜ํ…์ธ ๊ฐ€ ์•„์ง ๋กœ๋“œ๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚œ๋‹ค. ์ด ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์—์„œ uninit_initialize๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ด์ „์— ์„ธํŒ…ํ•ด๋†“์€ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  3. ์ต๋ช… ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋Š” anon_initializer์ด๊ณ , ํŒŒ์ผ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋Š” file_backed_initializer๋‹ค.

ํŽ˜์ด์ง€๋Š” ์ดˆ๊ธฐํ™”->ํŽ˜์ด์ง€ํดํŠธ->์ง€์—ฐ๋กœ๋”ฉ->์Šค์™‘์ธ->์Šค์™‘์•„์›ƒ->โ€ฆ->์‚ญ์ œ๋ผ๋Š” ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ฐ–๋Š”๋‹ค. ํŽ˜์ด์ง€ ํƒ€์ž… ๋ณ„๋กœ ์ดˆ๊ธฐํ™” ๋ฐฉ๋ฒ•์ด ๋‹ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ, ์ƒ๋ช… ์ฃผ๊ธฐ์˜ ๊ฐ ์ƒํƒœ ๋ณ€์ด๋งˆ๋‹ค ํŽ˜์ด์ง€ ํƒ€์ž… ๋ณ„๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์‹œ์ €๊ฐ€ ์š”๊ตฌ๋œ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ ํŽ˜์ด์ง€ ํƒ€์ž… ๋ณ„๋กœ ๋‹ค๋ฅธ ์ƒํƒœ ๋ณ€์ด์˜ ๊ณผ์ •๋“ค์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.


3. ์‹คํ–‰๊ฐ€๋ŠฅํŒŒ์ผ์„ ์œ„ํ•œ ์ง€์—ฐ ๋กœ๋”ฉ

์ง€์—ฐ ๋กœ๋”ฉ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰์„ ์‹œ์ž‘ํ•  ๋•Œ, ๋‹น์žฅ ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํŒŒํŠธ๋งŒ ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œ๋œ๋‹ค. ์ง€์—ฐ ๋กœ๋”ฉ์€ ๋™์‹œ์— ๋ชจ๋“  ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฏธ์ง€๋“ค์„ ๋กœ๋“œํ•˜๋Š” ์ฆ‰์‹œ ๋กœ๋”ฉ๋ณด๋‹ค ์ƒ๋Œ€์ ์œผ๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.
์ง€์—ฐ ๋กœ๋”ฉ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ VM_UNINIT๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŽ˜์ด์ง€ ํƒ€์ž…์ด ์žˆ๋‹ค. ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์€ ์ดˆ๊ธฐ์— VM_UNINIT ํƒ€์ž…์˜ ํŽ˜์ด์ง€๋กœ ์ƒ์„ฑ๋œ๋‹ค.

enum vm_type {
	/* page not initialized */
	VM_UNINIT = 0,
	/* page not related to the file, aka anonymous page */
	VM_ANON = 1,
	/* page that realated to the file */
	VM_FILE = 2,
	/* page that hold the page cache, for project 4 */
	VM_PAGE_CACHE = 3,

	/* Bit flags to store state */

	/* Auxillary bit flag marker for store information. You can add more
	 * markers, until the value is fit in the int. */
	VM_MARKER_0 = (1 << 3),
	VM_MARKER_1 = (1 << 4),

	/* DO NOT EXCEED THIS VALUE. */
	VM_MARKER_END = (1 << 31),
};

uninit_page ๊ตฌ์กฐ์ฒด๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋“ค์„ ์œ„ํ•œ ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑ, ์ดˆ๊ธฐํ™”, ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ include/vm/uninit.c์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด, ํŽ˜์ด์ง€ ํดํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” vm_try_handle_fault ํ•จ์ˆ˜์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋„˜๊ธด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์œ ํšจํ•œ ํŽ˜์ด์ง€ ํดํŠธ์ธ์ง€๋ฅผ ์šฐ์„  ๊ฒ€์‚ฌํ•œ๋‹ค. ์ด ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์€ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•œ ํดํŠธ๋ผ๋ฉด ์œ ํšจํ•œ ํŽ˜์ด์ง€ ํดํŠธ์ผ ๊ฒƒ์ด๋‹ค. ๊ทธ๊ฒŒ ์•„๋‹Œ bogus ํดํŠธ๋ผ๋ฉด ํŽ˜์ด์ง€์—์„œ ์ฝ˜ํ…์ธ ๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ œ์–ด๊ถŒ์„ ๋ฐ˜ํ™˜ํ•ด์•ผํ•œ๋‹ค.
โ†’ bogus fault : ๋ฌผ๋ฆฌ๋ฉ”๋ชจ๋ฆฌ์™€ ๋งตํ•‘๋˜์–ด ์žˆ์ง€๋งŒ ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ ๋˜์–ด ์žˆ์ง€ ์•Š์€ ๊ฒฝ์šฐ
โ†’ ๋งตํ•‘์ด ์•ˆ๋œ ๊ฑฐ๋ฉด valid page fault, ๋งตํ•‘์€ ๋˜์–ด์žˆ๋Š”๋ฐ ์ฝ˜ํ…์ธ ๊ฐ€ ๋กœ๋“œ๊ฐ€ ์•ˆ๋œ ๊ฑฐ๋ฉด bogus fault

Bogus ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋Š” 3๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ง€์—ฐ ๋กœ๋”ฉ ํŽ˜์ด์ง€, ์Šค์™‘ ์•„์›ƒ ํŽ˜์ด์ง€, ์“ฐ๊ธฐ ๋ณดํ˜ธ ํŽ˜์ด์ง€. ์ง€๊ธˆ์€ ์ฒซ ๋ฒˆ์งธ ์ผ€์ด์Šค์ธ ์ง€์—ฐ ๋กœ๋“œ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด์„œ๋งŒ ์ƒ๊ฐํ•ด๋ณด์ž. ๋งŒ์•ฝ ์ง€์—ฐ ๋กœ๋”ฉ ๋•Œ๋ฌธ์— ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด, ์ปค๋„์€ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ง€์—ฐ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด vm_alloc_page_with_initializer ํ•จ์ˆ˜์—์„œ ์„ธํŒ…ํ•ด ๋†“์€ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. userprog/process.c์— ์žˆ๋Š” lazy_load_segment ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

bool vm_alloc_page_with_initializer (enum vm_type type, void *upage,
		bool writable, vm_initializer *init, void *aux);

Userprog/process.c ์— ์žˆ๋Š” load_segment์™€ lazy_load_segment๋ฅผ ๊ตฌํ˜„ํ•ด๋ผ. ์‹คํ–‰ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋กœ๋“œ ๋˜๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•ด๋ผ. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์€ ์ง€์—ฐ ๋กœ๋“œ๋  ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ด ํŽ˜์ด์ง€๋“ค์— ๋ฐœ์ƒํ•œ page fault๋ฅผ ์ปค๋„์ด ๋‹ค๋ฃฐ ๊ฒƒ์ด๋‹ค.
Program loader์˜ ํ•ต์‹ฌ์ธ userprog/process.c์˜ load_segment loop ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. ๋ฃจํ”„๋ฅผ ๋Œ ๋•Œ๋งˆ๋‹ค load_segment๋Š” ๋Œ€๊ธฐ ์ค‘์ธ ํŽ˜์ด์ง€ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” vm_alloc_page_with _initializer๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ˆœ๊ฐ„์€ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์‹ค์ œ๋กœ ํŒŒ์ผ์—์„œ ๋กœ๋“œ๋  ๋•Œ๋‹ค.
โ†’ bool load_segment() : ํ˜„์žฌ ์ฝ”๋“œ๋Š” ๋ฉ”์ธ ๋ฃจํ”„ ์•ˆ์—์„œ ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ฝ์„ ๋ฐ”์ดํŠธ์˜ ์ˆ˜์™€ 0์œผ๋กœ ์ฑ„์›Œ์•ผ ํ•  ๋ฐ”์ดํŠธ์˜ ์ˆ˜๋ฅผ ์ธก์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ๋Œ€๊ธฐ ์ค‘์ธ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” vm_alloc_page_with_initializer ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ํ•จ์ˆ˜์—๊ฒŒ ์ œ๊ณตํ•  aux ์ธ์ž๋กœ์จ, ๋ณด์กฐ ๊ฐ’๋“ค์„ ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ์„ ๋กœ๋“œํ•  ๋•Œ ํ•„์ˆ˜์ ์ธ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
โ†’ bool lazy_load_segment() : load_segment ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ vm_alloc_page_with_initializer์˜ ๋„ค ๋ฒˆ์งธ ์ธ์ž๊ฐ€ lazy_load_segment๋ผ๋Š” ๊ฒƒ์„ ์•Œ์•„์ฐจ๋ ธ์„ ๊ฒƒ์ด๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํŒŒ์ผ์˜ ํŽ˜์ด์ง€๋“ค์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ํ•จ์ˆ˜์ด๊ณ  page fault๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ˜ธ์ถœ๋œ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด์™€ aux๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š”๋‹ค. aux๋Š” load_segment์—์„œ ๋‹น์‹ ์ด ์„ค์ •ํ•˜๋Š” ์ •๋ณด๋‹ค. ์ด ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ฝ์„ ํŒŒ์ผ์„ ์ฐพ๊ณ  ์ตœ์ข…์ ์œผ๋กœ๋Š” ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด์•ผํ•œ๋‹ค.
์Šคํƒ ํ• ๋‹น๋ถ€๋ถ„์ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก userprog/process.c์— ์žˆ๋Š” setup_stack์„ ์ˆ˜์ •ํ•ด์•ผํ•œ๋‹ค. ์ฒซ ์Šคํƒ ํŽ˜์ด์ง€๋Š” ์ง€์—ฐ์ ์œผ๋กœ ํ• ๋‹น๋  ํ•„์š”๊ฐ€ ์—†๋‹ค. ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๊ธฐ๋‹ค๋ฆด ํ•„์š”์—†์ด ๊ทธ๊ฒƒ(์Šคํƒ ํŽ˜์ด์ง€)์„ ๋กœ๋“œ๋  ๋•Œ ์ปค๋งจ๋“œ ๋ผ์ธ์˜ ์ธ์ž๋“ค๊ณผ ํ•จ๊ป˜ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์‹ ์€ ์Šคํƒ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์•ผํ•œ๋‹ค. ๋‹น์‹ ์€ vm/vm.h์˜ vm_type์— ์žˆ๋Š” ๋ณด์กฐ marker(VM_MARKER_0)๋“ค์„ ํŽ˜์ด์ง€๋ฅผ ๋งˆํ‚นํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์ตœ์ข…์ ์œผ๋กœ spt_find_page๋ฅผ ๊ฑฐ์ณ spt๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ fault๋œ ์ฃผ์†Œ์— ๋Œ€์‘ํ•˜๋Š” ํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜ vm_try_handle_fault๋ฅผ ์ˆ˜์ •ํ•ด๋ผ.

profile
์•ˆ๋…•ํ•˜์„ธ์š”. Moon์ž…๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€