๐ŸŒŒ[Pintos] 2. USER PROGRAMS

์ด๊ฐ•์šฑยท2022๋…„ 11์›” 28์ผ
5

๐ŸŒŒ Pintos

๋ชฉ๋ก ๋ณด๊ธฐ
2/6
post-thumbnail

๋‘ ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋๋‚ฌ๋‹ค.
์ง€๊ธˆ๊ณผ ๋‚˜์ค‘์˜ ์ดํ•ด๋ฅผ ์œ„ํ•ด ๊ณผ์ œ๋ฅผ ํ•˜๋ฉด์„œ ์•Œ๊ฒŒ๋œ ๊ฒƒ๋“ค์„ ๋‚จ๊ฒจ๋‘”๋‹ค.

Process

ํ”„๋กœ์„ธ์Šค๋Š” "๋จธ์‹ (machine)์— ๋Œ€ํ•œ ์ถ”์ƒํ™”" ์ด๋‹ค.
์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” CPU / Memory / Storage๋ฅผ ๊ฐ€์ง„ ์ปดํ“จํ„ฐ์˜ ์ถ”์ƒํ™”์ด๋‹ค. ์กฐ๊ธˆ ๋”๋” ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ๊ฐ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์ด๋Ÿฌํ•œ ๋จธ์‹ ์˜ ์ž์›์„ ๋…์ ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์€ ํ™˜์ƒ(ํŽธํ•œ ์ฐฉ๊ฐ)์„ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™”์ด๋‹ค.

์ถ”์ƒํ™”๋Š” ๋””ํ…Œ์ผ์„ ์ˆจ๊ธฐ๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฝ๊ฒŒ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ.

ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด protection ๊ณผ isolation ์ด๋ผ๋Š” ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•ด๋‹น ๋ชฉ์ ์€ ํ•˜๋‚˜์˜ ๋จธ์‹ ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์„ค์ •๋œ ๊ฒƒ์ด๋‹ค.

๋ชฉ์  ๋‹ฌ์„ฑ ๋ฐฉ๋ฒ• : ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ๋จธ์‹  ์ž์›์— ์ง์ ‘์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š”๋‹ค.
โžก๏ธ ์œ ์ € ๋ชจ๋“œ / ์ปค๋„ ๋ชจ๋“œ์˜ ๊ตฌ๋ถ„, ์‚ฌ์  ์ฃผ์†Œ๊ณต๊ฐ„(๊ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฃผ์†Œ๊ณต๊ฐ„์„ ๊ตฌ๋ถ„)

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

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ŠคํŠธ๋“ค์€, ์ด๋Ÿฌํ•œ ๋ฌด์ œํ•œ ์ ‘๊ทผ์ด ์ œํ•œ๋˜๋Š” ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ์„œ ํ•€ํ† ์Šค์—์„œ ์‹คํ–‰๋œ๋‹ค. ์œ ์ € ํ”„๋กœ๊ทธ๋žจ๋“ค์€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ , ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜๋Š” ์ž์‹ ์ด ์‹œ์Šคํ…œ ์ž์›์˜ ์ „๋ถ€๋ฅผ ํ˜ผ์ž ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ ์ƒํƒœ๋กœ ์งœ์—ฌ์กŒ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ์ปค๋„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ–ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ž๋ฉด, ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์Šคํ…œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ž‘์—…์„ ํ•œ ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ๊ทธ๋žจ vs ํ”„๋กœ์„ธ์Šค

  • ํ”„๋กœ๊ทธ๋žจ์€ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•ฉ์ณ์ง„ ๊ฒƒ. ํ”„๋กœ๊ทธ๋žจ์€ ๋””์Šคํฌ ์ƒ์— ๋ชฉ์ ํŒŒ์ผ๋กœ์„œ, ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ์„ธ๊ทธ๋จผํŠธ๋กœ์„œ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰์ค‘์— ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ํŠน์ • ์‚ฌ๋ก€.

โ–ถ ํ”„๋กœ๊ทธ๋žจ์€ ํ•ญ์ƒ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค์˜ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ๋Œ์•„๊ฐ„๋‹ค.

Argument Passing

๊ฐ€์žฅ ๋จผ์ € ๊ตฌํ˜„ํ•œ ๊ฒƒ์€ argument passing์ด๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด์จ‹๊ฑฐ๋‚˜ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์„ loadํ•˜๊ณ , command line์œผ๋กœ ๋ฐ›์€ argument ๋“ค์„ ํ”„๋กœ๊ทธ๋žจ์— ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค๋ค˜๋‹ค.


ํฐ ๊ทธ๋ฆผ์€,

  1. ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์„ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋กœ์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ทธ ํ”„๋กœ์„ธ์Šค์˜ PCB ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ,
  2. ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํ™˜๊ฒฝ์„ ์„ค์ •ํ•ด ์ฃผ๊ณ ,
  3. ํ•ด๋‹น๋˜๋Š” ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋ชฉ์  ํŒŒ์ผ์„ ๋กœ๋“œํ•œ ํ›„,
  4. argument๋ฅผ parsing ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์ „๋‹ฌํ•œ ํ›„ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

ํ•€ํ† ์Šค์—์„œ๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ํ•˜๋‚˜์˜ ์ปค๋„ ์Šค๋ ˆ๋“œ์— ๋งคํ•‘๋œ๋‹ค.

booting

๊ฐ€์žฅ ์ฒ˜์Œ ํ•€ํ† ์Šค๊ฐ€ ๋ถ€ํŒ…๋˜๋Š” ์‹œ์ ๋ถ€ํ„ฐ ์–˜๊ธฐํ•ด๋ณด์ž๋ฉด, ์šฐ๋ฆฌ๋Š” ํ•€ํ† ์Šค ์‹คํ–‰์„ ์œ„ํ•ด ์‰˜์— ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•  ๊ฒƒ์ด๋‹ค. ๋ช…๋ น์–ด๋Š” ๋Œ€๋žต์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํฌ๋งท์„ ๊ฐ–๋Š”๋‹ค.
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()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.

process_create_initd()

ํ”„๋กœ์„ธ์Šค์— ๋งคํ•‘๋  ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์Šค๋ ˆ๋“œ ๋ฃจํ‹ด์œผ๋กœ ์‹คํ–‰ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ํ•จ์ˆ˜์™€ ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ „๋‹ฌํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด, ์ด ์Šค๋ ˆ๋“œ๊ฐ€ ์Šค์ผ€์ค„ ๋œ ๋‹ค์Œ, ์‹คํ–‰ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

thread_create()


์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ์Šค๋ ˆ๋“œ๋ฅผ ์‹ค์ œ๋กœ ์ƒ์„ฑํ•˜๋Š” thread_create() ํ•จ์ˆ˜๋ฅผ ๋” ์‚ดํŽด๋ณด์ž๋ฉด,

  1. ์Šค๋ ˆ๋“œ๊ฐ€ ์‚ฌ์šฉํ•  ์ฃผ์†Œ๊ณต๊ฐ„์„ ํ• ๋‹น ๋ฐ›๊ณ  t = palloc_get_page (PAL_ZERO),
  2. ์Šค๋ ˆ๋“œ์˜ ์ •๋ณด๋“ค์„ ์ดˆ๊ธฐํ™” ํ•˜๊ณ  init_thread (),
  3. ์Šค๋ ˆ๋“œ์˜ ์‹๋ณ„๋ฒˆํ˜ธ tid๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ  t->tid = allocate_tid (),
  4. ์—”ํŠธ๋ฆฌ ํ•จ์ˆ˜ kernel_thread, ์Šค๋ ˆ๋“œ ๋ฃจํ‹ด function, ์Šค๋ ˆ๋“œ ๋ฃจํ‹ด์— ์ „๋‹ฌ๋  ํ•˜๋‚˜์˜ ์ธ์ž aux๋ฅผ tf(์Šค๋ ˆ๋“œ ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์˜ intr_frame) ์— ์ €์žฅํ•œ๋‹ค.

init_thread () ๋‚ด๋ถ€๋ฅผ ๋ณด๋ฉด ์Šคํƒ์˜ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” %rsp ๋ ˆ์ง€์Šคํ„ฐ์— ์ปค๋„ ์Šคํƒ์˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. t->tf.rsp = (uint64_t) t + PGSIZE - sizeof (void *)
์œ ์ € ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ํŒŒ์ผ์ด ๋กœ๋“œ๋˜๋Š” ๊ณผ์ • ์ž์ฒด๋Š” ์ปค๋„์˜ ์‹คํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฐ ์‹์œผ๋กœ intr_frame (์—ฌ๊ธฐ์—์„œ๋Š” tf)๋ฅผ ์ค€๋น„ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

process_exec()


ํ•ด๋‹น ์Šค๋ ˆ๋“œ์˜ ๋ฃจํ‹ด์ธ initd() ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด process_exec() ๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ code์™€ data์— ๋Œ€ํ•œ ๊ฐ€์ƒ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ณผ์ •๊ณผ ์‹ค์ œ ์‹คํ–‰ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๊ณผ์ • load(file_name, &_if)๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ํ•จ์ˆ˜ ๋งˆ์ง€๋ง‰์— do_iret (&_if) ํ˜ธ์ถœ์„ ํ†ตํ•ด ์œ ์ €ํ”„๋กœ๊ทธ๋žจ์ด ์—”ํŠธ๋ฆฌ ํ•จ์ˆ˜์—์„œ ์‹œ์ž‘ํ•˜๊ฒŒ ๋œ๋‹ค.

load()


์œ„์—์„œ ์–ธ๊ธ‰ํ•œ, ์‹คํ–‰ ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ํ•จ์ˆ˜์ธ 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)

calling convention

  1. ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ call๋œ ํ•จ์ˆ˜์˜ ์‹คํ–‰์—์„œ ์ธ์ž๋ฅผ ํ™•์ธ ํ•  ๋•Œ, %rdi, %rsi, %rdx, %rcx, %r8, %r9 ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์‚ฌ์šฉํ•œ๋‹ค. (์ฒซ๋ฒˆ์งธ ์ธ์ž๋ถ€ํ„ฐ ์—ฌ์„ฏ๋ฒˆ์งธ ์ธ์ž๊นŒ์ง€. ์ธ์ž๊ฐ€ ๋” ๋งŽ๋‹ค๋ฉด ์Šคํƒ์— ์ €์žฅํ•ด๋‘”๋‹ค.)

  2. caller (ํ•ด๋‹น ํ”„๋กœ์‹œ์ €๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ์‹œ์ €)๋Š” callee(ํ˜ธ์ถœ๋˜๋Š” ํ”„๋กœ์‹œ์ €)๊ฐ€ ๋ฐ˜ํ™˜๋œ ๋‹ค์Œ ์ˆ˜ํ–‰๋  ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์ฃผ์†Œ๋ฅผ ์Šคํƒ์— ์ €์žฅํ•˜๊ณ , ํ˜ธ์ถœํ•œ ํ”„๋กœ์‹œ์ €์˜ ์ฒซ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ์ฃผ์†Œ๋กœ jump ํ•œ๋‹ค. x86-64 call ์ธ์ŠคํŠธ๋Ÿญ์…˜ ํ•˜๋‚˜๋กœ ์ด ๋‘๊ฐ€์ง€๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

  3. callee ๊ฐ€ ์ˆ˜ํ–‰๋œ๋‹ค.

  4. callee ๊ฐ€ ๋ฆฌํ„ด ๊ฐ’์ด ์žˆ๋Š” ํ”„๋กœ์‹œ์ €๋ผ๋ฉด, callee ๋Š” %rax ๋ ˆ์ง€์Šคํ„ฐ์— ๊ทธ ๊ฐ’์„ ์ €์žฅํ•ด ๋‘”๋‹ค.

  5. callee๋Š” ์•„๊นŒ 2๋ฒˆ์—์„œ ์ €์žฅ๋œ ๋˜๋Œ์•„๊ฐˆ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ฃผ์†Œ(return address)๋ฅผ ์Šคํƒ์—์„œ ๊บผ๋‚ด๊ณ , ๊ทธ ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์ฃผ์†Œ๋กœ jumpํ•œ๋‹ค. x86-64 ret ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ convention์„ ๊ฐ€์ง€๊ณ  ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ๊ฐ€์žฅ ์ฒ˜์Œ ์‹คํ–‰๋  ๋•Œ๋Š”, ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•˜๋Š” ์ธ์ž์˜ ๊ฐœ์ˆ˜๋กœ (argc), ๋‘๋ฒˆ์งธ ์ธ์ž๋ฅผ ๊ฐ ์ธ์ž๋“ค์ด ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ’(ํฌ์ธํ„ฐ)๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๋ฐฐ์—ด์˜ ์‹œ์ž‘ ์ฃผ์†Œ๋กœ (argv) ์„ค์ •ํ•œ ํ›„, ์—”ํŠธ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.

์ƒ๊ธฐํ•ด์•ผ ํ•  ์ ์€ ์ด ์ธ์ž๋“ค์ด ์‹ค์ œ๋กœ ์ €์žฅ๋˜๋Š” ๊ณณ๊ณผ, ์ธ์ž๋“ค์˜ ์ฃผ์†Œ๊ฐ’ ๋ฐฐ์—ด์ด ์ €์žฅ๋˜๋Š” ๊ณณ ๋ชจ๋‘๊ฐ€ ์œ ์ € ์Šคํƒ์ด๋ผ๋Š” ์ ์ด๋‹ค. ์ฒซ๋ฒˆ์งธ ๊ทธ๋ฆผ์—์„œ ๋ณด์ด๋“ฏ, ์Šคํƒ์˜ ๋†’์€์ฃผ์†Œ์—๋Š” ์‹ค์ œ ์ธ์ž๊ฐ€ ์ €์žฅ๋˜๊ณ , ๋‚ฎ์€ ์ฃผ์†Œ์—๋Š” ๊ทธ ์ €์žฅ๋œ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋จ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. (์Šคํƒ์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ปค์ง„๋‹ค.)

์šฐ๋ฆฌ๊ฐ€ ๊ฒฐ๊ตญ argument passing์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์€, ์ปค๋งจ๋“œ ๋ผ์ธ์œผ๋กœ ์ „๋‹ฌ๋œ ์ธ์ž๋“ค์„ parsingํ•ด์„œ convention์— ๋งž์ถฐ ์œ ์ € ์Šคํƒ์— ์ €์žฅํ•ด ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค. ์ดํ›„์— ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ์ ์œผ๋กœ ์‹œ์ž‘๋  ์ˆ˜ ์žˆ๋‹ค.

System Calls

์ดˆ๋ฐ˜์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ, ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ ์‹œ์Šคํ…œ ์ž์›์— ๋ง˜๋Œ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ์ปค๋„์ด ์—ฌ๋Ÿฌ๊ฐœ์˜ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ๋“ค์„ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๊ธฐ์—, ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์€ ์ปค๋„์˜ ์ง€ํœ˜์— ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์œ ์ € ๋ชจ๋“œ์™€ ์ปค๋„ ๋ชจ๋“œ๋ผ๋Š” ๊ตฌ๋ถ„์„ ํ†ตํ•ด, ์œ ์ € ๋ชจ๋“œ์—์„œ ์‹œ์Šคํ…œ ์ž์› ์ ‘๊ทผ์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ•˜๊ณ , ์ปค๋„ ๋ชจ๋“œ์—์„œ ๊ทธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์ค€ ํ›„, ์œ ์ € ๋ชจ๋“œ๋กœ ๋ณต๊ท€ํ•˜๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ํ†ตํ•ด ์‹คํ˜„๋œ๋‹ค.
์—ฌ๊ธฐ์„œ์˜ ์š”์ฒญ์ด ๋ฐ”๋กœ ์‹œ์Šคํ…œ ์ฝœ์— ํ•ด๋‹นํ•œ๋‹ค.

๊ฐ€์žฅ ๋จผ์ € ์œ ์ € ๋ชจ๋“œ์™€ ์ปค๋„ ๋ชจ๋“œ์˜ ๊ตฌ๋ถ„์ด ์–ด๋–ป๊ฒŒ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€๋ฅผ ์‚ดํŽด๋ณด์ž.

Protection Ring

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 ์ด๋ผ๋Š” ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ECF (Exceptional Control Flow)

์‹œ์Šคํ…œ ์ฝœ์€ ์‚ฌ์‹ค ์ธํ„ฐ๋ŸฝํŠธ์˜ ์ผ์ข…์ด๋‹ค. CSAPP์˜ ์šฉ์–ด ์‚ฌ์šฉ์— ๋”ฐ๋ฅด๋ฉด Exception์˜ ์ผ์ข…์ธ trap์— ํ•ด๋‹นํ•˜๋Š” ํ๋ฆ„์ด๋‹ค. (ECF๋Š” ์ข€๋” ๊ฐœ๋…์ ์ธ ์šฉ์–ด๋ผ๊ณ  ์ดํ•ดํ–ˆ๋‹ค.)

์ด๋Ÿฌํ•œ Exception ๋˜๋Š” ๊ฐ‘์ž‘์Šค๋Ÿฐ ํ๋ฆ„์˜ ๋ณ€ํ™” (ECF)๊ฐ€ ์™œ ํ•„์š”ํ• ๊นŒ. ECF์˜ ์ฒซ invention์€, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌดํ•œ ๋ฃจํ”„์— ๋น ์กŒ์„ ๋•Œ๋ฅผ ์ฒดํฌํ•˜๊ธฐ ์œ„ํ•ด ์šด์˜์ฒด์ œ๊ฐ€ ์ผ์ • ๊ฐ„๊ฒฉ์œผ๋กœ ์ œ์–ด๋ฅผ ๋„˜๊ฒจ๋ฐ›์•„ ์ด๋ฅผ ํ™•์ธํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ํƒ€์ด๋จธ ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์ฒ˜๋Ÿผ, ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์—๋Š” ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋ณ€์ˆ˜๋‚˜ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ํฌํ•จ๋˜์ง€ ์•Š์•˜๋‹ค. cpu๋Š” ๊ทธ์ € ํ”„๋กœ๊ทธ๋žจ ์นด์šดํ„ฐ๋ฅผ ๊ณ„์† ์ฝ์œผ๋ฉฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๋ฟ์ด๋‹ค. ๊ทธ๋ž˜์„œ cpu๊ฐ€ ์Šค์ผ€์ค„๋ง์— ํ™œ์šฉํ•˜๋Š” ํƒ€์ด๋จธ๋‚˜, ๋„คํŠธ์›Œํฌ ํŒจํ‚ท์˜ ์ฒ˜๋ฆฌ๋‚˜, ๋””์Šคํฌ ์ž…์ถœ๋ ฅ์˜ ์ฒ˜๋ฆฌ ๋“ฑ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ์ƒํƒœ์— ๋Œ€ํ•œ ๋ฐ˜์‘์„ ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” Exception์ด๋ผ๋Š”, cpu์˜ ์ž‘์—… ํ๋ฆ„์— ๋Œ€ํ•œ ๋Œ๋ฐœ์ ์ธ, ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒ๋จ์œผ๋กœ์จ ์‹คํ˜„๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ Exception์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, cpu๋Š” ๋ฏธ๋ฆฌ ๋“ฑ๋ก๋œ handler ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด๋‹น Exception์„ ์ฒ˜๋ฆฌ(handle)ํ•œ๋‹ค.


Exception์—๋Š” ์œ„์™€ ๊ฐ™์ด 4๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  1. ์ธํ„ฐ๋ŸฝํŠธ (Interrupt)
    ์ธํ„ฐ๋ŸฝํŠธ๋Š” cpu ์™ธ๋ถ€์˜ ํ•˜๋“œ์›จ์–ด๊ฐ€ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. ํ”„๋กœ์ ํŠธ 1์—์„œ ๋‹ค๋ค˜๋˜ timer interrupt๊ฐ€ ์ด์— ํ•ด๋‹นํ•œ๋‹ค. ์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋น„๋™๊ธฐ(Async)์ ์ด๋‹ค. ํŠน์ • ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹คํ–‰ํ•ด์„œ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ์—, ๋ฌธ๋งฅ์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ , ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๋ฅผ ์‹œ์ผœ์ค„ ์ˆ˜๊ฐ€ ์—†๋‹ค. (์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์ด ์ค‘๊ฐ„์— ๋ฉˆ์ถœ ์ˆ˜ ์—†๋‹ค๋Š”(์„ ์ ๋  ์ˆ˜ ์—†๋‹ค๋Š”) ์˜๋ฏธ์ด๋‹ค. ๋ฉˆ์ถœ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ฌธ๋งฅ์„ ์ €์žฅํ•˜๊ณ  ์ดํ›„์— ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.)

  2. ํŠธ๋žฉ (trap) : ์‹œ์Šคํ…œ ์ฝœ (system call)
    ํŠธ๋žฉ์€ ์˜๋„์ ์ธ ์˜ˆ์™ธ์ƒํ™ฉ์ด๋‹ค. ์–ด๋–ค ์ธ์ŠคํŠธ๋Ÿญ์…˜์„ ์‹คํ–‰ํ•œ ๊ฒฐ๊ณผ๋กœ ๋ฐœ์ƒํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋™๊ธฐํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. '์˜๋„์ ์ธ' ์ด๋ผ๋Š” ํ‘œํ˜„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ, ํŠธ๋žฉ์€ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์ด ๋ฐœ์ƒ์‹œ์ผœ ์ปค๋„์—๊ฒŒ ์–ด๋–ค ์ฒ˜๋ฆฌ๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค. โžก ์‹œ์Šคํ…œ ์ฝœ.

  3. ์˜ค๋ฅ˜ (fault)
    ์˜ค๋ฅ˜๋Š” handler๊ฐ€ ์ •์ •ํ•  ์ˆ˜ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์—๋Ÿฌ ์กฐ๊ฑด์œผ๋กœ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•œ๋‹ค. ๋งŒ์•ฝ handler๊ฐ€ ํ•ด๋‹น ์—๋Ÿฌ ์กฐ๊ฑด์„ ์ •์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ์ •์ •ํ•œ ํ›„ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ๋Œ๋ ค์ฃผ์–ด ๊ฑฐ๊ธฐ์„œ๋ถ€ํ„ฐ ์žฌ์‹คํ–‰ํ•œ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์˜ ๋‹ค์Œ ์ธ์ŠคํŠธ๋Ÿญ์…˜์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ์™€ ํŠธ๋žฉ๊ณผ ์ฐจ์ด์ ์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ์˜ค๋ฅ˜๋กœ๋Š” page fault๊ฐ€ ์žˆ๋‹ค.

  4. ์ค‘๋‹จ (abort)
    ์ค‘๋‹จ์€ ๋Œ€๊ฐœ ํ•˜๋“œ์›จ์–ด์™€ ๊ฐ™์€ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์น˜๋ช…์ ์ธ ์—๋Ÿฌ์—์„œ ๋ฐœ์ƒํ•œ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•จ์œผ๋กœ์จ ์ฒ˜๋ฆฌ๋œ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ, ์˜ˆ์™ธ ๋“ฑ์˜ ์šฉ์–ด ์‚ฌ์šฉ์— ๋Œ€ํ•œ ํ†ต์ผ๋œ ๊ทœ์ •์ด ์—†๋‹ค. ํ•˜๋“œ์›จ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์  ํ๋ฆ„๊ณผ, ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์  ํ๋ฆ„์„ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ดํ•ดํ–ˆ๋‹ค.
์ฐธ๊ณ ๋กœ C++์ด๋‚˜ JAVA์—์„œ ์‚ฌ์šฉ๋˜๋Š” Exception์€ ๋‹ค๋ฅธ ๋ ˆ๋ฒจ์—์„œ์˜ ์˜ˆ์™ธ์‚ฌํ•ญ(์‘์šฉ ์ˆ˜์ค€์˜ ECF)์œผ๋กœ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

interrupt

์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋ชจ๋“  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๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

interrupt frame

์ธํ„ฐ๋ŸฝํŠธ๋Š” ๋ง๊ทธ๋Œ€๋กœ ๋ฐฉํ•ด, 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)ํ•˜๋‹ค : ์ด์ „์— ์„ ์ (์ผ์‹œ ์ •์ง€)๋œ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘ ๋‹ค์‹œ ์‹คํ–‰ํ•  ํ”„๋กœ์„ธ์Šค๋ฅผ ์„ ํƒํ•˜๋‹ค.

convention

์•ž์„œ argument passing ์—์„œ ์–ธ๊ธ‰ํ•œ calling convention๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ syscall ์ธ์ŠคํŠธ๋Ÿญ์…˜์— ๋Œ€ํ•ด์„œ๋„ convention์ด ์กด์žฌํ•œ๋‹ค. ์œ ์ €๊ฐ€ ์ปค๋„์—๊ฒŒ ์–ด๋– ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ๋ถ€ํƒํ•  ๋•Œ, ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ์ธ์ž๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋•Œ ๊ธฐ๋ณธ์ ์ธ calling convention์„ ์ค€์ˆ˜ํ•˜์ง€๋งŒ, ๋‘๊ฐ€์ง€ ๋‹ค๋ฅธ ์ ์ด ์žˆ๋‹ค.

  1. %rax์— ์‹œ์Šคํ…œ์ฝœ ๋ฒˆํ˜ธ๋ฅผ ์ €์žฅํ•ด ๋‘”๋‹ค.
    • ์ธํ„ฐ๋ŸฝํŠธ vector์ฒ˜๋Ÿผ ์‹œ์Šคํ…œ ์ฝœ์—์„œ ๊ฐ ์‹œ์Šคํ…œ ์ฝœ์„ ์‹๋ณ„ํ•˜๋Š” ์‹๋ณ„ ๋ฒˆํ˜ธ๊ฐ€ ์กด์žฌํ•œ๋‹ค. ์ด ๋ฒˆํ˜ธ๋ฅผ syscall ์ธ์ŠคํŠธ๋Ÿญ์…˜ ์‹คํ–‰ ์ „ %rax ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•ด ๋‘”๋‹ค.
  2. 4๋ฒˆ์งธ ์ธ์ž๋Š” %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

profile
I think I think too much.

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