πŸ’½ KAIST:PINTOS | Roadmap | User Programs

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

KAIST:PINTOS

λͺ©λ‘ 보기
12/23

이번 μ£Ό Jungle Week10~11μ—μ„œλŠ” PintOS: User Programs 단계λ₯Ό μ§„ν–‰ν•˜λ©°,
μ•„λž˜ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ“€μ„ λͺ¨λ‘ 톡과해야 ν•œλ‹€.

ν…ŒμŠ€νŠΈ μ΄λ¦„μ˜λ―Έ
args-none인자 없이 μ‹€ν–‰ (예: run echo)
args-single인자 1개 (예: run echo hello)
args-multiple인자 μ—¬λŸ¬ 개 (예: run echo a b c)
args-many인자 ꡉμž₯히 많이 (μŠ€νƒ 경계 ν…ŒμŠ€νŠΈ)
args-dbl-space인자 사이 곡백이 μ€‘λ³΅λœ κ²½μš°λ„ μ²˜λ¦¬λ˜λŠ”μ§€

특히 이전 λ‹¨κ³„μ—μ„œ κ΅¬ν˜„ν•œ κΈ°λŠ₯듀이
이번 μ£Ό μ‹œμŠ€ν…œμ½œ, ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰ 둜직 등에 μ˜ν•΄
λ§κ°€μ§ˆ μˆ˜λ„ 있기 λ•Œλ¬Έμ—, 전체 ν…ŒμŠ€νŠΈμ˜ μž¬κ²€μ¦μ΄ ν•„μˆ˜μ΄λ‹€.


우리 νŒ€(1νŒ€)의 ν˜„μž¬ 상황

  • ν˜„μž¬ κ΅¬ν˜„ν•œ λ²”μœ„:
    args-none, args-single, args-multiple, args-many, args-dbl-space
    β†’ 즉, Argument Passing κΈ°λŠ₯을 λ¨Όμ € κ΅¬ν˜„ν•˜κ³  있음.

  • μ‹œμŠ€ν…œ μ½œμ€ 아직 κ΅¬ν˜„ν•˜μ§€ μ•Šμ•˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈ 결과의 pass 확인은 λΆˆκ°€
    λŒ€μ‹  μ•„λž˜μ²˜λŸΌ 직접 λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•΄μ„œ κ°„μ ‘μ μœΌλ‘œ 확인 쀑이닀.

pintos -v -k -T 60 -m 20 --fs-disk=10 \
  -p tests/userprog/args-multiple:args-multiple \
  -- -q -f run 'args-multiple a b c d e f g'

β†’ 이λ₯Ό 톡해 Argument Passing이 μ œλŒ€λ‘œ μˆ˜ν–‰λ˜μ—ˆλŠ”μ§€ stdout을 톡해 μ²΄ν¬ν•˜λŠ” 방식이닀.


κ΅¬ν˜„ λ‘œλ“œλ§΅(GPTμΆ”μ²œ)

Argument Passing κ΅¬ν˜„ 이후엔 λ¬΄μž‘μ • syscall을 λͺ¨λ‘ κ΅¬ν˜„ν•˜λŠ” 것이 μ•„λ‹ˆλΌ,
ν…ŒμŠ€νŠΈ μ˜μ‘΄μ„±κ³Ό κ΅¬ν˜„ λ‚œμ΄λ„λ₯Ό κ³ λ €ν•œ μ „λž΅μ μΈ κ΅¬ν˜„ μˆœμ„œκ°€ ν•„μš”ν•˜λ‹€.


Step 1. μ‹œμŠ€ν…œμ½œ ꡬ쑰 μ„€μ • + ν•„μˆ˜ syscall

μ‹œμŠ€ν…œ μ½œκ΅¬ν˜„ 이유
haltκ°€μž₯ 간단. μ‹œμŠ€ν…œ μ’…λ£Œμš© (shutdown_power_off() 호좜)
exitν”„λ‘œμ„ΈμŠ€ μ’…λ£Œ μ‹œ λ°˜ν™˜κ°’ 전달. wait와 연결됨
waitλΆ€λͺ¨κ°€ μžμ‹ ν”„λ‘œμ„ΈμŠ€μ˜ μ’…λ£Œλ₯Ό κΈ°λ‹€λ¦Ό
execμžμ‹ ν”„λ‘œμ„ΈμŠ€λ₯Ό μ‹€ν–‰. start_process() 호좜 트리거

이 λ„€ κ°€μ§€λŠ” syscall 전체 ꡬ쑰λ₯Ό μ„ΈνŒ…ν•˜λŠ” 데 ν•„μˆ˜μ΄λ‹€.
syscall 번호 β†’ dispatch β†’ handler κ΅¬ν˜„ 흐름을 μ΄λ•Œ μ™„μ„±ν•΄μ•Ό ν•œλ‹€.


Step 2. 파일 μž…μΆœλ ₯ syscall

μ‹œμŠ€ν…œ μ½œκ΅¬ν˜„ 이유
create, open파일 생성, μ—΄κΈ° κΈ°λŠ₯. 파일 μ‹œμŠ€ν…œ 연동 μ‹œμž‘
write, readstdout / stdin μ²˜λ¦¬λΆ€ν„° μ‹œμž‘, 점차 ν™•μž₯
closeμ—΄λ¦° νŒŒμΌμ„ λ‹«κ³  μžμ› 정리

μ—¬κΈ°μ„œλΆ€ν„°λŠ” 파일 λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ”, inode μ ‘κ·Ό, 동기화(lock) λ“±μ˜ κ°œλ…μ΄ 본격적으둜 λ“±μž₯ν•œλ‹€.


Step 3. fork()와 μžμ‹ ν”„λ‘œμ„ΈμŠ€ 볡사

핡심 κ΅¬ν˜„ ν•­λͺ©μ„€λͺ…
process_fork()λΆ€λͺ¨μ˜ λ ˆμ§€μŠ€ν„° μƒνƒœ, μŠ€νƒ, νŽ˜μ΄μ§€ ν…Œμ΄λΈ” 볡사
fd λ³΅μ‚¬νŒŒμΌ λ””μŠ€ν¬λ¦½ν„° ν…Œμ΄λΈ” 볡사 ν•„μš”
λ™κΈ°ν™”μžμ‹μ˜ λ‘œλ”© μ™„λ£Œλ₯Ό 기닀리기 μœ„ν•΄ sema_down/up μ‚¬μš©

fork-*, multi-child-fd λ“±μ˜ ν…ŒμŠ€νŠΈλ“€μ΄ 이 κΈ°λŠ₯을 κ²€μ¦ν•œλ‹€.


Step 4. λ©”λͺ¨λ¦¬ 보호, μ˜ˆμ™Έμ²˜λ¦¬, λŒ€ν˜• ν…ŒμŠ€νŠΈ

ν…ŒμŠ€νŠΈ μ˜μ—­μ„€λͺ…
rox-*μ‹€ν–‰ νŒŒμΌμ„ 읽기 μ „μš©μœΌλ‘œ λ§€ν•‘ν–ˆλŠ”μ§€ 확인
bad-*잘λͺ»λœ μ£Όμ†Œ 접근에 λŒ€ν•΄ page faultκ°€ 잘 λ‚˜λŠ”μ§€ 확인
lg-*, sm-*λŒ€κ·œλͺ¨ ν• λ‹Ή/νŒŒμΌμ„ ν…ŒμŠ€νŠΈ. OOM(out of memory) 체크
syn-*파일 동기화 처리 확인

이 λ‹¨κ³„λŠ” λ‚œμ΄λ„κ°€ λ†’μœΌλ©° lazy loading, stack growth, page fault handler κ΅¬ν˜„μ΄ ν•„μš”ν•΄μ§„λ‹€.


μš°λ¦¬κ°€ κ΅¬ν˜„ν•œ κΈ°λŠ₯이 μ§€λ‚œ μ£Ό 것듀을 λ§κ°€λœ¨λ¦΄ 수 μžˆλ‹€

  • μ§€λ‚œ 주의 alarm-*, priority-* λ“± ν…ŒμŠ€νŠΈλ„ 이번 주에 μž¬κ²€μ¦ λŒ€μƒ
  • 이유: μ‹œμŠ€ν…œμ½œ, λ©”λͺ¨λ¦¬ λ§€ν•‘ λ“± 핡심 λ™μž‘ 방식이 λ°”λ€Œλ©΄ 컀널 ꡬ쑰 μžμ²΄κ°€ 깨질 수 있기 λ•Œλ¬Έμ΄λ‹€.

μ΅œμ’… κ΅¬ν˜„ μˆœμ„œ μš”μ•½

[μ™„λ£Œ]
1. Argument Passing: args-none ~ args-dbl-space

[μš°μ„  κ΅¬ν˜„]
2. halt / exit / wait / exec β†’ syscall ꡬ쑰 μ„€μ •
3. create / open / read / write / close β†’ 파일 syscall
4. fork / μžμ‹ λ©”λͺ¨λ¦¬ 볡사 / fd ν…Œμ΄λΈ” 볡사
5. rox / bad / lg / sm / syn λ“± κ³ κΈ‰ ν…ŒμŠ€νŠΈ

[μ°Έκ³ ]
- ν…ŒμŠ€νŠΈ ν•˜λ‚˜λ‹Ή μ‹œμŠ€ν…œμ½œμ„ μ‘°κΈˆμ”© μΆ”κ°€ν•˜λ©° μ μ§„μ μœΌλ‘œ μ™„μ„±ν•  것
- syscall.c, process.c, file.c, pagedir.c λ“± 파일 쀑심 λΆ„μ—… μΆ”μ²œ
profile
μ„œνˆ΄μ§€μ–Έμ • 늘 행동이 먼저이기λ₯Ό

0개의 λŒ“κΈ€