μ΄μ체μ λ μ¬μ©μ νλ‘κ·Έλ¨(user program)μ΄ μ§μ νλμ¨μ΄λ 컀λ μμμ μ κ·Όνλ κ±Έ κΈμ§νλ€. λμ , μ¬μ©μ νλ‘κ·Έλ¨μ΄ μ΄μ체μ μ μμ²(Request) νλ 곡μμ μΈ μΈν°νμ΄μ€κ° μλλ°, μ΄κ²μ μμ€ν μ½(System Call) μ΄λΌκ³ λΆλ₯Έλ€.
κ°λ¨ν λ§ν΄:
"컀λλ, μ΄κ±° λμ ν΄μ£ΌμΈμ!" λΌκ³ μ μ€ν μμ²νλ λ°©μ.
μ΄μ체μ κ° μ¬μ©μ νλ‘κ·Έλ¨μ 보νΈνλ 보μ κ²½κ³(User-Kernel Boundary) λ₯Ό κ°μ§κ³ μκΈ° λλ¬Έμ, λ€μκ³Ό κ°μ λμμ μ§μ μνν μ μκ³ μμ€ν μ½μ ν΅ν΄ μμ²ν΄μΌ νλ€:
PintOSλ μ°λ¦¬κ° μ§μ μμ€ν μ½ μΈν°νμ΄μ€λ₯Ό ꡬνν΄μΌλ§ ν μ€νΈλ₯Ό ν΅κ³Όν μ μλλ‘ μ€κ³λμ΄ μλ€. μ΄ 4κ°μ§ λ²μ£Όλ‘ μ 리λλ€.
| μ΄λ¦ | μ€λͺ | μμ ν μ€νΈ |
|---|---|---|
create | νμΌ μμ± | create-normal, create-empty |
open | νμΌ μ΄κΈ° | open-normal, open-null, open-boundary |
close | νμΌ λ«κΈ° | close-normal, close-twice |
read | νμΌ λλ stdin μ λ ₯ | read-normal, read-stdin |
write | νμΌ λλ stdout μΆλ ₯ | write-normal, write-stdout |
remove | νμΌ μμ | syn-remove |
filesize | μ΄λ¦° νμΌμ ν¬κΈ° λ°ν | λ΄λΆ ν μ€νΈμ© |
seek, tell | νμΌ μμΉ μ μ΄ | λ΄λΆ ν μ€νΈμ© |
ꡬν μμΉ
β userprog/syscall.c λ΄λΆμ μ§μ ꡬννκ³
β syscall_handler() ν¨μμμ switch-caseλ‘ λΆκΈ° μ²λ¦¬νλ€.
| μ΄λ¦ | μ€λͺ | μμ ν μ€νΈ |
|---|---|---|
halt | PintOS μ’ λ£ | halt |
exit | νλ‘μΈμ€ μ’ λ£ | exit, wait-simple |
fork | νμ¬ νλ‘μΈμ€λ₯Ό 볡μ | fork-once, fork-recursive |
exec | μλ‘μ΄ νλ‘κ·Έλ¨ μ€ν | exec-once, exec-bad-ptr |
wait | μμ νλ‘μΈμ€ κΈ°λ€λ¦Ό | wait-simple, wait-bad-pid |
κ΄λ ¨ ꡬ쑰체
struct thread, struct child_infoprocess.c, syscall.c, thread.c λ±read() : fd == 0μ΄λ©΄ ν€λ³΄λ μ
λ ₯write() : fd == 1μ΄λ©΄ νλ©΄ μΆλ ₯stdin, stdoutμ΄ μλ κ²½μ°μλ νμΌ λμ€ν¬λ¦½ν° ν μ΄λΈμ ν΅ν΄ μ κ·Ό
κ΄λ ¨ ν
μ€νΈ
read-stdin, write-stdout, read-bad-fd, write-bad-ptr λ±
μλͺ»λ ν¬μΈν°, μλͺ»λ νμΌ λμ€ν¬λ¦½ν°, 컀λ μμ μ κ·Ό λ± μμΈ μΌμ΄μ€λ€μ μ²λ¦¬νμ§ μμΌλ©΄ ν μ€νΈ μ€ν¨
| ν μ€νΈ μ΄λ¦ | κ²μ¦ νλͺ© |
|---|---|
read-bad-ptr | 컀λ λ©λͺ¨λ¦¬ μ κ·Ό μλ μ°¨λ¨ |
write-zero | 0λ°μ΄νΈ write μ μ μ²λ¦¬ |
bad-read2, bad-write2 | μλͺ»λ μ£Όμ μ κ·Ό κ°μ§ |
bad-jump, bad-jump2 | μ€ν νλ¦μ΄ μ΄μν κ²½μ° μ²λ¦¬ |
λ°©μ΄ μ½λ
is_user_vaddr(ptr)ptr < PHYS_BASEpml4_get_page() λ±μΌλ‘ μ ν¨μ± κ²μ¬ ν exit(-1) νΈμΆμ μ νλ‘κ·Έλ¨ syscall β INT 0x80 β syscall_entry.S β syscall_handler() β sys_XXX() νΈμΆ
κ° syscallμ 컀λ μμμ syscall.cμ μ μλλ©°, νμν κ²½μ° filesys.c, process.c, thread.c λ±μ νμΌκ³Ό μ°κ³λμ΄ λμν¨.
| ν μ€νΈ μΌμ΄μ€ | νμν μμ€ν μ½ | λ©λͺ¨ |
|---|---|---|
args-none ~ args-many | exec, exit, wait | Argument Passingλ μ°κ²°λ¨ |
halt | halt | μ μ λκΈ° |
exit | exit | exit status νμΈ |
fork-* | fork, wait, exit | λ©λͺ¨λ¦¬ λ³΅μ¬ λ° λ³΅μ νμΈ |
create-* | create | νμΌ μμ± μ ν¨μ± |
open-* | open | νμΌ λμ€ν¬λ¦½ν° μ μ μ²λ¦¬ |
close-* | close | νμΌ ν΄μ νμΈ |
read-* | read | stdin λ° νμΌ μ½κΈ° |
write-* | write | stdout λ° νμΌ μ°κΈ° |
bad-* | λͺ¨λ μμ€ν μ½ + μ ν¨μ± κ²μ¬ | ν¬μΈν°/FD/κ²½κ³ μ€λ₯ ν μ€νΈ |
syn-remove | remove | νμΌ μμ |
multi-*, lg-*, sm-* | μ 체 μ°λ ν μ€νΈ | μμ€ν μ½ μ 체 ꡬν κ²μ¦μ© |
syscall_handler()κ° μνΈλ¦¬ν¬μΈνΈμ΄κ³ , sys_XXX() ν¨μλ€μ΄ μ€μ μ²λ¦¬ λ΄λΉ