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()๋ ์๋ํ์ฌ ์ ์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋๋ฐ, ๋ด๊ฐ ๊ฑด๋๋ ค์๋ ์๋ ๊ฒ ๊ฐ์ ๋ถ๋ถ์ ์์ ํด ํ๋ก๊ทธ๋จ์ด ๋์๊ฐ์ ๋์ ์ง๋ฆฟํจ์ ์์ ์ ์๋ค....
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์ ์ ๊ตฌ๋ณํด์ผํ๋ค.
์ ๊ทผํ๊ณ ์ ํ๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ validateํ ์ง ํ์ธํ๋ค. USER_STACK ๋ณด๋ค ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด thread๋ฅผ ์ข ๋ฃ์ํจ๋ค.
syscall handler์์ rsp๋ฅผ ํ์ธํ๋ค. EXEC(), OPEN() ์ํฌ๋ ์ด๋ ค๋ ํ์ผ์ ์ฃผ์๋ฅผ ํ์ธํ๋ค.
์ ์ ์์ ์์ฒญ๋๋ 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() ์ฌ์ฉ
EXIT() system call์ ์ํํ ๋, thread ์ด๋ฆ๊ณผ ์ข ๋ฃ ์ํ๋ฅผ ํ์ํ๋ค. thread ๊ตฌ์กฐ์ฒด์ ์ข ๋ฃ์ํ๋ฅผ ์ ์ฅํ๋ ๋ณ์๋ฅผ ์ ์ธํ๊ณ ์ข ๋ฃ ์ํ๋ฅผ ์ ์ฅํ๋ค.
EXEC() system call์ ์ํํ ๋, Excuteํ๊ธฐ ์์ ์ฝ์ ํ์ผ์ ์์ ํ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ค. process_exec()์์ ์คํํ์ผ์ ๋ถ๋ฌ์จ๋ค๋ฉด file_deny_write() ํจ์๋ฅผ ์ด์ฉํด์ ์์ ์ ๋ง๋๋ค. process๋ฅผ ์ข ๋ฃ์ํฌ ๋ ๋ค์ ํ์ด์ค๋ค.
๋ฉ์์ด์