πŸ’Ώ KAIST:PINTOS | Concept | Argument Parsing vs Passing

μ΄μˆœκ°„Β·2025λ…„ 5μ›” 18일

KAIST:PINTOS

λͺ©λ‘ 보기
13/23

λͺ©ν‘œ

PintOS Project 2μ—μ„œ Argument Passing을 κ΅¬ν˜„ν•  λ•Œ, λ‹¨μˆœνžˆ μŠ€νƒμ— 값을 μŒ“λŠ” κ²ƒμœΌλ‘œ λλ‚˜λŠ” 것이 μ•„λ‹ˆλ‹€. 이 κ³Όμ • μ•žμ—λŠ” λ°˜λ“œμ‹œ Argument Parsing, 즉 λ¬Έμžμ—΄μ„ 의미 λ‹¨μœ„λ‘œ μͺΌκ°œλŠ” 단계가 ν•„μš”ν•˜λ‹€. 이 κΈ€μ—μ„œλŠ” νŒŒμ‹±(Parsing)κ³Ό νŒ¨μ‹±(Passing)의 차이와 관계λ₯Ό λͺ…ν™•ν•˜κ²Œ μ΄ν•΄ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•œλ‹€.


μ •μ˜: Parsing vs Passing

κ°œλ…μ„€λͺ…μ˜ˆμ‹œ
Argument Parsing전체 μ»€λ§¨λ“œλΌμΈ λ¬Έμžμ—΄μ„ 의미 λ‹¨μœ„(토큰)둜 λΆ„λ¦¬ν•˜λŠ” κ³Όμ •"args-multiple a b c" β†’ ["args-multiple", "a", "b", "c"]
Argument PassingνŒŒμ‹±ν•œ μΈμžλ“€μ„ μŠ€νƒμ— 포인터 ν˜•νƒœλ‘œ μ˜¬λ¦¬λŠ” κ³Όμ •argv λ°°μ—΄κ³Ό argc 값을 ν¬ν•¨ν•˜μ—¬ μ‚¬μš©μž μŠ€νƒμ„ ꡬ성함

전체 흐름 μš”μ•½

  1. Parsing (λ¬Έμžμ—΄ 뢄리)

    • thread_current()->name에 μ €μž₯된 전체 λ¬Έμžμ—΄
    • strtok_r()λ₯Ό μ‚¬μš©ν•΄ 곡백 κΈ°μ€€μœΌλ‘œ 뢄리 β†’ argv[] 배열에 μ €μž₯
  2. Passing (μŠ€νƒ ꡬ성)

    • λΆ„λ¦¬ν•œ λ¬Έμžμ—΄μ„ μ—­μˆœμœΌλ‘œ μ‚¬μš©μž μŠ€νƒμ— push
    • 각각의 λ¬Έμžμ—΄ μ£Όμ†Œλ„ arg_addr[]에 μ €μž₯ν•΄ 이후 argv[i] ꡬ성에 ν™œμš©
    • μ •λ ¬(Word-align), NULL sentinel, argc, argv, fake return addressλ₯Ό μŠ€νƒμ— ꡬ성

핡심 ν•¨μˆ˜: 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 λ“±
  ...
}

μ‹œμŠ€ν…œμ½œ 없이 Passing 성곡 μ—¬λΆ€λ₯Ό ν™•μΈν•˜λŠ” 법

μ„±κ³΅ν•œ Argument Passing의 간접적 νŒλ‹¨ κΈ°μ€€

Executing 'args-many a b c d e f g':
Execution of 'args-many a b c d e f g' complete.

μœ„ λ‘œκ·Έκ°€ λ‚˜μ˜¨λ‹€λŠ” 건:

  • μœ μ € ν”„λ‘œκ·Έλž¨μ΄ μ •μƒμ μœΌλ‘œ λ‘œλ“œλ˜μ—ˆκ³ 
  • μ»€λ„μ—μ„œ μŠ€νƒ μ„ΈνŒ…μ— μ‹€νŒ¨ν•˜μ§€ μ•Šμ•˜μœΌλ©°
  • λ°˜ν™˜κΉŒμ§€ μ™„λ£Œλ˜μ—ˆλ‹€λŠ” λœ»μ΄λ‹€.

즉, Argument Passing에 μ˜ν•œ μŠ€νƒ ꡬ성 μžμ²΄λŠ” μ„±κ³΅ν•œ 것이닀.


μš”μ•½

  • Argument Passing을 ν•˜κΈ° μœ„ν•΄μ„  λ°˜λ“œμ‹œ Parsing이 λ¨Όμ € μ„ ν–‰λ˜μ–΄μ•Ό ν•œλ‹€.
  • Parsing은 λ¬Έμžμ—΄μ„ λ‚˜λˆ„λŠ” κ³Όμ •, Passing은 그것을 μŠ€νƒμ— μ˜¬λ¦¬λŠ” 과정이닀.
  • μ‹œμŠ€ν…œμ½œμ„ 아직 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•„λ„, ν”„λ‘œκ·Έλž¨μ΄ 정상 μ‹€ν–‰λ˜λ©΄ PassingκΉŒμ§€λŠ” μ„±κ³΅ν•œ 것이라 κ°„μ ‘μ μœΌλ‘œ νŒλ‹¨ν•  수 μžˆλ‹€.
profile
μ„œνˆ΄μ§€μ–Έμ • 늘 행동이 먼저이기λ₯Ό

0개의 λŒ“κΈ€