์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- ์ด๋ฒคํธ ํจ์ ์คํ ์์
- ์ ์-์ ํฌ
- ์ ๋ํฐ
- 4๊ธฐ
- ๋ฐฑ์ค
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- TiL
- ์๊ณ ๋ฆฌ์ฆ
- pintos
- ์ฐ๊ฒฐ๋ฆฌ์คํธ
- ํฌ๋ํํค์ ๊ธ4๊ธฐ
- Unity
- ๋คํธ์ํฌ
- ์๊ณ ๋ฆฌ์ฆ์์ -๋๋น์ฐ์ ํ์2
- ์ถ์ํด๋์ค์์ธํฐํ์ด์ค
- ํฌ๋ํํค์ ๊ธ
- anonymous page
- ํฌ๋ํํค ์ ๊ธ 4๊ธฐ
- KRAFTON JUNGLE
- ๋ค์ต์คํธ๋ผ
- User Stack
- ์ค๋ธ์
- ํฌ๋ํํค ์ ๊ธ
- ํํ ์ค
- ํ์ด์ฌ
- kraftonjungle
- C
- BFS
- c#
- project3
- Today
- Total
๋ง๊ฐ๋ก๊ทธ
ํฌ๋ํํค ์ ๊ธ WEEK08 DAY69 - PintOS Project2 system call - halt,exit,wrtie,create ๋ณธ๋ฌธ
ํฌ๋ํํค ์ ๊ธ WEEK08 DAY69 - PintOS Project2 system call - halt,exit,wrtie,create
habbn 2024. 3. 16. 22:59๐2024.3.16
1. system call ๊ตฌํ - halt, exit, write, create
System Calls ๊ตฌํ
์์คํ ์ฝ ํธ๋ค๋ฌ์ธ syscall_handler()๊ฐ ์ ์ด๊ถ์ ์ป์ผ๋ฉด, ์์คํ ์ฝ ๋ฒํธ๊ฐ %rax์ ์์ผ๋ฉฐ, ์ธ์๊ฐ๋ค์ ์์๋๋ก ์ ๋ฌ๋๋ค. (%rdi, %rsi, %rdx, %r10, %r8 and %r9)
ํธ์ถ์์ ๋ ์ง์คํฐ๋ struct intr_frame์ผ๋ก ์ ๋ฌ๋์ด ์ ๊ทผํ ์ ์๋ค.(struct infr_frame์ ์ปค๋ ์คํ์ ์๋ค.)
์ ์ ํ๋ก๊ทธ๋จ์ ํ๋กํ ํ์ ์ include/lib/user/syscall.h ๋ด๊ฒจ ์๋ค. (์ด๊ณณ์ ํค๋ ํ์ผ๊ณผ ๋ค๋ฅธ include/lib/user์ ์๋ ํ์ผ๋ค์ ์ ์ ํ๋ก๊ทธ๋จ์์๋ง ์ฌ์ฉ๋๋ค.)
-> user/syscall.c ์์ syscall_handler()๋ฅผ ๊ตฌํํด์ ์์คํ ์ฝ ๋ฒํธ, ์ธ์๋ค์ ๋ฐ์์์ ๊ทธ์ ์๋ง์ ์ก์ ์ ์ทจํ๋๋ก ์์คํ ์ฝ ํจ์๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
1. halt
src/include/threads/init.h์ ์ ์ธ๋ power_off()๋ฅผ ํธ์ถํ๋ฉด์ ํํ ์ค๋ฅผ ์ข ๋ฃํ๋ค.
-> #include "threads/init.h" ์ถ๊ฐํด์ผ ๋จ
void halt (void)
{
power_off();
}
2. exit
ํ์ฌ ๋์ ์ค์ธ ์ ์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๊ณ , ์ปค๋๋ก ์ํ๋ฅผ ๋ฐํํ๋ค. ๋ง์ฝ ํ๋ก์ธ์ค์ ๋ถ๋ชจ๊ฐ wait ์ํ๋ผ๋ฉด , wait์ ๋ค์ด๊ฐ ์ํ๋ฅผ ๋ฐํํ ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ํ๊ฐ 0์ด๋ฉด ์ฑ๊ณต, 0์ด ์๋ ์๋ ์๋ฌ๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
void exit (int status)
{
struct thread *cur = thread_current();
printf("%s: exit(%d)\n", cur->name, status);
thread_exit();
}
3. write
buffer๋ก๋ถํฐ open file fd๋ก size ๋ฐ์ดํธ๋ฅผ ์ ์ด์ค๋ค. ์ค์ ๋ก ์ ํ ๋ฐ์ดํธ์ ์ ๋ฐํํด ์ฃผ๊ณ , ์ผ๋ถ ๋ฐ์ดํธ๊ฐ ์ ํ์ง ๋ชปํ๋ค๋ฉด size๋ณด๋ค ๋ ์์ ๋ฐ์ดํธ ์๊ฐ ๋ฐํ๋ ์ ์๋ค. ๋ ์ด์ ๋ฐ์ดํธ๋ฅผ ์ ์ ์ ์๋ค๋ฉด 0์ ๋ฐํํ๋ค.
putbuf()๋ฅผ ํตํด ํ๋ฒ์ ํธ์ถํ์ฌ ๋ชจ๋ ๋ด์ฉ์ ๋ฒํผ์ ๋ด๋๋ค.
int write (int fd, const void *buffer, unsigned length)
{
int byte = 0;
if(fd == 1)
{
putbuf(buffer, length);
byte = length;
}
return byte;
}
4. create
file์ ์ด๋ฆ์ผ๋ก ํ๊ณ ํฌ๊ธฐ๊ฐ inital_size์ธ ์๋ก์ด ํ์ผ์ ์์ฑํ๋ค. ์ฑ๊ณต์ ์ผ๋ก ํ์ผ ์์ฑํ๋ฉด true, ์คํจ false ๋ฐํํ๋ค.
bool create (const char *file, unsigned initial_size)
{
if(!check_address(file))
return filesys_create (file, initial_size);
}
์ฃผ์ด์ง ํฌ์ธํฐ ์ ํจํ ์ฃผ์๊ฐ์ ๊ฐ์ง๋์ง ํ์ธํ๊ธฐ ์ํด check_address() ํจ์๋ฅผ ์์ฑํ์๋ค.
๋ง์ผ ์ ํจํ ์ฃผ์๊ฐ์ด๋ฉด filesys_create()๋ก ํ์ผ ์์ฑํ๋๋ก ํ์๋ค.
void check_address(void *file_addr)
{
struct thread *t = thread_current();
if(pml4_get_page(t->pml4, file_addr) == NULL || !is_user_vaddr(file_addr) || file_addr == NULL)
exit(-1);
}
1. ํ์ด์ง ํ ์ด๋ธ์ ํตํด ์ฃผ์ด์ง ์ฃผ์๊ฐ ์ ํจํ์ง ํ์ธํ๋ค.
2. ์ฃผ์ด์ง ์ฃผ์๊ฐ ์ ํจํ ์ฌ์ฉ์ ์์ญ ์ฃผ์์ธ์ง ํ์ธํ๋ค.
3. file_addr์ด NULL์ธ์ง ํ์ธํ์ฌ ์์ธ ์ฒ๋ฆฌํ๋ค.
pml4(page map level 4)
x86 ์ํคํ ์ฒ์์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๋งคํ์ ์ ์ดํ๋ ํ์ด์ง ํ ์ด๋ธ์ ์ต์์ ๋ ๋ฒจ์ด๋ค.
์ค๋์ ์ฌ๊ธฐ๊น์ง ๊ตฌํํ๋ค. ๊ฐ์ ํ์ ๋ถ๋ค์ด ๋ค ์ํ์ ์ ์ค๋ ์ํ ํ๋๋ ๋ญ ํด์ผ ๋ ์ง ๊ฐ์ด ํ๋๋ ์ ์กํ์์๋๋ฐ ๋ง์๋์ด ์ ํฌ ์กฐ ํ๋ ๊ฑฐ ๋ณด์ค๋์? ํ์ ์ ๋ค์์ ์ฒญ๊ฐํ๋ค ๋ณด๋ ์ํ! ์ํ! ์ํ 3๋ฒ ์ธ์นจ
๊ทธ๋์ ๋ฐ๋ก ์๋ฆฌ ๊ฐ์ ํ๋๋ pass pass pass..
๊ทผ๋ฐ ์ด๊ฑธ ์ข์ํด์ผ ํ ์ง ๋ด๊ฐ ํ ๊ฒ ์๋๋ผ ์ด์ฐ ๋ณด๋ฉด ๋ต์์ง๋ฅผ ๋ณด๊ณ ๊ณ ๋๋ก ์ ์ด์ ํ ๊ฑฐ๋๊น.. ๊ทธ๋๋ ๋ง์๋ ๋๋ถ์ ๊ธธ์ด ํธ์์ผ๋ ์ด์ ๋ ๋ค์ ์ค์ค๋ก ํด์ผ๊ฒ ๋ค!