๋ค์ด๊ฐ๊ธฐ ์์
- PintOS์์ ์ ์ ํ๋ก๊ทธ๋จ๋ค์ ์์ ๋ค์ด ์ปดํจํฐ ์ ์ฒด๋ฅผ ์์ ํ๋ค๋ ๊ฐ์ ํ์ ์ฐ์ธ๋ค.
- ํ๋์ ํ๋ก์ธ์ค์ ํ๋์ ์ค๋ ๋๋ง ์ง์ํด์ผ ํ๋ค.
- ๋ฉํฐ ์ค๋ ๋ ํ๋ก์ธ์ค๋ ์ง์ํ์ง ์๋๋ค.
- ์ฐ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ, ์ค์ผ์ค๋ง ๊ทธ ์ธ ๋ค๋ฅธ ์ํ๋ค์ด ํ๋ก์ธ์ค๊ฐ ๊ฐ์ง ์ดํ์์ ๋ง์กฑ์ํค๋ ๋ฐฉํฅ์ผ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
- ์ฐ๋ฆฌ๋ ์ ์ ํ๋ก๊ทธ๋จ๋ค์ ์คํํจ์ผ๋ก์จ ์ด์์ฒด์ ๋ฅผ ํ ์คํธํ๋ค.
- ์ ์ ํ๋ก๊ทธ๋จ ์ธํฐํ์ด์ค๊ฐ ์ด ๋ฌธ์์ ์ ํ ๊ท์น์ ๋ง์กฑ์ํค๋๋ก ํด์ผ ํ๋ค.
- ์ด ๊ท์น๋ง ์งํจ๋ค๋ฉด ์ปค๋ ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พธ๊ฑด ๋ค์ ์ง๋ ๋๋ค.
Argument Passing (์ธ์ ์ ๋ฌ)
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ์คํ๋ ๋ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์๋ค์ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ๋ ๊ณผ์
- PintOS ๋ ์ปค๋งจ๋ ๋ผ์ธ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ, ์ด๋ ํ๋ก๊ทธ๋จ์ ์ ๋ฌํ ์ปค๋งจ๋ ๋ผ์ธ ์ธ์๋ค์ process_exec() ํจ์๋ฅผ ํตํด ์ฒ๋ฆฌ๋์ด์ผํ๋ค.
- ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ธ์๋ค์ ์คํ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฅํ๊ณ , ํ๋ก๊ทธ๋จ์ด min(int argc, char *argv[]) ํํ๋ก ํด๋น ์ธ์๋ค์ ๋ฐ์ ์ ์๋๋ก ์ค์ ํด์ผํ๋ค.
- ๊ฒฐ๋ก ์ ์ผ๋ก ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ธฐ ์ ์ ํ๋ก๊ทธ๋จ์ ๋ํ ์ธ์๋ฅผ ์ค์ ํ๋ ๊ณผ์ ์ ๊ตฌํํด์ผ ํ๋ค .
/* ...usrprog/prcoess.c */
/* ํ์ฌ ์คํ ์ปจํ
์คํธ๋ฅผ f_name์ผ๋ก ์ ํํฉ๋๋ค.
* ์คํจ ์ -1์ ๋ฐํํฉ๋๋ค. */
int
process_exec (void *f_name) {
char *file_name = f_name;
bool success;
/* We cannot use the intr_frame in the thread structure.
* This is because when current thread rescheduled,
* it stores the execution information to the member. */
struct intr_frame _if;
_if.ds = _if.es = _if.ss = SEL_UDSEG;
_if.cs = SEL_UCSEG;
_if.eflags = FLAG_IF | FLAG_MBS;
/* We first kill the current context */
process_cleanup ();
/* And then load the binary */
success = load (file_name, &_if);
/* If load failed, quit. */
palloc_free_page (file_name);
if (!success)
return -1;
/* Start switched process. */
do_iret (&_if);
NOT_REACHED ();
}
์ฃผ์ ๋จ๊ณ
- ์ปค๋งจ๋ ๋ผ์ธ ํ์ฑ
- ํ๋ก๊ทธ๋จ ์คํ์ ์ ์ ๋ ฅ๋ ๋ช ๋ น์ด ๋ฌธ์์ด ์ ๊ฐ๋ณ ์ธ์๋ก ๋๋ ์ผํ๋ค. (๋ฌธ์์ด ์ : echo Hello World)
- ๊ฐ ์ธ์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ํ๋ก๊ทธ๋จ ์ด๋ฆ(echo)์ ์ธ์ (Hello World)๋ก ๊ตฌ๋ถ๋๋ค .
- ์คํ์ ์ธ์์ ์ฅ
- ๊ฐ ์ธ์ ๋ฌธ์์ด์ ์คํ์ ์ ์ฅํ๊ณ , ๊ฐ ๋ฌธ์์ด์ ์ฃผ์๋ฅผ ์ ์ฅํ๋ ํฌ์ธํฐ ๋ฐฐ์ด(argv)๋ฅผ ์คํ์ ํจ๊ป ์ ์ฅํ๋ค.
- argv ๋ฐฐ์ด์ ๋์๋ NULL ํฌ์ธํฐ๋ฅผ ์ถ๊ฐํด argv[argc]๊ฐ NULL์ ๊ฐ๋ฆฌํค๋๋ก ํ๋ค .
- ๋ ์ง์คํฐ ์ค์
- argc(์ธ์ ๊ฐ์) ๋ฅผ %rdi ๋ ์ง์คํฐ์ ์ ์ฅํ๊ณ , argv์ ์ฃผ์๋ฅผ %rsi ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. ์ด๋ x86-64 ํธ์ถ ๊ท์ฝ์ ๋ง๊ฒ main() ํจ์๊ฐ ์ธ์๋ค์ ๋ฐ์ ์ ์๊ฒ ํ๋ค.
- ์คํ ์ ๋ ฌ
- ์คํ์ด 8๋ฐ์ดํธ ๋จ์๋ก ์ ๋ ฌ๋๋๋ก ํด์ผํ๋ฉฐ, ์ด๋ฅผ ์ํด (ํ์ํ ๊ฒฝ์ฐ) ํจ๋ฉ์ ์ถ๊ฐํ๋ค .
๊ตฌํ ๊ณผ์
- ๊ธฐ์กด process_exec() ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก๊ทธ๋จ ํ์ผ ์ด๋ฆ๋ง ์ธ์๋ก ๋ฐ๋๋ค. ์ด ํจ์๋ฅผ ํ์ฅํ์ฌ ์ปค๋งจ๋ ๋ผ์ธ ์ ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๊ตฌํํด์ผํ๋ค .
- ์ ๋ ฅ ๋ฌธ์์ด์ ๊ณต๋ฐฑ์ผ๋ก ๋๋์ด ๊ฐ๋ณ ์ธ์๋ก ํ์ฑ.
- ๊ฐ ์ธ์๋ฅผ ์คํ์ ์ ์ฅํ๊ณ , argv ๋ฐฐ์ด๊ณผ argc ๊ฐ์ ์ ์ ํ ์ค์ .
- ๋ฉ๋ชจ๋ฆฌ์ ๊ฒฝ๊ณ๋ ์คํ ์ ๋ ฌ์ ์ ์งํด ํ๋ก๊ทธ๋จ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์คํ ๋ ์๋๋ก ๊ด๋ฆฌ.
User Memory Access
- ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ์์ธ์ค ๊ตฌํ.
- sysCall ์ ๊ตฌํํ๋ ค๋ฉด ์ฌ์ฉ์ ๊ฐ์ ์ฃผ์ ๊ณต๊ฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ ๋ฒ์ ์ ๊ณตํด์ผํ๋ค . ๊ทธ๋์ System Calls ๊ณผ์ ๋ณด๋ค ๋จผ์ ์งํํ๋๊ฒ๊ฐ๋ค.
- ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ์ ๊ทผ์ ๋ง์์ผ ํ๋ค .
OS๊ฐ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ํ ์ ์๋๋ก ๊ด๋ฆฌํ๋ ๊ณผ์ ์ด๋ค.
์ด ๊ณผ์ ์์ ์ด์์ฒด์ ๋ ์ปค๋์ด ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ถํ์ ์ ๊ณตํ๊ณ , ์ด๋ฅผ ์์ ํ๊ฒ ๊ด๋ฆฌํ๋๋ฐ
์ค์ํ ์ญํ ์ ํ๋ค .
PintOS ๋ ๊ฐ์๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ตฌํํ์ง ์๊ธฐ ๋๋ฌธ์, ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ปค๋์ด ์ ์ดํด์ผํ๋ค.
์ฃผ์ ๊ฐ๋
- ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ์ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ
- PintOS ๋ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ๊ณผ ์ปค๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ตฌ๋ถํ์ฌ, ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ์ง์ ์ ์ผ๋ก ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ง ์๋๋ก ํ๋ค
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ์์ ์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ด์์๋ง ์คํ ๋ ์ ์์ผ๋ฉฐ, ์ปค๋์ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ์ ๊ทผ์ ๊ด๋ฆฌํ๋ค.
- ์ฌ์ฉ์ ๋ฉ๋ชจ๋ฆฌ ๋ณดํธ
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ์ปค๋ ์์ญ์ ์ ๊ทผํ ์ ์์ผ๋ฉฐ, ๋ง์ฝ ์ ๊ทผํ๋ ค๊ณ ํ ๊ฒฝ์ฐ ํ์ด์ง ํดํธ (Page Fault) ๋ฅผ ๋ฐ์ ์์ผ์ผ ํ๋ค.
- ์ปค๋์ ์ด๋ฌํ ํ์ด์ง ํดํธ๋ฅผ ์ฒ๋ฆฌํ๊ณ , ์ ์ ํ ์ค๋ฅ๋ฅผ ๋ฐํํ๊ฑฐ๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๋ ๋ฑ์ ์กฐ์น๋ฅผ ์ทจํ ์์๋ค .
- ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง ๊ด๋ฆฌ
- PintOS ๋ ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ 4KB ๋จ์๋ก ๊ด๋ฆฌํ๋ค. ๊ฐํ์ด์ง๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์์ ๊ณ ์ ํ ์ฃผ์๋ฅผ ๊ฐ์ง๋ค.
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ ํ์ด์ง๋ฅผ ์ฝ๊ฑฐ๋ ์ธ๋ ํด๋น ํ์ด์ง๊ฐ ์ ํจํ์ง ํ์ธํด์ผ ํ๋ฉฐ, ์ ํจํ์ง ์๋ค๋ฉด ํ์ด์ง ํดํธ๋ฅผ ๋ฐ์์์ผ์ผ ํ๋ค.
์ฃผ์ ๋จ๊ณ
- ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์๋
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ฌ์ฉ์ ์์ญ ๋ด์ ์๋์ง ํ์ธํ๊ธฐ
- ๋ง์ฝ ์ ํจํ ์ฌ์ฉ์ ์์ญ ๋ด์ ์ฃผ์๊ฐ ์๋๋ผ๋ฉด, ํ์ด์ง ํดํธ (Page Fault)๊ฐ ๋ฐ์ํ๊ณ ์ปค๋์ ์ด๋ฅผ ์ฒ๋ฆฌํด์ผ ํ๋ค.
- ํ์ด์ง ํดํธ (Page Fault) ์ฒ๋ฆฌ
- ํ์ด์ง ํดํธ๋ ํ๋ก๊ทธ๋จ์ด ์์ ์๊ฒ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ์ธ๋ถ๋ฅผ ์ ๊ทผํ๋ ค ํ ๋ ๋ฐ์ํ๋ค.
- ํ์ด์ง ํดํธ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์์ธ page_fault()์์, ํด๋น ์ฃผ์๊ฐ ์ปค๋ ์์ญ์ ์ํ๋์ง, ํน์ ์ฌ๋ฐ๋ฅธ ์ฌ์ฉ์ ์์ญ์ธ์ง ํ์ธํ๋ค.
- ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ์ฌ๋ฐ๋ฅด๋ฉด ์ปค๋์ ํ๋ก๊ทธ๋จ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํ์ฉํ๋ค.
- ํ์ด์ง ํ
์ด๋ธ ๊ด๋ฆฌ
- ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ํ์ด์ง ํ ์ด๋ธ์ ํตํด ๊ฐ์ ์ฃผ์๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์๋ก ๋ณํํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ค .
- ์ปค๋์ ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ํด ํ์ด์ง ํ ์ด๋ธ์ ๊ด๋ฆฌํ๊ณ , ์ดํ์ด์ง ํ ์ด๋ธ์ ํตํด ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ ์ดํ๋ค .
- ์คํ ํ์ฅ
- ํ๋ก๊ทธ๋จ์ด ์คํ์ ์ฌ์ฉ ํ ๋ ์คํ์ด ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ฒ์ด๋์ง ์๋๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
- ์คํ์ด ํ์ฅ๋ ๋๋ง๋ค, ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ ์ ์์ผ๋ฉฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ก์ง์ด ํ์ํ๋ค . (์ ํจํ ์ฃผ์๋ก๋ง ์ ๊ทผ ํ ์ ์๋๋ก ํด์ผ ํ๋ค . )
๊ตฌํ๋ด์ฉ
[๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ์ ํจ์ฑ ๊ฒ์ฌ, ํ์ด์ง ํดํธ ์ฒ๋ฆฌ , ์คํ ๊ด๋ฆฌ , ํ์ด์ง ํ ์ด๋ธ ๊ด๋ฆฌ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ]
์ด๋ฅผ ํตํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๊ฒ ๋ณดํธํ๊ณ , ์ปค๋์ด ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ฒ๋ฆฌ ํด์ผํ๋ค…
System Calls
- System Calls ์ด๋?
- PintOS์์ System Call๋ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ ์ด ์ด์์ฒด์ ์ ๊ธฐ๋ฅ์ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธํฐํ์ด์ค ์ด๋ค.
- ์ฐ๋ฆฌ๋ userprog/syscall.c ์์ ์์คํ ํธ์ถ ํธ๋ค๋ฌ๋ฅผ ๊ตฌํํด์ผํ๋ค.
- ๊ฐ ์์คํ ํธ์ถ์ ๋ํ ์์คํ ํธ์ถ ๋ฒํธ๋ include/lib/syscall-nr.h ์ ์ ์ ๋์ด์๋ค.
- ์ค๋๋ syscall ๋ช ๋ น์ด๋ x86-64์์ ์์คํ ํธ์ถ์ ํธ์ถํ๋๋ฐ ๊ฐ์ฅ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๋จ์ด๋ค.
- Pintos ์์ ์ฌ์ฉ์ ํ๋ก๊ทธ๋จ์ syscall์ ํธ์ถํ์ฌ ์์คํ ํธ์ถ์ ํ๋ค.
- ์์คํ
ํธ์ถ ๋ฒํธ์ ์ถ๊ฐ ์ธ์ syscall ๋ช
๋ น์ด๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์ผ๋ฐ ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ ์ง์คํฐ์ ์ค์ ๋์ด์ผ ํ์ง๋ง ๋ ๊ฐ์ง ์ฌํญ์ ์์ธ ์ด๋ค.
- %rax ๋ system call ๋ฒํธ ์ด๋ค.
- ๋ค๋ฒ์งธ ์ธ์๋ %rcx๊ฐ ์๋๋ผ %r10์ด๋ค.
syscall_handler() ๊ฐ ์ ์ด๊ถ์ ์ป์ผ๋ฉด ์์คํ ํธ์ถ ๋ฒํธ๋ rax์ ์๊ณ ์ธ์๋ %rdi, %rsi, %rdx, %r10, %r8, %r9 ์์๋ก ์ ๋ฌ๋๋ค. ํธ์ถ์์ ๋ ์ง์คํฐ๋ ์ ๋ฌ๋ struct intr_frame์์ ์ก์ธ์ค ํ ์ ์๋ค. (์ด๊ฑด ์ปค๋์คํ์ ์์.. ) ํจ์ ๋ฐํ ๊ฐ์ ๋ํ x86-64 ๊ท์น์ RAX ๋ ์ง์คํฐ์ ๊ฐ์ ๋ฐฐ์นํ๋๊ฒ์ด๋ค . ๊ฐ์ ๋ฐํํ๋ ์์คํ ํธ์ถ์ struct intr_frame ์ rax ๋ฉค๋ฒ๋ฅผ ์์ ํ์ฌ ๊ฐ์ ๋ฐํ ํ ์ ์๋ค.
1. ์์คํ ์ฝ ๋ฒํธ ๋งคํ (syscall_table ๋ฑ)
2. ํธ๋ค๋ฌ ํจ์ ๊ตฌํ (๊ฐ ์์คํ ์ฝ์ ๋ํ ์ฒ๋ฆฌ ํจ์ ์์ฑ)
3. ์์คํ ์ฝ ์ธ์ ์ถ์ถ ๋ฐ ์ฒ๋ฆฌ (์: exit(), exec() ๋ฑ)
4. ํ๋ก์ธ์ค ๊ด๋ จ ์์คํ ์ฝ (exit(), exec(), wait())
5. ํ์ผ I/O ์์คํ ์ฝ (open(), read(), write(), close())
6. ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ ์ค๋ฅ ์ฒ๋ฆฌ
7. ์ฌ์ฉ์-์ปค๋ ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ (์์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๊ด๋ฆฌ)
Process Termination Message
์ฌ์ฉ์ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ฅผ ํธ์ถ ํ๊ฑฐ๋ ๋ค๋ฅธ ์ด์ ๋ก ์ธํด ์ข ๋ฃ ๋ ๋๋ง๋ค ํ๋ก์ธ์ค์ ์ด๋ฆ๊ณผ ์ข ๋ฃ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ถ๋ ฅํ๋ค.
printf(“%s: exit(%d)\\n”, …);
๊ธฐ์กด ๊ตฌํ๋์ด ์๋ process_exit(void) ํจ์์ ์ ์ ์ค๋ ๋์ธ์ง ํ์ธํ๋ ๋ถ๊ธฐ์ฒ๋ฆฌ , ์ถ๋ ฅ ์ฒ๋ฆฌ ํด์ผํ๋ค .
Deny Write On Executables
์ด๋ค ์ฝ๋๊ฐ ๋์คํฌ์์ ์์ ๋๊ณ ์๋ ๋์ค์ ํ๋ก์ธ์ค๊ฐ ๊ทธ ์ฝ๋๋ฅผ ์คํํ๋ ค๊ณ ์๋ํ๋ฉด ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋ง์ OS๋ ์ด๋ฅผ ๋ฐฉ์งํ๋ค.
์ด๋ ํ๋ก์ ํธ 3์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๊ตฌํ๋ ์ดํ์ ํนํ ์ค์ํด์ง๋ ๋ถ๋ถ์ด๋ค.
์ด ๊ธฐ๋ฅ์ ์ด์์ฒด์ ์ ๋ณด์๊ณผ ์์ ์ฑ์ ๋์ด๋๋ฐ ํ์์ ์ด๋ค.
๋ง์ฝ ์คํ ์ค์ธ ๋ฐ์ด๋๋ฆฌ ํ์ผ์ด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์์ ์์ ๋ ์ ์๋ค๋ฉด, ์ ์ฑ ์ฝ๋๋ ๋น์ ์์ ์ธ ํ๋ก๊ทธ๋จ์ด ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ฌ ๋ณด์ ์ทจ์ฝ์ ์ ์ ๋ฐํ๊ฑฐ๋ ์์คํ ์ ๋ฌด๊ฒฐ์ฑ์ ํด์น ์ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด, ์ด์์ฒด์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์คํ ์ค์ธ ํ์ผ์ ๋ํ ์ฐ๊ธฐ ๊ถํ์ ์ ํํ๋ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ๋ค.
- ํ์ผ ์ด๊ธฐ ์ ์ฐ๊ธฐ ์ ํ ์ค์ :
- filesys_open() ํจ์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ด๋ จ ํจ์์์ ํ์ผ์ด ์คํ ์ค์ธ์ง ํ์ธํ๊ณ , ์คํ์ค์ด๋ผ๋ฉด ์ฐ๊ธฐ ์ ๊ทผ์ ์ ํํด์ผํ๋ค.
- ํ์ผ์ด ์คํ ์ค์ผ ๋ ํด๋น ํ์ผ์ writeable ์์ฑ์ false ๋ก ์ค์ ํ์ฌ ์ฐ๊ธฐ ์์ ์ ์ ํํ๋ค.
- ํ๋ก์ธ์ค๊ฐ ํ์ผ์ ์คํํ ๋ ์ค์ :
- process_execute() ํจ์๋ ํ๋ก์ธ์ค๊ฐ ์คํ ํ์ผ์ ๋ก๋ํ ๋, ํด๋น ํ์ผ์ ์ฐ๊ธฐ ๊ถํ์ ์ ํํ๋ค .
- ์คํ ์ค์ธ ํ์ผ ๊ฐ์ฒด์ ํ๋๊ทธ๋ฅผ ์ค์ ํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ํด๋น ํ์ผ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ด ์ ์๋๋ก ํ๋ค.
- ํ๋ก์ธ์ค ์ข
๋ฃ์ ๊ถํ ํด์ :
- ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ ๋ ๋, ํด๋น ํ๋ก์ธ์ค๊ฐ ์ฌ์ฉํ๋ ์คํ ํ์ผ์ ์ฐ๊ธฐ ์ ํ์ ํด์ ํด ์ค๋ค.
- process_exit() ํจ์์์ ๊ด๋ จ ํ์ผ ๊ฐ์ฒด์ ์ฐ๊ธฐ ์ ํ์ ํด์ ํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ค์ ์ฐ๊ธฐ ์ ๊ทผํ ์ ์๊ฒ ํ๋ค .
๊ตฌํ๋ด์ฉ
- Sturct file ์์ deny_write ํ๋๊ทธ ์ถ๊ฐ (true or false ? )
- ํ์ผ์ด ์ด๋ฏธ ์คํ ์ค์ด๊ณ deny_write ๊ฐ ์ค์ ๋์ด ์๋ค๋ฉด, ํ์ผ์ ์ฐ๊ธฐ ๋ชจ๋๋ก ์ด์ ์๋๋ก ์ฝ๋๋ฅผ ์์
- file_deny_write() ํจ์: ํ์ผ ๊ฐ์ฒด์ ์ฐ๊ธฐ ์ ํ์ ์ค์ ํ๋ ํจ์. ์คํ์ค์ธ ํ๋ก๊ทธ๋จ์ ํ์ผ์ ๋ํด ํธ์ถ๋๋คํ๋ค.
- file_allow_write() ํจ์: ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋ ํ์ผ ๊ฐ์ฒด์ ์ฐ๊ธฐ ์ ํ์ ํด์ ํ๋ ํจ์๋ค .
๋์์ฑ ๋ฌธ์
- ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ํ์ผ์ ์ ๊ทผํ ๋, ์ฐ๊ธฐ ์ ํ์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๊ณ ํด์ ๋๋์ง ํ์ธํ ๊ฒ
- ํ์ํ ๊ฒฝ์ฐ lock์ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํด์ผํ ์๋ ์์
ํ์ผ ๋ซ๊ธฐ ์ ์ฒ๋ฆฌ
- ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ฑฐ๋ ํ์ผ์ด ๋ซํ์ ๋ ์ฐ๊ธฐ ์ ํ์ด ํด์ ๋๋๋ก ์ ์ฒ๋ฆฌํด์ผํ ๋ฏ.
Extend File Descriptor
ํํ ์ค๊ฐ ๋ฆฌ๋ ์ค์ stdin, stdout๋ฅผ ๋ซ๋ ๊ธฐ๋ฅ๊ณผ dup2 ์์คํ ์ฝ์ ์ง์ํ๋๋ก ๊ตฌํํ๋ค.
Open, close, read, write ์์คํ ์ฝ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๊ณผ์ผ๊ณผ์ ์ํธ์์ฉ์ ์ํํ๋ค.
ํ๋ก์ธ์ค๋ง๋ค ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ ์ด๋ธ์ ๊ด๋ฆฌํ๋ฉฐ, ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ํ์ผ๊ณผ ํ๋ก์ธ์ค ๊ฐ์ ์ฐ๊ฒฐ์ ๋ํ๋ธ๋ค.
- Open: ์๋ก์ด ํ์ผ์ ์ด์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ๊ณ ํ ์ด๋ธ์ ๋ฑ๋กํ๋ค.
- Close: ํน์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ซ๊ณ ํ ์ด๋ธ์์ ์ ๊ฑฐํ๋ฉฐ, ๋ฆฌ์์ค๋ฅผ ํด์ ํ๋ค.
- Read / write: ํน์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ด๋ค.
๊ตฌํ๋ด์ฉ
- Open, close, read, write ์์คํ ์ฝ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํตํด ํ์ผ์ ์ ๊ทผํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์๊ตฌํ
'๐ซ Krafton Jungle > PintOS Project2 _ User Programs' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Pintos] Project02 _ User Programs | Keyword | Segmentation Fault (1) | 2024.11.28 |
|---|---|
| [Pintos] Project02 _ User Programs | Keyword | Interrupt (1) | 2024.11.28 |
| ์์ ๋ฐ ๋ณด์ ํ์ - rax register (1) | 2024.11.28 |
| ์์ ๋ฐ ๋ณด์ ํ์ - Atomic Operation (0) | 2024.11.28 |
| ์์ ๋ฐ ๋ณด์ ํ์ - File Descriptor (1) | 2024.11.28 |