์ ์ ํ๋ก๊ทธ๋จ์ ์คํํ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๊ฐ ์๋ค๊ณ ํ์.
args-many a b c d e f g
๊ทธ๋ผ ์ ์ ํ๋ก์ธ์ค ๋ด๋ถ์ main(int argc, char **argv)๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ ๋ฐ์์ผ ํ๋ค.
argc == 8
argv[0] == "args-many"
argv[1] == "a"
argv[2] == "b"
...
argv[7] == "g"
์ด๊ฒ์ ์ํด Pintos๋ ์ปค๋์์ ๋ฌธ์์ด์ ํ์ฑํ๊ณ , ์ธ์๋ค์ ์คํ์ pushํ์ฌ ์ ์ ํ๋ก๊ทธ๋จ์ด main()์ ํธ์ถํ ์ ์๋๋ก ํด์ค์ผ ํ๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ Argument Passing์ด๋ผ๊ณ ํ๋ค.
| ๋จ๊ณ | ํจ์ | ์์น | ๋ด์ฉ | ํ์ฌ ์ํ |
|---|---|---|---|---|
| 1 | process_exec() | userprog/process.c | ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด ํ์ฑ (strtok_r ์ด์ฉ) | ๊ตฌํ ์๋ฃ |
| 2 | load() | userprog/process.c | ์คํ ํ์ผ ๋ก๋ฉ, ์คํ ๊ณต๊ฐ ์์ฑ (setup_stack) | ๊ตฌํ ์๋ฃ |
| 3 | setup_stack() | userprog/process.c | ์ ์ ์คํ ํ์ด์ง ํ ๋น, rsp ์ด๊ธฐํ | ๊ตฌํ ์๋ฃ |
| 4 | argument_stack() | userprog/process.c | ์ธ์ push ๋ฐ rsp ์ค์ | ๊ตฌํ ํ์ |
| 5 | do_iret() | userprog/process.c | ์ ์ ์ฝ๋ ์ง์ | ๊ตฌํ ์๋ฃ (์์ ํ์ ์์) |
userprog/process.cprocess_exec()char *argv[64];
int argc=0;
char *token;
char *save_pointer;
token = strtok_r(file_name, " ", &save_pointer);
while (token != NULL) {
argv[argc] = token;
token = strtok_r(NULL, " ", &save_pointer);
argc++;
}
argc == 8
argv[0] == "args-many"
argv[1] == "a"
...
argv[7] == "g"
argv[]๋ฅผ ์ด์ฉํด์ ์ ์ ์คํ์ ๋ค์ ๋ด์ฉ์ ์ ํํ ๋ฃ์ด์ค์ผ ํ๋ค.
argv[i])argv[] ๋ฐฐ์ด ์์ฒด์ ์ฃผ์argcuserprog/process.cvoid argument_stack(char **argv, int argc, void **rsp);
void argument_stack(char **argv, int argc, void **rsp) {
char *arg_addr[64];
// ์ธ์ ๋ฌธ์์ด๋ค์ ์คํ์ push (๋ค์์๋ถํฐ)
for (int i = argc - 1; i >= 0; i--) {
int len = strlen(argv[i]) + 1;
*rsp -= len;
memcpy(*rsp, argv[i], len);
arg_addr[i] = *rsp; // ๋ณต์ฌ๋ ์ฃผ์ ์ ์ฅ
}
// 8๋ฐ์ดํธ ์ ๋ ฌ
while ((uintptr_t)(*rsp) % 8 != 0) {
*rsp -= 1;
*(uint8_t *)(*rsp) = 0;
}
// ๊ฐ argv[i] ์ฃผ์ push
*rsp -= sizeof(char *);
*(char **)(*rsp) = NULL; // argv[argc] = NULL
for (int i = argc - 1; i >= 0; i--) {
*rsp -= sizeof(char *);
*(char **)(*rsp) = arg_addr[i];
}
// argv ํฌ์ธํฐ ์ ์ฅ
char **argv_start = *rsp;
*rsp -= sizeof(char **);
*(char ***)(*rsp) = argv_start;
// argc ์ ์ฅ
*rsp -= sizeof(int);
*(int *)(*rsp) = argc;
// fake return address
*rsp -= sizeof(void *);
*(void **)(*rsp) = 0;
}
userprog/process.cprocess_exec()load()๊ฐ ๋๋ ์งํ ๋ค์ ์ค์ ์ถ๊ฐํ๋ฉด ๋จ
argument_stack(argv, argc, &(_if.rsp));
์ต์ข ๊ตฌ์กฐ๋ ์ด๋ ๊ฒ ๋จ:
success = load (file_name, &_if);
palloc_free_page (file_name);
if (!success)
return -1;
// argument_stack ํจ์ ํธ์ถ ์ถ๊ฐ
argument_stack(argv, argc, &(_if.rsp));
// ์ ์ ํ๋ก์ธ์ค๋ก ์ง์
do_iret(&_if);
๋ค์ ๋ช ๋ น์ด๋ก ํ ์คํธํ ์ ์๋ค:
../../utils/pintos -v -k -T 60 -m 20 --fs-disk=10 \
-p tests/userprog/args-many:args-many \
-- -q -f run 'args-many a b c d e f g'
์ ์์ ์ผ๋ก ํต๊ณผ๋๋ฉด ์ถ๋ ฅ์์ ๊ฐ ์ธ์๊ฐ ์ ์ถ๋ ฅ๋๋ค.
b process_exec
c
x/s argv[0]
x/s argv[1]
...
x/40cb file_name
print argc
x/20x $rsp
x/s, x/20x, print argc ๋ฑ์ ๋ฌธ์์ด ํ์ธ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ํ๋ฅผ ์ถ์ ํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํ๋ค.๋จ์ ๊ฑด ์ค์ง ํ๋:
์ด๊ฑธ ์๋ฃํ๋ฉด, ๋ชจ๋ Argument Passing ํ ์คํธ ์ผ์ด์ค๋ ํต๊ณผ??
When debugging my OS project, I kept failing stack tests until I realizedโproper argument passing means nothing without system calls! That "No" verdict haunted me until I discovered https://wacky-flip-game.com/. Their wacky flip approach to low-level coding (exit() implementations especially) became my secret weapon. Suddenly, stack frames aligned like magic. Turns out, even perfect assembly crashes without the right syscallsโlesson
When debugging my OS project, I kept failing stack tests until I realizedโproper argument passing means nothing without system calls! That "No" verdict haunted me until I discovered https://wacky-flip-game.com/. Their wacky flip approach to low-level coding (exit() implementations especially) became my secret weapon. Suddenly, stack frames aligned like magic. Turns out, even perfect assembly crashes without the right syscallsโlesson
When debugging my OS project, I kept failing stack tests until I realizedโproper argument passing means nothing without system calls! That "No" verdict haunted me until I discovered https://wacky-flip-game.com/. Their wacky flip approach to low-level coding (exit() implementations especially) became my secret weapon. Suddenly, stack frames aligned like magic. Turns out, even perfect assembly crashes without the right syscallsโlesson
ใฑใ ใฑใ