Pintos lab2 user programs review

์กฐ์„ฑํ˜„ยท2021๋…„ 2์›” 16์ผ
1

OS

๋ชฉ๋ก ๋ณด๊ธฐ
5/9

๐Ÿ“• User programs

OS์˜ ์—ญํ•  ์ค‘ ํ•˜๋‚˜์ธ abstraction์— ๋Œ€ํ•ด, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ system call์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ–ˆ๋‹ค. thread์™€ process ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋“ค(๋ฉ”๋ชจ๋ฆฌ,ํŒŒ์ผ ํ…Œ์ด๋ธ”, ํ”„๋กœ์„ธ์Šค ์ •๋ณด๋“ค)์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์› ๋‹ค. ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์— ํ•  ์ˆ˜ ์—†๋Š” ์ปค๋„ ๋ชจ๋“œ์—์„œ์˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜ ํ•˜๋‚˜ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค. ๊ทธ๋Ÿฌ๊ธฐ ์œ„ํ•ด์„œ thread ๊ตฌ์กฐ์ฒด ์•ˆ์— ํ•„์š”ํ•œ ๋ณ€์ˆ˜, lock, semaphore๋“ฑ ์„ ์„ ์–ธํ•˜์—ฌ durability๋ฅผ ๋†’์˜€๊ณ , fd_table์„ ์„ ์–ธํ•ด์„œ ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•ด์ฃผ๊ณ , parent_tf๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณด๊ด€ํ•ด ๋‘์–ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค...

lab2๋Š” lab1์— ๋น„ํ•ด ํ™•์‹คํžˆ ์–ด๋ ค์› ๋‹ค... ๋ ˆ์ง€์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ฐœ๋…์กฐ์ฐจ ์—†์—ˆ๋Š”๋ฐ OS์—์„œ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ์ง€๊นŒ์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ์— ํ๋ฆ„์„ ์žก๋Š”๊ฒŒ ์ง„์งœ ์–ด๋ ค์› ๋Š”๋ฐ, ์œ ์ €๊ฐ€ ์‹œ์Šคํ…œ์ฝœ์„ ํ•˜๊ณ  OS๊ฐ€ ์ง„ํ–‰๋˜๊ณ  ์žˆ๋˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ฃผ์–ด์ง„ ์ž„๋ฌด๋ฅผ ํ•˜๊ณ , ๋‹ค์‹œ ๋ณต๊ท€ ์‹œํ‚ค๋Š” ํ๋ฆ„์„ ํ•œ ๋ฒˆ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋‹ˆ (์ค‘๊ฐ„์— ์–ด์…ˆ๋ธ”๋ฆฌ์–ด๊นŒ์ง€ ๋‚˜์™€์„œ ์ •์‹ ์ด ์—†์—ˆ๋‹ค...) ๋น„๊ต์  ๋”ฐ๋ผ๊ฐˆ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

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

lab1์—์„œ sema_up์„ ์ˆ˜์ •ํ•ด์„œ sema up ์‹œ์— ๋ฌด์กฐ๊ฑด thread_yiled๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ๋” ๋˜์žˆ์—ˆ๋Š”๋ฐ ์ด๊ฒŒ lab2์— ์™€์„œ ๋ฌธ์ œ๋ฅผ ์ผ์œผ์ผฐ๋‹ค. is_kern_vaddr()์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š”๋ฐ ๋””๋ฒ„๊น…ํ•ด๋ณด๋‹ˆ list_init()์ด ์ œ๋Œ€๋กœ ๋™์ž‘์„ ํ•˜์ง€์•Š์•˜๋‹ค. (NULL๊ฐ’์„ ๋„ฃ์—ˆ๋Š”๋ฐ 0์ด ์•ˆ๋“ค์–ด๊ฐ”๋‹ค.) ๋‹คํ–‰ํžˆ is_empty()๋Š” ์ž‘๋™ํ•˜์—ฌ ์ œ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ๋‚ด๊ฐ€ ๊ฑด๋“œ๋ ค์„œ๋Š” ์•ˆ๋ ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ๋Œ์•„๊ฐ”์„ ๋•Œ์˜ ์งœ๋ฆฟํ•จ์€ ์žŠ์„ ์ˆ˜ ์—†๋‹ค....

๐Ÿ‘‰ Argument passing

Interrupt ํ˜น์€ syscall์ด ๋ฐœ์ƒํ•˜๋ฉด intr_entry() ํ˜น์€ syscall_entry()์—์„œ ํ˜„์žฌ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ’๋“ค์ด ์Šคํƒ์— ํ‘ธ์‰ฌ๋œ๋‹ค. ์ด๋ฅผ Thread ๊ตฌ์กฐ์ฒด์˜ intr_frame tf์— ์ €์žฅ๋˜์–ด ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ๋‹ค. ๊ทธ ํ›„, ์ปค๋„ ๋ชจ๋“œ์—์„œ ์š”์ฒญ๋œ ์ฒ˜๋ฆฌ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค. ๋‹ค์‹œ ์œ ์ € ๋ชจ๋“œ๋กœ ๋Œ์•„์˜ค๊ฒŒ ๋˜๋ฉด ์ €์žฅ๋˜์–ด์žˆ๋˜ intr_frame์—์„œ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค์„ ๋‹ค์‹œ ๋ณต๊ตฌ์‹œ์ผœ ์›๋ž˜ ์‹คํ–‰๋˜๋˜ ์œ ์ € ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋Œ์•„์˜จ๋‹ค.

๊ธฐ์กด pintos๋Š” ์‚ฌ์šฉ์ž ๋ช…๋ น์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค. ์ด๋ฅผ x86-64 Calling Convention์— ๋งž์ถ”์–ด ์ „๋‹ฌ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค. main๋ฌธ์—์„œ ์ „๋‹ฌ๋˜๋Š” cmd line์—์„œ ํŒŒ์ผ๋ช…์„ ์ถ”์ถœํ•˜์—ฌ thread create๋ฅผ ์‹œํ‚ค๊ณ , load์—์„œ๋Š” ํŒŒ์ผ์„ ์ฝ๋Š”๋ฐ, ์ด ๋•Œ cmd line์—์„œ ํŒŒ์ผ๋ช…๊ณผ argument๋ฅผ ์ถ”์ถœํ•ด user stack์— ๊ทœ์•ฝ์— ๋งž์ถฐ์„œ ์ €์žฅ ์‹œํ‚ค๊ณ  ๋ ˆ์ง€์Šคํ„ฐ์— ์ด์— ๋Œ€ํ•œ ์ฃผ์†Œ๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

์ฒ˜์Œ์—๋Š” ๊ทœ์•ฝ ํ‹€์— ๋งž์ถฐ์„œ ๋„ฃ์–ด์•ผ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ํ—ค๋งธ๋‹ค. pintos ๊นƒ๋ถ์— ์ ํ˜€์žˆ๋Š” ๋Œ€๋กœ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค... ๋ ˆ์ง€์Šคํ„ฐ์—๋„ ์–ด๋–ป๊ฒŒ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๋„ฃ๋Š”์ง€ ๋ชฐ๋ผ์„œ์„œ ํ—ค๋งธ๋‹ค. Pintos๋Š” intr_frame์„ ์‚ฌ์šฉํ•จ์œผ๋กœ, ์—ฌ๊ธฐ์—๋‹ค๊ฐ€๋งŒ ์ž˜ ๋„ฃ์–ด์ฃผ๋ฉด ์•Œ์•„์„œ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.(irtq ํ•จ์ˆ˜) ์ƒˆ๋กœ์šด process(kernal mode)์™€ ๊ธฐ์กด(user mode)์˜ intr_frame์„ ์ž˜ ๊ตฌ๋ณ„ํ•ด์•ผํ•œ๋‹ค.

๐Ÿ‘‰ User Memory Access

์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๊ฐ€ validateํ•œ ์ง€ ํ™•์ธํ•œ๋‹ค. USER_STACK ๋ณด๋‹ค ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•˜๋ฉด thread๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.

syscall handler์—์„œ rsp๋ฅผ ํ™•์ธํ•œ๋‹ค. EXEC(), OPEN() ์‹œํ‚ฌ๋•Œ ์—ด๋ ค๋Š” ํŒŒ์ผ์˜ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

๐Ÿ‘‰ System calls

์œ ์ €์—์„œ ์š”์ฒญ๋˜๋Š” system call๋“ค์˜ ๊ธฐ๋Šฅ๋“ค์„ ํ•˜๋‚˜์”ฉ ๊ตฌํ˜„ํ•œ๋‹ค. system call number๋Š” %rax ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด๊ฒจ ์žˆ๊ณ , argument๋“ค๋„ ๋ ˆ์ง€์Šคํ„ฐ์— ๋‹ด๊ฒจ์ ธ์„œ ์˜จ๋‹ค.
๊ฐ ๊ธฐ๋Šฅ์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€ ๊ฐ„๋‹จํžˆ๋งŒ ์ ์–ด๋†“๊ฒ ๋‹ค.

SYS_HALT: power_off() ๋กœ ์‹œ์Šคํ…œ ์ข…๋ฃŒ

SYS_EXIT: exit status ๋ฐ›์•„์„œ ์ €์žฅํ•ด๋†“๊ณ  ์“ฐ๋ ˆ๋„ ์ข…๋ฃŒ

SYS_FORK: process_fork๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋•Œ ์ž์‹ thread๊ฐ€ ์ œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€์•Š์œผ๋ฉด exit status -1์„ ๋ฆฌํ„ด ๋ฐ›๋Š”๋‹ค. ์ž์‹์ด ๋‹ค load ๋  ๋•Œ๊นŒ์ง€ semaphore๋ฅผ ์‚ฌ์šฉํ•ด ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜์˜€๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ํ• ๋‹น ๋ฐ›๊ณ , ๋ถ€๋ชจ์˜ ๋ ˆ์ง€์Šคํ„ฐ์™€ file table์„ ๋ณต์‚ฌํ•ด์ค€๋‹ค. ์ด๋•Œ ๊ทธ๋ƒฅ ์ฃผ์†Œ๋งŒ ๋„˜๊ธฐ๋ฉด ์•ˆ๋˜๊ณ  ์ƒˆ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์— '๋ณต์‚ฌ'ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

SYS_EXEC: ๊ธฐ์กด process๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ƒˆ๋กœ์šด ์‹คํ–‰ํŒŒ์ผ์„ loadํ•ด์„œ ์‹คํ–‰์‹œํ‚จ๋‹ค. argument passํ•  ๋•Œ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌํ•ด์„œ ์ถ”์ถœํ•œ ๋‹ค์Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

SYS_WAIT: ๊ธฐ์กด pintos๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒ๋˜๊ฒŒ๋” ๋˜์žˆ๋‹ค. ์ด๋ฅผ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋๋‚  ๋•Œ๊ฐ€์ง€ semaphore๋ฅผ ์ด์šฉํ•ด ๋Œ€๊ธฐ์‹œํ‚จ๋‹ค.

SYS_CREATE: ์ƒˆ๋กœ thread๋ฅผ createํ•œ๋‹ค ์ผ ๋•Œ, ์ฝ๊ณ ์žํ•˜๋Š” ํŒŒ์ผ์ด validate์ธ์ง€ ํ™•์ธํ•˜๋Š” test case๊ฐ€ ๋งŽ์•„ ํ•˜๋‚˜์”ฉ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜์˜€๋‹ค.

SYS_REMOVE: filesys_remove() ์‚ฌ์šฉ

SYS_OPEN: process_add_file()์‚ฌ์šฉ. file์˜ validity ํ™•์ธ, fd_num์ด ์ œํ•œ์„ ๋„˜๊ธฐ์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ํŒŒ์ผ ์ค‘์— ์ด๋ฏธ ์—ด๋ ค์žˆ๋Š”์ง€ fd_table ์ „์ฒด๋ฅผ ํ™•์ธํ•˜๊ณ  ์žˆ๋‹ค๋ฉด file_reopen()์„ ์‚ฌ์šฉํ•œ๋‹ค.

SYS_FILESIZE: file_length() ์‚ฌ์šฉ

SYS_READ: ํŒŒ์ผ์„ ์ฝ๋Š” ์ค‘์— ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋„๋ก ์ „์—ญ๋ณ€์ˆ˜๋กœ lock์„ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•œ๋‹ค. fd๊ฐ€ 0์ผ ๋•Œ๋Š” stdin์ด๋ฏ€๋กœ input_getc()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

SYS_WRITE: ํŒŒ์ผ์„ ์“ฐ๋Š” ์ค‘์— ์ˆ˜์ •๋˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋„๋ก ์ „์—ญ๋ณ€์ˆ˜๋กœ lock์„ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•œ๋‹ค. fd๊ฐ€ 1์ผ ๋•Œ๋Š” stdout์ด๋ฏ€๋กœ putbuf()๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

SYS_SEEK: file_seek() ์‚ฌ์šฉ

SYS_TELL: file_tell() ์‚ฌ์šฉ

SYS_CLOSE: process_close_file() ์‚ฌ์šฉ

๐Ÿ‘‰ Process Termination Message

EXIT() system call์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, thread ์ด๋ฆ„๊ณผ ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. thread ๊ตฌ์กฐ์ฒด์— ์ข…๋ฃŒ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  ์ข…๋ฃŒ ์ƒํƒœ๋ฅผ ์ €์žฅํ•œ๋‹ค.

๐Ÿ‘‰ Deny Write on Executables

EXEC() system call์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, Excuteํ•˜๊ธฐ ์œ„์— ์ฝ์€ ํŒŒ์ผ์„ ์ˆ˜์ •ํ•œ๋‹ค๋ฉด ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. process_exec()์—์„œ ์‹คํ–‰ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค๋ฉด file_deny_write() ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ์ˆ˜์ •์„ ๋ง‰๋Š”๋‹ค. process๋ฅผ ์ข…๋ฃŒ์‹œํ‚ฌ ๋•Œ ๋‹ค์‹œ ํ’€์–ด์ค€๋‹ค.

profile
Jazzing๐Ÿ‘จโ€๐Ÿ’ป

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

comment-user-thumbnail
2021๋…„ 2์›” 17์ผ

๋ฉ‹์žˆ์–ด์š”

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2021๋…„ 3์›” 23์ผ

๊ธ€ ์ž˜๋ดค์Šต๋‹ˆ๋‹ค! ์ œ๊ฐ€ pintos ๋‘๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์ธ sys call ์„ ํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ํ˜น์‹œ ์ฐธ๊ณ ํ•˜์‹  ์ž๋ฃŒ๋‚˜ ์–ด๋–ป๊ฒŒ ๊ณต๋ถ€ํ•˜์…จ๋Š”์ง€ ์—ฌ์ญค๋ด๋„ ๋ ๊นŒ์š”?

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ