๋ ๋ฒ์งธ ํ๋ก์ ํธ๊ฐ ๋๋ฌ๋ค.
์ง๊ธ๊ณผ ๋์ค์ ์ดํด๋ฅผ ์ํด ๊ณผ์ ๋ฅผ ํ๋ฉด์ ์๊ฒ๋ ๊ฒ๋ค์ ๋จ๊ฒจ๋๋ค.
ํ๋ก์ธ์ค๋ "๋จธ์ (machine)์ ๋ํ ์ถ์ํ" ์ด๋ค.
์กฐ๊ธ ๋ ๊ตฌ์ฒด์ ์ผ๋ก๋ CPU / Memory / Storage๋ฅผ ๊ฐ์ง ์ปดํจํฐ์ ์ถ์ํ์ด๋ค. ์กฐ๊ธ ๋๋ ๊ตฌ์ฒด์ ์ผ๋ก๋ ๊ฐ ์์ฉํ๋ก๊ทธ๋จ์ด ์ด๋ฌํ ๋จธ์ ์ ์์์ ๋
์ ํด ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ๊ฐ์ ํ์(ํธํ ์ฐฉ๊ฐ)์ ์ ๊ณตํ๋ ์ถ์ํ์ด๋ค.
์ถ์ํ๋ ๋ํ ์ผ์ ์จ๊ธฐ๊ณ , ์ฌ์ฉํ๊ธฐ ์ฝ๊ฒ API๋ฅผ ์ ๊ณตํ๋ ๊ฒ.
ํ๋ก์ธ์ค๋ผ๋ ์ถ์ํ๋ฅผ ํตํด protection ๊ณผ isolation ์ด๋ผ๋ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๋ค.
ํด๋น ๋ชฉ์ ์ ํ๋์ ๋จธ์ ์ ์ฌ๋ฌ๊ฐ์ ์์ฉํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ํด์ ์ค์ ๋ ๊ฒ์ด๋ค.
๋ชฉ์ ๋ฌ์ฑ ๋ฐฉ๋ฒ : ์ ์ ํ๋ก๊ทธ๋จ์ด ๋จธ์ ์์์ ์ง์ ์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ ๋ง๋๋ค.
โก๏ธ ์ ์ ๋ชจ๋ / ์ปค๋ ๋ชจ๋์ ๊ตฌ๋ถ, ์ฌ์ ์ฃผ์๊ณต๊ฐ(๊ฐ ํ๋ก๊ทธ๋จ์ ์ฃผ์๊ณต๊ฐ์ ๊ตฌ๋ถ)
ํ๋ก์ ํธ 1๊น์ง์ ์ฝ๋๋ค์ ์ปค๋๊ณผ ํจ๊ป ์ปดํ์ผ ๋๋, ๋ง๊ทธ๋๋ก ์ปค๋ ๋์์ ์ผ๋ถ๋ฅผ ๊ตฌํํ ๊ฒ์ด์๋ค. ์ด๋ง์ธ ์ฆ์จ, ๋ชจ๋ ํ ์คํธ๋ค์ด ์ปค๋์ ์ผ๋ถ๋ก์ ์คํ๋๋ฉด์, ๋ชจ๋ ์์คํ ์์๊ณผ ์ธ์คํธ๋ญ์ ์ ์์ ๋กญ๊ฒ ์ฌ์ฉํ ์ ์์๋ค.
์ด๋ฒ ํ๋ก์ ํธ์ ํ ์คํธ๋ค์, ์ด๋ฌํ ๋ฌด์ ํ ์ ๊ทผ์ด ์ ํ๋๋ ์ ์ ํ๋ก๊ทธ๋จ์ผ๋ก์ ํํ ์ค์์ ์คํ๋๋ค. ์ ์ ํ๋ก๊ทธ๋จ๋ค์ ์ฌ๋ฌ๊ฐ๊ฐ ๋์์ ์คํ๋ ์ ์์ด์ผ ํ๊ณ , ํ๋ก๊ทธ๋จ ํ๋๋ ์์ ์ด ์์คํ ์์์ ์ ๋ถ๋ฅผ ํผ์ ์ฌ์ฉํ๋ค๊ณ ๊ฐ์ ํ ์ํ๋ก ์ง์ฌ์ก๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ํ๋ก์ธ์ค๋ผ๋ ์ถ์ํ๋ฅผ ์ ๊ณตํ ์ ์๋ ์ปค๋ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ๋ค. ๋ค์ ๋งํ์๋ฉด, ์ ์ ํ๋ก๊ทธ๋จ์ด ์์คํ ์์์ ์ ๊ทผํ ์ ์๋๋ก API๋ฅผ ๊ตฌํํ๋ ์์ ์ ํ ๊ฒ์ด๋ค.
ํ๋ก๊ทธ๋จ vs ํ๋ก์ธ์ค
- ํ๋ก๊ทธ๋จ์ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ํฉ์ณ์ง ๊ฒ. ํ๋ก๊ทธ๋จ์ ๋์คํฌ ์์ ๋ชฉ์ ํ์ผ๋ก์, ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ ์ธ๊ทธ๋จผํธ๋ก์ ์กด์ฌํ ์ ์๋ค.
- ํ๋ก์ธ์ค๋ ์คํ์ค์ ์๋ ํ๋ก๊ทธ๋จ์ ํน์ ์ฌ๋ก.
โถ ํ๋ก๊ทธ๋จ์ ํญ์ ์ด๋ค ํ๋ก์ธ์ค์ ์ปจํ ์คํธ ๋ด์์ ๋์๊ฐ๋ค.
๊ฐ์ฅ ๋จผ์ ๊ตฌํํ ๊ฒ์ argument passing์ด๋ค. ์์ ๊ฐ์ ์ํฉ์ ๋ง๋ค๊ธฐ ์ํด์๋ ์ด์จ๊ฑฐ๋ ์ ์ ํ๋ก๊ทธ๋จ์ ์คํํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ์ ์ ํ๋ก๊ทธ๋จ์ loadํ๊ณ , command line์ผ๋ก ๋ฐ์ argument ๋ค์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ ๊ณผ์ ์ ๋ค๋ค๋ค.
ํฐ ๊ทธ๋ฆผ์,
ํํ ์ค์์๋ ํ๋์ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ๊ฐ์ ์ค๋ ๋๋ฅผ ๊ฐ์ง ์ ์๋ค. ๋ฐ๋ผ์ ํ๋์ ํ๋ก์ธ์ค๋ ํ๋์ ์ปค๋ ์ค๋ ๋์ ๋งคํ๋๋ค.
๊ฐ์ฅ ์ฒ์ ํํ ์ค๊ฐ ๋ถํ
๋๋ ์์ ๋ถํฐ ์๊ธฐํด๋ณด์๋ฉด, ์ฐ๋ฆฌ๋ ํํ ์ค ์คํ์ ์ํด ์์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ ๊ฒ์ด๋ค. ๋ช
๋ น์ด๋ ๋๋ต์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ํฌ๋งท์ ๊ฐ๋๋ค.
pintos ${SCRIPT_COMMANDS} -- ${KERNEL_COMMANDS}
๊ฐ์ฅ ์ฒซ ํ
์คํธ์ธ 'args-single' ํ
์คํธ๋ฅผ ์ํด ์
๋ ฅํ ์ ์๋ ๋ช
๋ น์ด๋ ์๋์ ๊ฐ๋ค.
pintos --fs-disk=10 -p tests/userprog/args-single:args-single -- -q -f run 'args-single onearg'
run 'args-single onearg'
๋ผ๋ ์ปค๋งจ๋๋ฅผ ํตํด, 'args-single' ์ด๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง ์คํ ํ์ผ์ onearg ๋ผ๋ ํ๋์ ์ธ์๋ฅผ ์ ๋ฌํ์ฌ ์คํํ๋ค. ์ปค๋ ๋ด๋ถ ์ฝ๋์์๋ ๊ธฐ๋ณธ์ ์ธ ๋ถํ
์ดํ ํด๋น ์ปค๋งจ๋๋ฅผ ๊ทธ๋๋ก ์ ๋ฌ ์ ๋ฌํด์ ๊ฒฐ๊ตญ process_create_initd()
๋ผ๋ ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
ํ๋ก์ธ์ค์ ๋งคํ๋ ์ปค๋ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ , ์ค๋ ๋ ๋ฃจํด์ผ๋ก ์คํ ํ์ผ์ ๋ก๋ํ๋ ํจ์์ ํ์ผ์ ์ด๋ฆ์ ์ ๋ฌํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด, ์ด ์ค๋ ๋๊ฐ ์ค์ผ์ค ๋ ๋ค์, ์คํ ํ์ผ์ ๋ก๋ํ๊ณ ์คํ๋ ์ ์๋ค.
์์์ ์ธ๊ธํ ์ค๋ ๋๋ฅผ ์ค์ ๋ก ์์ฑํ๋ thread_create()
ํจ์๋ฅผ ๋ ์ดํด๋ณด์๋ฉด,
t = palloc_get_page (PAL_ZERO)
,init_thread ()
,t->tid = allocate_tid ()
, kernel_thread
, ์ค๋ ๋ ๋ฃจํด function
, ์ค๋ ๋ ๋ฃจํด์ ์ ๋ฌ๋ ํ๋์ ์ธ์ aux
๋ฅผ tf
(์ค๋ ๋ ๊ตฌ์กฐ์ฒด ๋ด๋ถ์ intr_frame
) ์ ์ ์ฅํ๋ค.init_thread ()
๋ด๋ถ๋ฅผ ๋ณด๋ฉด ์คํ์ ์ฃผ์๊ฐ ๋ค์ด๊ฐ๋ %rsp ๋ ์ง์คํฐ์ ์ปค๋ ์คํ์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ๊ฒ์ ์ ์ ์๋ค. t->tf.rsp = (uint64_t) t + PGSIZE - sizeof (void *)
์ ์ ํ๋ก๊ทธ๋จ์ ์คํํ์ผ์ด ๋ก๋๋๋ ๊ณผ์ ์์ฒด๋ ์ปค๋์ ์คํ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฐ ์์ผ๋ก intr_frame (์ฌ๊ธฐ์์๋ tf)๋ฅผ ์ค๋นํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
ํด๋น ์ค๋ ๋์ ๋ฃจํด์ธ initd()
ํจ์๋ฅผ ๋ณด๋ฉด process_exec()
๋ผ๋ ํจ์๊ฐ ์๋ค. ์ฌ๊ธฐ์์ code์ data์ ๋ํ ๊ฐ์์ฃผ์๋ฅผ ์ค์ ํ๋ ๊ณผ์ ๊ณผ ์ค์ ์คํํ์ผ์ ๋ก๋ํ๋ ๊ณผ์ load(file_name, &_if)
๊ฐ ํฌํจ๋์ด ์๋ค. ์ต์ข
์ ์ผ๋ก ํจ์ ๋ง์ง๋ง์ do_iret (&_if)
ํธ์ถ์ ํตํด ์ ์ ํ๋ก๊ทธ๋จ์ด ์ํธ๋ฆฌ ํจ์์์ ์์ํ๊ฒ ๋๋ค.
์์์ ์ธ๊ธํ, ์คํ ํ์ผ์ ๋ก๋ํ๋ ํจ์์ธ load()
ํจ์๋ฅผ ๋ ์ดํด๋ณด์๋ฉด, ์ ๋ฌ ๋ฐ์ file_name
์ ๊ฐ์ง๊ณ ํด๋น ํ์ผ์ ํ์ผ์์คํ
ํจ์๋ฅผ ํตํด open ํ ํ, ELF ํ์ผ ํฌ๋งท์ ๋ง๊ฒ ๋ก๋ํ๋ค. ํ์ด์ง ํ
์ด๋ธ ๋ํ ์ฌ๊ธฐ์ ์์ฑ๋๊ณ activate ๋๊ณ , ์ด ํจ์๊ฐ ๋ฐํ๋๊ณ ์คํ๋ do_iret (&_if)
์ ์ํด intr_frame
์ ์ค์ ํด ์ค๋ค.
setup_stack(if_)
์ผ๋ก ์ ์ ์คํ์ ์ค๋น (if_
์ rsp
๋ฉค๋ฒ๋ฅผ ์ ์ ์คํ ์ฃผ์๋ก ์ ์ฅ) ํ๊ณ , ์คํ ํ์ผ์ด ๊ฐ์ฅ ์ฒ์ ์คํํ ์์น์ธ ์ํธ๋ฆฌ ํจ์๋ฅผ ์ง์ ํด ์ค๋ค.(if_
์ rip
๋ฉค๋ฒ๋ฅผ ELF ํ์ผ ํค๋์ ์ ์ฅ๋ ์ํธ๋ฆฌ ์ ๋ณด ehdr.e_entry
๋ก ์ ์ฅ)
๊ทธ๋ฆฌ๊ณ ๋ฐ๋ก ์ฌ๊ธฐ์ ์ฐ๋ฆฌ์ ๋น๋ฉด ๊ณผ์ ์ธ argument passing์ ๊ตฌํํ๋ค. ์์ ์ธ์๋ฅผ ํ๋ก์ธ์ค์๊ฒ ์ ๋ฌํด์ ์คํํ๊ฒ ๋๋ค๊ณ ๊ณ์ ํํํ์๋๋ฐ, ์ด ์ ๋ฌ ๊ณผ์ ์ ๊ณง ์ ์ ์คํ์ ํด๋น ์ธ์๋ฅผ push ํด์ฃผ๋ ๊ฒ๊ณผ ๊ฐ๋ค. ์ด๋ push ํด์ฃผ๋ ํฌ๋งท์ calling convention์ ์ค์ํ๋ค. (ABI : Application Binary Interface)
์ ์ ํ๋ก๊ทธ๋จ์ call
๋ ํจ์์ ์คํ์์ ์ธ์๋ฅผ ํ์ธ ํ ๋, %rdi
, %rsi
, %rdx
, %rcx
, %r8
, %r9
๋ฅผ ์์๋๋ก ์ฌ์ฉํ๋ค. (์ฒซ๋ฒ์งธ ์ธ์๋ถํฐ ์ฌ์ฏ๋ฒ์งธ ์ธ์๊น์ง. ์ธ์๊ฐ ๋ ๋ง๋ค๋ฉด ์คํ์ ์ ์ฅํด๋๋ค.)
caller (ํด๋น ํ๋ก์์ ๋ฅผ ํธ์ถํ ํ๋ก์์ )๋ callee(ํธ์ถ๋๋ ํ๋ก์์ )๊ฐ ๋ฐํ๋ ๋ค์ ์ํ๋ ์ธ์คํธ๋ญ์
์ ์ฃผ์๋ฅผ ์คํ์ ์ ์ฅํ๊ณ , ํธ์ถํ ํ๋ก์์ ์ ์ฒซ ์ธ์คํธ๋ญ์
์ ์ฃผ์๋ก jump ํ๋ค. x86-64 call
์ธ์คํธ๋ญ์
ํ๋๋ก ์ด ๋๊ฐ์ง๊ฐ ๋์์ ์ํ๋ ์ ์๋ค.
callee ๊ฐ ์ํ๋๋ค.
callee ๊ฐ ๋ฆฌํด ๊ฐ์ด ์๋ ํ๋ก์์ ๋ผ๋ฉด, callee ๋ %rax
๋ ์ง์คํฐ์ ๊ทธ ๊ฐ์ ์ ์ฅํด ๋๋ค.
callee๋ ์๊น 2๋ฒ์์ ์ ์ฅ๋ ๋๋์๊ฐ ์ธ์คํธ๋ญ์
์ฃผ์(return address)๋ฅผ ์คํ์์ ๊บผ๋ด๊ณ , ๊ทธ ์ธ์คํธ๋ญ์
์ฃผ์๋ก jumpํ๋ค. x86-64 ret
์ธ์คํธ๋ญ์
์ผ๋ก ์ํ๋ ์ ์๋ค.
์ด๋ฌํ convention์ ๊ฐ์ง๊ณ ์ ์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ฅ ์ฒ์ ์คํ๋ ๋๋, ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ์ ๋ฌํ๋ ์ธ์์ ๊ฐ์๋ก (argc
), ๋๋ฒ์งธ ์ธ์๋ฅผ ๊ฐ ์ธ์๋ค์ด ์ ์ฅ๋ ์ฃผ์๊ฐ(ํฌ์ธํฐ)๊ฐ ๋ค์ด์๋ ๋ฐฐ์ด์ ์์ ์ฃผ์๋ก (argv
) ์ค์ ํ ํ, ์ํธ๋ฆฌ ํจ์๋ฅผ ์คํํ๊ฒ ๋๋ค.
์๊ธฐํด์ผ ํ ์ ์ ์ด ์ธ์๋ค์ด ์ค์ ๋ก ์ ์ฅ๋๋ ๊ณณ๊ณผ, ์ธ์๋ค์ ์ฃผ์๊ฐ ๋ฐฐ์ด์ด ์ ์ฅ๋๋ ๊ณณ ๋ชจ๋๊ฐ ์ ์ ์คํ์ด๋ผ๋ ์ ์ด๋ค. ์ฒซ๋ฒ์งธ ๊ทธ๋ฆผ์์ ๋ณด์ด๋ฏ, ์คํ์ ๋์์ฃผ์์๋ ์ค์ ์ธ์๊ฐ ์ ์ฅ๋๊ณ , ๋ฎ์ ์ฃผ์์๋ ๊ทธ ์ ์ฅ๋ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ด ์ ์ฅ๋จ์ ์ ์ ์๋ค. (์คํ์ ์์์ ์๋๋ก ์ปค์ง๋ค.)
์ฐ๋ฆฌ๊ฐ ๊ฒฐ๊ตญ argument passing์ ํ๋ค๋ ๊ฒ์, ์ปค๋งจ๋ ๋ผ์ธ์ผ๋ก ์ ๋ฌ๋ ์ธ์๋ค์ parsingํด์ convention์ ๋ง์ถฐ ์ ์ ์คํ์ ์ ์ฅํด ์ฃผ๋ ๊ฒ์ด๋ค. ์ดํ์ ์ ์ ํ๋ก๊ทธ๋จ์ด ์ ์์ ์ผ๋ก ์์๋ ์ ์๋ค.
์ด๋ฐ์์ ์ธ๊ธํ๋ฏ, ์ ์ ํ๋ก๊ทธ๋จ์ ์์คํ
์์์ ๋ง๋๋ก ์ ๊ทผํ ์ ์๋ค. ์ปค๋์ด ์ฌ๋ฌ๊ฐ์ ์ ์ ํ๋ก๊ทธ๋จ๋ค์ ์คํํ๊ณ ์๊ธฐ์, ์ ์ ํ๋ก๊ทธ๋จ์ ์ปค๋์ ์งํ์ ๋ฐ๋ผ์ผ ํ๋ค. ์ด๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ ์ ๋ชจ๋์ ์ปค๋ ๋ชจ๋๋ผ๋ ๊ตฌ๋ถ์ ํตํด, ์ ์ ๋ชจ๋์์ ์์คํ
์์ ์ ๊ทผ์ ๋ํ ์์ฒญ์ ํ๊ณ , ์ปค๋ ๋ชจ๋์์ ๊ทธ ์์ฒญ์ ์ฒ๋ฆฌํด์ค ํ, ์ ์ ๋ชจ๋๋ก ๋ณต๊ทํ๋ ์ผ๋ จ์ ๊ณผ์ ์ ํตํด ์คํ๋๋ค.
์ฌ๊ธฐ์์ ์์ฒญ์ด ๋ฐ๋ก ์์คํ
์ฝ์ ํด๋นํ๋ค.
๊ฐ์ฅ ๋จผ์ ์ ์ ๋ชจ๋์ ์ปค๋ ๋ชจ๋์ ๊ตฌ๋ถ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋ ์ง๋ฅผ ์ดํด๋ณด์.
X86 ์ํคํ ์ณ์ CPU๋ ํญ์ ํน์ ํ privilege level์์ ๋์ํ๋๋ก ์ค๊ณ๋์๋ค. ์ฆ, CPU๊ฐ ๋์ํ ํญ์ ํน์ ๋ชจ๋๋ฅผ ๊ฐ์ง๊ณ ๋์ํ๋ค๋ ์ด์ผ๊ธฐ์ด๋ค. ์ฐ๋ฆฌ๊ฐ ํ๋ ์ด์ผ๊ธฐ์ ์ ๋ชฉํด ๋ณด๋ฉด, ์ปค๋์ด CPU์ ์ฐํฉํ์ฌ ์ปค๋๋ชจ๋, ์ ์ ๋ชจ๋์ ๋์์ ๋ํ ์ ํ์ ํ๋ ๋งค์ปค๋์ฆ์ด ์ฌ์ฉ๋๋ค๋ ๊ฒ์ด๋ค. ํ๋์จ์ด์ ๋ณด์กฐ๋ฅผ ๋ฐ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
CPU์๋ ์ฐ์ฐ ์ํ์ ์ํ ๋ง์ instruction์ด ์ ์๋์ด ์์ ๊ฒ์ธ๋ฐ ์คํํ ์ ์๋ instruction์ Ring์ ๋ฐ๋ผ ์ ํ ์ํค๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด 100๊ฐ์ instruction์ด ์๋ค๊ณ ํ ๋, ๊ฑฐ๊ธฐ์ ๊ต์ฅํ ์กฐ์ฌํ ์ฌ์ฉ๋์ด์ผํ 5๊ฐ์ instruction์ด ์๋ค๊ณ ํ๋ค๋ฉด ๊ทธ 5๊ฐ๋ฅผ Ring0๋ก ์ ํ ์ ์๋ค. Ring0๋ฐ์์๋ ์ ๋ ์ฌ์ฉ๋์ด์๋ ์๋ ์ธ์คํธ๋ญ์ ๋ค์ด ์ ์ ๋ชจ๋์ ๊ฐ์ ์ํฉ์์ ์ฐ๊ฒ ๋๋ฉด ํฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋๋ฐ, ๊ทธ๋ฐ ์ํฉ์ ํ๋์จ์ด์ ์ผ๋ก ๋ณดํธํ๋ ๊ฒ์ด๋ค.
syscall
sysenter
instruction์ ์ด์ฉํด ํน๊ถ ๊ฒ์ฌ ์์ด Ring 0๋ก ์ด๋ํ ์ ๋ ์๊ณ , iret
sysret
sysexit
๋ฑ์ instruction์ ํตํด Ring 3๋ก ์ด๋ํ ์ ์๋ค. int
๋ช
๋ น์ด๋ฅผ ํตํด์๋ ๋จ์ํ level์ ์ด๋์ด ๋ถ๊ฐ๋ฅํ๊ณ ํ๋์ ๊ฒ์ฌ ๊ณผ์ ์ ๊ฑฐ์น ํ level์ ์ด๋์ํฌ ์ ์๋ค.
์ด์จ๋ ์ด๋ฌํ ํน๊ถ์, ํ์ฌ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ํน๊ถ์ ์ ์ฅํ๋ ์ผ๋ถ ์ ์ด ๋ ์ง์คํฐ๋ฅผ ํตํด ํํ๋ ์ ์๋ค. ํด๋น ๋ ์ง์คํฐ์๋ ๋ชจ๋ ๋นํธ๋ผ๋ ์ ๋ณด๊ฐ set ๋๋ค. ํํ ์ค์ ์ฝ๋์์๋ ์ฝ๋ ๊ณณ๊ณณ์ ํด๋น ๋ ์ง์คํฐ์ ๋ชจ๋ ๋นํธ๋ฅผ ์ ์ฅํ๋ ๋ถ๋ถ์ ํ์ธํ ์ ์๋ค.
โฌ๏ธ ์ ์ ํ๋ก๊ทธ๋จ์ ์คํํ๋ process_exec()
ํจ์๋, ์ ์ ๋ชจ๋์ ํด๋นํ๋ ๋ชจ๋ ๋นํธ๋ฅผ intr_frame
์ ์ค์ ํด ์ค๋ค.
โฌ๏ธ ์ปค๋ ์ค๋ ๋๋ฅผ ์์ฑํ๋ thread_create()
ํจ์์์๋, ๋ฐ๋๋ก ์ปค๋ ๋ชจ๋์ ํด๋นํ๋ ๋ชจ๋ ๋นํธ๋ฅผ intr_frame
์ ์ค์ ํด ์ค๋ค.
๋ค์ด์ด ์ค๋ช ํ๊ฒ ๋ ์ธํฐ๋ฝํธ์ ์์คํ ์ฝ์ ๋ํ ์ํธ๋ฆฌ ๊ณผ์ ์์๋ ํด๋น ๋ชจ๋ ๋นํธ๋ฅผ ์ค์ ํ๋ ๊ตฌ๊ฐ์ด ์กด์ฌํ๋ค(์ธ์คํธ๋ญ์ ์ํ ๋ด๋ถ ๋๋ ์ํธ๋ฆฌ ํจ์ ์์ ํฌํจ๋์ด ์๋ค).
์ด๋ฌํ ์ ์ ๋ชจ๋์ ์ปค๋ ๋ชจ๋์ ๊ตฌ๋ถ์ ํตํด, ์ปค๋์ protection ์ด๋ผ๋ ๋ชฉ์ ์ ๋ฌ์ฑํ ์ ์๊ฒ ๋๋ค.
์์คํ ์ฝ์ ์ฌ์ค ์ธํฐ๋ฝํธ์ ์ผ์ข ์ด๋ค. CSAPP์ ์ฉ์ด ์ฌ์ฉ์ ๋ฐ๋ฅด๋ฉด Exception์ ์ผ์ข ์ธ trap์ ํด๋นํ๋ ํ๋ฆ์ด๋ค. (ECF๋ ์ข๋ ๊ฐ๋ ์ ์ธ ์ฉ์ด๋ผ๊ณ ์ดํดํ๋ค.)
์ด๋ฌํ Exception ๋๋ ๊ฐ์์ค๋ฐ ํ๋ฆ์ ๋ณํ (ECF)๊ฐ ์ ํ์ํ ๊น. ECF์ ์ฒซ invention์, ์์ฉ ํ๋ก๊ทธ๋จ์ด ๋ฌดํ ๋ฃจํ์ ๋น ์ก์ ๋๋ฅผ ์ฒดํฌํ๊ธฐ ์ํด ์ด์์ฒด์ ๊ฐ ์ผ์ ๊ฐ๊ฒฉ์ผ๋ก ์ ์ด๋ฅผ ๋๊ฒจ๋ฐ์ ์ด๋ฅผ ํ์ธํ๋๋ก ํ๋ ๊ฒ์์๋ถํฐ ์์ํ๋ค. ํ์ด๋จธ ์ธํฐ๋ฝํธ๋ฅผ ํตํด ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค. ์ด์ฒ๋ผ, ์คํ๋๋ ํ๋ก๊ทธ๋จ์๋ ์์คํ ์ ๋ํ ๋ณ์๋ ์ํ ๋ณํ๊ฐ ํฌํจ๋์ง ์์๋ค. cpu๋ ๊ทธ์ ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ฅผ ๊ณ์ ์ฝ์ผ๋ฉฐ ์์ ์ ์ํํ ๋ฟ์ด๋ค. ๊ทธ๋์ cpu๊ฐ ์ค์ผ์ค๋ง์ ํ์ฉํ๋ ํ์ด๋จธ๋, ๋คํธ์ํฌ ํจํท์ ์ฒ๋ฆฌ๋, ๋์คํฌ ์ ์ถ๋ ฅ์ ์ฒ๋ฆฌ ๋ฑ๊ณผ ๊ฐ์ ์์คํ ์ํ์ ๋ํ ๋ฐ์์ ํ ์ ์๋ ํ๊ฒฝ์ ๋ง๋ค์ด ์ฃผ์ด์ผ ํ๋ค. ์ด๋ Exception์ด๋ผ๋, cpu์ ์์ ํ๋ฆ์ ๋ํ ๋๋ฐ์ ์ธ, ์์ธ์ ์ธ ์ํฉ์ด ๋ฐ์๋จ์ผ๋ก์จ ์คํ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ Exception์ด ๋ฐ์ํ์ ๋, cpu๋ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ handler ํจ์๋ฅผ ํตํด ํด๋น Exception์ ์ฒ๋ฆฌ(handle)ํ๋ค.
Exception์๋ ์์ ๊ฐ์ด 4๊ฐ์ง ์ข
๋ฅ๊ฐ ์๋ค.
์ธํฐ๋ฝํธ (Interrupt)
์ธํฐ๋ฝํธ๋ cpu ์ธ๋ถ์ ํ๋์จ์ด๊ฐ ๋ฐ์์ํจ๋ค. ํ๋ก์ ํธ 1์์ ๋ค๋ค๋ timer interrupt๊ฐ ์ด์ ํด๋นํ๋ค. ์ธํฐ๋ฝํธ๋ ๋น๋๊ธฐ(Async)์ ์ด๋ค. ํน์ ์ธ์คํธ๋ญ์
์ ์คํํด์ ๋ฐ์ํ ๊ฒ์ด ์๋๊ธฐ์, ๋ฌธ๋งฅ์ด ์กด์ฌํ์ง ์๊ณ , ๋ฐ๋ผ์ ๋๊ธฐํ๋ฅผ ์์ผ์ค ์๊ฐ ์๋ค. (์ธํฐ๋ฝํธ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด ์ค๊ฐ์ ๋ฉ์ถ ์ ์๋ค๋(์ ์ ๋ ์ ์๋ค๋) ์๋ฏธ์ด๋ค. ๋ฉ์ถ ์ ์๋ค๋ ๊ฒ์ ๋ฌธ๋งฅ์ ์ ์ฅํ๊ณ ์ดํ์ ๋ค์ ์คํํ๊ฒ ๋ค๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.)
ํธ๋ฉ (trap) : ์์คํ
์ฝ (system call)
ํธ๋ฉ์ ์๋์ ์ธ ์์ธ์ํฉ์ด๋ค. ์ด๋ค ์ธ์คํธ๋ญ์
์ ์คํํ ๊ฒฐ๊ณผ๋ก ๋ฐ์ํ๋ค. ๋ฐ๋ผ์ ๋๊ธฐํ๊ฐ ๊ฐ๋ฅํ๋ค. '์๋์ ์ธ' ์ด๋ผ๋ ํํ์์ ์ ์ ์๋ฏ, ํธ๋ฉ์ ์ ์ ํ๋ก๊ทธ๋จ์ด ๋ฐ์์์ผ ์ปค๋์๊ฒ ์ด๋ค ์ฒ๋ฆฌ๋ฅผ ์์ฒญํ ์ ์๊ฒ ํ๋ค. โก ์์คํ
์ฝ.
์ค๋ฅ (fault)
์ค๋ฅ๋ handler๊ฐ ์ ์ ํ ์ ์์ ๊ฐ๋ฅ์ฑ์ด ์๋ ์๋ฌ ์กฐ๊ฑด์ผ๋ก๋ถํฐ ๋ฐ์ํ๋ค. ๋ง์ฝ handler๊ฐ ํด๋น ์๋ฌ ์กฐ๊ฑด์ ์ ์ ํ ์ ์๋ค๋ฉด, ์ ์ ํ ํ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ ์ธ์คํธ๋ญ์
์ผ๋ก ๋๋ ค์ฃผ์ด ๊ฑฐ๊ธฐ์๋ถํฐ ์ฌ์คํํ๋ค. ์์ธ๊ฐ ๋ฐ์ํ ์ธ์คํธ๋ญ์
์ ๋ค์ ์ธ์คํธ๋ญ์
์ผ๋ก ๋์๊ฐ๊ฒ ๋๋ ์ธํฐ๋ฝํธ์ ํธ๋ฉ๊ณผ ์ฐจ์ด์ ์ด ์กด์ฌํ๋ ๊ฒ์ด๋ค. ๊ฐ์ฅ ์ ๋ช
ํ ์ค๋ฅ๋ก๋ page fault๊ฐ ์๋ค.
์ค๋จ (abort)
์ค๋จ์ ๋๊ฐ ํ๋์จ์ด์ ๊ฐ์ ๋ณต๊ตฌํ ์ ์๋ ์น๋ช
์ ์ธ ์๋ฌ์์ ๋ฐ์ํ๋ค. ์์ฉ ํ๋ก๊ทธ๋จ์ ์ข
๋ฃํจ์ผ๋ก์จ ์ฒ๋ฆฌ๋๋ค.
์ธํฐ๋ฝํธ, ์์ธ ๋ฑ์ ์ฉ์ด ์ฌ์ฉ์ ๋ํ ํต์ผ๋ ๊ท์ ์ด ์๋ค. ํ๋์จ์ด์์ ๋ฐ์ํ๋ ์์ธ์ ํ๋ฆ๊ณผ, ์ํํธ์จ์ด์์ ๋ฐ์ํ๋ ์์ธ์ ํ๋ฆ์ ๊ตฌ๋ถํ ์ ์์ผ๋ฉด ๋๋ค๊ณ ์ดํดํ๋ค.
์ฐธ๊ณ ๋ก C++์ด๋ JAVA์์ ์ฌ์ฉ๋๋Exception
์ ๋ค๋ฅธ ๋ ๋ฒจ์์์ ์์ธ์ฌํญ(์์ฉ ์์ค์ ECF)์ผ๋ก ์ดํดํด์ผ ํ๋ค.
์ฌ๊ธฐ์๋ถํฐ๋ ํธ์๋ฅผ ์ํด ๋ชจ๋ Exception์ '์ธํฐ๋ฝํธ'๋ก ๋ช ๋ช ํ๊ณ , ์ธํฐ๋ฝํธ(1๋ฒ)๋ฅผ ํ๋์จ์ด ์ธํฐ๋ฝํธ๋ก, 2๋ฒ(ํธ๋ฉ) / 3๋ฒ(์ค๋ฅ) / 4๋ฒ(์ค๋จ)์ ์ํํธ์จ์ด ์ธํฐ๋ฝํธ๋ก ํํํ๋ ค๊ณ ํ๋ค.
์ธํฐ๋ฝํธ๋ ๊ฐ๊ฐ์ ํน์ ๊ฒฝ์ฐ์ ๋ํ์ฌ vector๋ผ๋ ๊ณ ์ ๋ฒํธ๋ฅผ ๊ฐ์ง๋ค. ํ๋ก์ธ์๋ ์ด vector๋ฅผ ํตํด์ descriptor table๋ก ์ ๊ทผํ์ฌ ํด๋นํ๋ handler๋ฅผ ์ฐพ๊ณ ๊ทธ๋ฅผ ์คํํด ์ธํฐ๋ฝํธ๋ฅผ handleํ๋ค.
x86_64 ์ํคํ
์ณ์์ vector๋ 0๋ถํฐ 255๊น์ง (0x00 ~ 0xff) 256๊ฐ๊ฐ ์๋ค. ๋ฐ๋ผ์ 256๊ฐ์ ์ธํฐ๋ฝํธ ์ข
๋ฅ๊ฐ ์๋ค๊ณ ๋ณผ ์ ์๋ค. 0๋ถํฐ 31๊น์ง๋ (0x00 ~ 0x1f) ํ๋์จ์ด์ ์ผ๋ก (์ธํ
์์. ์ํคํ
์ฒ์์.) ์ ์๋๋ค. (๋ค๋ง ํํ ์ค์์๋ ์ด ํ๋์จ์ด ์ธํฐ๋ฝํธ๋ค์ด 32๋ถํฐ 47๊น์ง (0x20 ~ 0x2f)์ ํด๋น๋๋ค.) 32๋ถํฐ 255๊น์ง๋ (0x20 ~ 0xff) ์ปค๋ ์ค๊ณ์๊ฐ ์ ์ํ ์ ์๋๋ก ๋์ด ์๋ค.
์ ํต์ ์ธ x86 ์ํคํ
์ณ์์๋ ์์คํ
์ฝ์ด ์๋ณ vector๋ฅผ ๊ฐ์ง๋ ์ํํธ์จ์ด ์ธํฐ๋ฝํธ์ ์ผ์ข
์ผ๋ก์ ์ ์๋์๋ค (e.g. int 0x80 in linux). x86_64 ์ํคํ
์ณ์์๋ MSR(model specific register)๋ผ๋ ๋ ์ง์คํฐ์ ๋์์ ๋ฐ์ ๋ณ๋๋ก ์ฒ๋ฆฌ๋ ์ ์๊ฒ ๋์๋ค. x86_64 ์ํคํ
์ณ์์๋ syscall
์ด๋ผ๋ ์ธ์คํธ๋ญ์
์ ํตํด ์ํํธ์จ์ด ์ธํฐ๋ฝํธ์ ์ฒ๋ฆฌ ํ๋ฆ๊ณผ ๋ณ๊ฐ๋ก ์์คํ
์ฝ์ ํด๋นํ๋ ์์ธ์ํฉ์ ๋ฐ์ ์ํฌ ์ ์๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ์ข ๋ ๋นจ๋ฆฌ ์์คํ
์ฝ handler๋ฅผ ํธ์ถํ ์ ์๊ฒ ๋์๋ค.
์ธํฐ๋ฝํธ๋ ๋ง๊ทธ๋๋ก ๋ฐฉํด, cpu์ ์์
์ ๋ํ ์์ธ์ ์ธ ์ํฉ์ด๋ค. ๋ค์ ๋งํด, cpu๊ฐ ์๋ ํ๋ ์์
์ผ๋ก ๋์์ฌ ์ ์์ด์ผ ํ๋ค. ์๋ ํ๋ ์์
์ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ ๋น์์ ๋ ์ง์คํฐ์ ์ค๋
์ท์ผ๋ก ๊ธฐ์ต๋ ์ ์๋ค. ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด, cpu๋ ์๋์ ์ผ๋ก ๋น์์ ๋ ์ง์คํฐ ์ ๋ณด๋ค์ ์ปค๋ ์คํ์ ์ฐจ๋ก๋ก ์ ์ฅํ๋ค.
ํํ ์ค์์ ์ด ์ฐจ๋ก๋ฅผ ๋ฐ์ํ, ๋ ์ง์คํฐ ์ ๋ณด๋ฅผ ์ ์ฅํ ์ ์๋ ๊ตฌ์กฐ์ฒด๊ฐ ์ ์ธ๋์ด ์๋ค.
โก๏ธ intr_frame
: ์ธํฐ๋ฝํธ ํ๋ ์.
cpu๋ ss
๋ถํฐ rip
๊น์ง์ ํด๋นํ๋ ๋ ์ง์คํฐ ์ ๋ณด๋ฅผ ํด๋น ๋ฉค๋ฒ์ ์ ์ฅํ๋ค. (์คํ์ ์์์ ์๋๋ก ์ปค์ง๊ธฐ ๋๋ฌธ์, ์์ ๊ตฌ์กฐ์ฒด์ ๋ชจ์์ด ๊ฑฐ๊พธ๋ก ์คํ์ ์ ์ฅ๋๋ค๊ณ ์์ํ๋ฉด ๋๋ค. ์์ ๊ทธ๋ฆผ์์ Interrupt Stack์ด๋ผ๊ณ ๋ช
์๋ ์์ ๋ชจ์์ ์ฐธ๊ณ ํ์.) ๊ทธ๋ฆฌ๊ณ page fault์ ๊ฐ์ด error code๊ฐ ์กด์ฌํ๋ ์ธํฐ๋ฝํธ์ ๋ํด์๋ cpu๊ฐ error_code
์ ํด๋นํ๋ ์์น๊น์ง ์คํ์ ์ ๋ณด๋ฅผ ๋ฃ์ด์ค๋ค. ์ดํ์ vec_no
๋ถํฐ R
๋ฉค๋ฒ ์์ r15
๊น์ง์ ํด๋นํ๋ ๋ ์ง์คํฐ ์ ๋ณด๋ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๊ณ ์ธํฐ๋ฝํธ handler๊ฐ ์คํ๋๊ธฐ ์ด์ ์ ์คํ๋๋intrNN_stub
(NN์ ์ธํฐ๋ฝํธ vector์ ํด๋น) ํจ์์ intr_entry
ํจ์์์ ์ ์ฅํด์ค๋ค.
์ด๋ ๋ฏ ์คํ์ intr_frame
์ ๊ตฌ์กฐ์ ๋ง๊ฒ ์ ๋ณด๊ฐ ์ ์ฅ๋์์ ๋, ์คํ ํฌ์ธํฐ ๊ฐ์ %rdi
์ ์ ์ฅํ ํ handler ํจ์๋ฅผ ์คํํ๋ฉด, handler ํจ์์ ์ฒซ๋ฒ์งธ ์ธ์๋ก intr_frame
๊ตฌ์กฐ์ฒด์ ์์ ์ฃผ์๊ฐ ์ ๋ฌ๋๋ ๊ฒ๊ณผ ๊ฐ์ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค. ๊ฒฐ๊ตญ handler ํจ์๋ฅผ ์ํํ๋ฉด์ ๋ ์ง์คํฐ ์ ๋ณด(์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ ์์ ์ ๋ ์ง์คํฐ ์ ๋ณด)๋ฅผ ์ฝ์ ์ ์๊ฒ ๋๋ค.
๋ํ ์ธ์๋ก ๋ฐ์ intr_frame
๊ตฌ์กฐ์ฒด์ ํน์ ๊ฐ์ ์ด ํ handler ํจ์๊ฐ ๋ฐํํ๊ฒ ๋๋ฉด, ๊ทธ ํน์ ๊ฐ์ด ๋ฐ์๋ ์ํ๋ก ์๋์ ์คํ ํ๋ฆ์ผ๋ก ๋์๊ฐ ์๋ ์๋ค. ๋ค์ ๋งํด, ๋ ์ง์คํฐ ์ ๋ณด(์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ ์์ ์ ๋ ์ง์คํฐ ์ ๋ณด)์ ์ธ ์๋ ์๋ค. ์๋ฆฌ๋ ์๋์ ๊ณผ์ ์ ํตํด ์ดํดํ ์ ์๋ค.
์ธํฐ๋ฝํธ handler๊ฐ ๋ฐํ๋ ์ดํ์ intr_entry
์ธ์คํธ๋ญ์
์ ์ดํด๋ณด๋ฉด, ์ธ์๋ก ๋๊ฒจ ์ฃผ์๋ intr_frame
๊ตฌ์กฐ์ฒด ์ฆ ์คํ์ ์ ์ฅ๋์ด ์๋ intr_frame
๊ตฌ์กฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฝ์ด ๊ทธ ์ ๋ณด๋ฅผ ๊ฐ ๋ ์ง์คํฐ์ restore ํ๋ค. ๋จ, rip
๋ฐ๋ก ์ ์ง์ (error_code
)๊น์ง๋ง restore ํ ํ, iret
์ธ์คํธ๋ญ์
์ ์คํํ๋ค. ๊ทธ๋ฌ๋ฉด ๋๋จธ์ง ๋ ์ง์คํฐ ์ ๋ณด๋ค์ cpu๊ฐ ์๋์ ์ผ๋ก ๋ณต๊ตฌํ๊ณ %rip
๋ ์ง์คํฐ์ ์ ์ฅ๋ ์ฃผ์๋ก jumpํ์ฌ ์๋ ํ๋ ์์
(์ธ์คํธ๋ญ์
)์ ์ํํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก์ธ์ค๋ ์ผ์์ ์ผ๋ก ์ ์งํ๋ค.
์ ์ (preempt)๋๋ค : ์ผ์์ ์ผ๋ก ์ ์ง๋๋ค.
์ปจํ ์คํธ(context) : ์ปค๋์ด ์ ์ (์ผ์ ์ ์ง)๋ ํ๋ก์ธ์ค๋ฅผ ๋ค์ ์์ํ๊ธฐ ์ํด ํ์๋กํ๋ ์ํ โก๏ธ ์ฐ๋ฆฌ์ ๊ฒฝ์ฐintr_frame
์ผ๋ก ํํ๋๋ ๊ทธ๊ฒ.
์ค์ผ์ค(schedule)ํ๋ค : ์ด์ ์ ์ ์ (์ผ์ ์ ์ง)๋ ํ๋ก์ธ์ค๋ค ์ค ๋ค์ ์คํํ ํ๋ก์ธ์ค๋ฅผ ์ ํํ๋ค.
์์ argument passing ์์ ์ธ๊ธํ calling convention๊ณผ ์ ์ฌํ๊ฒ syscall ์ธ์คํธ๋ญ์ ์ ๋ํด์๋ convention์ด ์กด์ฌํ๋ค. ์ ์ ๊ฐ ์ปค๋์๊ฒ ์ด๋ ํ ์ฒ๋ฆฌ๋ฅผ ๋ถํํ ๋, ์ฒ๋ฆฌ์ ํ์ํ ์ธ์๋ฅผ ์ ๋ฌํด์ผ ํ ์ ์์ ๊ฒ์ด๋ค. ์ด๋ ๊ธฐ๋ณธ์ ์ธ calling convention์ ์ค์ํ์ง๋ง, ๋๊ฐ์ง ๋ค๋ฅธ ์ ์ด ์๋ค.
%rax
์ ์์คํ
์ฝ ๋ฒํธ๋ฅผ ์ ์ฅํด ๋๋ค.%rax
๋ ์ง์คํฐ์ ์ ์ฅํด ๋๋ค.%r10
์ ์ ์ฅํด ๋๋ค. ๊ธฐ์กด์ %rcx
๊ฐ ์๋๋ค.%rdi
, %rsi
, %rdx
, %rcx
, %r8
, %r9
์ ์์๊ฐ ์๋,%rdi
, %rsi
, %rdx
, %r10
, %r8
, %r9
์ ์์๋ก ์ธ์๊ฐ ์ ์ฅ๋๋ค.๊ทธ๋ฆฌ๊ณ ์์คํ
์ฝ์ ๋ํ ๋ฐํ๊ฐ์ ์ฌ์ ํ %rax
๋ ์ง์คํฐ์ ์ ์ฅ๋๋ค. ์์คํ
์ฝ์ด ๋ค ์ฒ๋ฆฌ๋๊ณ ์ ์ ๋ชจ๋๋ก ์ ํ๋๋ฉด ์ ์ ํ๋ก๊ทธ๋จ์ ์ด %rax
๋ ์ง์คํฐ์ ๊ฐ์ ์ฝ์ด ์์คํ
์ฝ์ ๋ํ ๋ฐํ๊ฐ์ ํ๋ํ๋ค.
๊ฐ ์์คํ
์ฝ (fork
, wait
, exec
)์ ๋ํ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์๊ฐ์, ์ง๋ฉด์ ๋ฌธ์ ๋ก ์ธ๊ธํ์ง ์์ผ๋ ค ํ๋ค. ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ํตํด ์ธํฐ๋ฝํธ์ ์์คํ
์ฝ์ ์ฒ๋ฆฌ ๋ฃจํด์ ์์ธํ ๋ณผ ์ ์์๋ค. ๋ํ ๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ค๋ CSAPP 3์ฅ์ ์ด์
๋ธ๋ฆฌ ์ธ์คํธ๋ญ์
๋ค๊ณผ ์นํด์ง ์ ์์๋ค.
๊ถ์์ง ๊ต์๋ OS ๊ฐ์ ์๋ฃ
CSAPP
https://stackoverflow.com/questions/5223813/how-does-the-kernel-know-if-the-cpu-is-in-user-mode-or-kenel-mode
https://statuesque-cover-3b0.notion.site/Project2-c3dfdeabf57c4ca891906bceca5a3dc3