PintOS Project 2μμ Argument Passingμ ꡬνν λ, λ¨μν μ€νμ κ°μ μλ κ²μΌλ‘ λλλ κ²μ΄ μλλ€. μ΄ κ³Όμ μμλ λ°λμ Argument Parsing, μ¦ λ¬Έμμ΄μ μλ―Έ λ¨μλ‘ μͺΌκ°λ λ¨κ³κ° νμνλ€. μ΄ κΈμμλ νμ±(Parsing)κ³Ό ν¨μ±(Passing)μ μ°¨μ΄μ κ΄κ³λ₯Ό λͺ
ννκ² μ΄ν΄νλ κ²μ λͺ©νλ‘ νλ€.
| κ°λ | μ€λͺ | μμ |
|---|---|---|
| Argument Parsing | μ 체 컀맨λλΌμΈ λ¬Έμμ΄μ μλ―Έ λ¨μ(ν ν°)λ‘ λΆλ¦¬νλ κ³Όμ | "args-multiple a b c" β ["args-multiple", "a", "b", "c"] |
| Argument Passing | νμ±ν μΈμλ€μ μ€νμ ν¬μΈν° ννλ‘ μ¬λ¦¬λ κ³Όμ | argv λ°°μ΄κ³Ό argc κ°μ ν¬ν¨νμ¬ μ¬μ©μ μ€νμ ꡬμ±ν¨ |
Parsing (λ¬Έμμ΄ λΆλ¦¬)
thread_current()->nameμ μ μ₯λ μ 체 λ¬Έμμ΄strtok_r()λ₯Ό μ¬μ©ν΄ 곡백 κΈ°μ€μΌλ‘ λΆλ¦¬ β argv[] λ°°μ΄μ μ μ₯Passing (μ€ν ꡬμ±)
arg_addr[]μ μ μ₯ν΄ μ΄ν argv[i] ꡬμ±μ νμ©setup_stack() ꡬν ν΅μ¬static bool setup_stack(struct intr_frame *if_) {
...
// πΉ 1) νμ±: λ¬Έμμ΄μ λΆν΄
for (token = strtok_r(fn_copy, " ", &save_ptr); token != NULL;
token = strtok_r(NULL, " ", &save_ptr)) {
argv[argc++] = token;
}
// πΉ 2) ν¨μ±: λΆν΄ν λ¬Έμμ΄μ μμμΌλ‘ μ€νμ 볡μ¬
for (int i = argc - 1; i >= 0; i--) {
size_t len = strlen(argv[i]) + 1;
rsp -= len;
memcpy((void *)rsp, argv[i], len);
arg_addr[i] = (void *)rsp;
}
// πΉ κ·Έ μΈ κ΅¬μ±: word-align, NULL sentinel, argv[], argc, return address λ±
...
}
Executing 'args-many a b c d e f g':
Execution of 'args-many a b c d e f g' complete.
μ λ‘κ·Έκ° λμ¨λ€λ 건:
μ¦, Argument Passingμ μν μ€ν κ΅¬μ± μ체λ μ±κ³΅ν κ²μ΄λ€.