🌹 μ •λ¦¬ by μž₯λ―Έ(https://velog.io/@newbiekim/)

μ‹œμŠ€ν…œ μ½œμ€ μ‚¬μš©μž κ³΅κ°„μ˜ μ½”λ“œμ—μ„œ 컀널 μ„œλΉ„μŠ€(ν•¨μˆ˜)λ₯Ό μš”μ²­ν•˜λŠ” 과정을 λ§ν•œλ‹€.

μ‹œμŠ€ν…œ 호좜(System Call)은 운영체제의 컀널이 μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€μ— λŒ€ν•΄, μ‘μš© ν”„λ‘œκ·Έλž¨μ˜ μš”μ²­μ— 따라 컀널에 μ ‘κ·Όν•˜κΈ° μœ„ν•œ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 보톡 Cλ‚˜ C++κ³Ό 같은 κ³ κΈ‰ μ–Έμ–΄λ‘œ μž‘μ„±λœ ν”„λ‘œκ·Έλž¨λ“€μ€ 직접 μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©ν•  수 μ—†κΈ° λ•Œλ¬Έμ— κ³ κΈ‰ APIλ₯Ό 톡해 μ‹œμŠ€ν…œ ν˜ΈμΆœμ— μ ‘κ·Όν•˜κ²Œ ν•˜λŠ” 방법이닀.

컀널 콜(kernel call), 트랩(trap)이라고도 λΆ€λ₯΄λ©°, μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ 컀널 κΈ°λŠ₯을 ν™œμš©ν•˜λ„λ‘ μ œκ³΅ν•œλ‹€.

μ‹œμŠ€ν…œ 호좜 라이브러리λ₯Ό 톡해 κ·Έ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆλ‹€.

μš°λ¦¬κ°€ κ°œλ°œν•˜λŠ” ν”„λ‘œκ·Έλž¨μ€ 일반적으둜 μœ μ € λͺ¨λ“œ(User Mode)μ—μ„œ μ‹€ν–‰ν•œλ‹€. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μΈν„°λŸ½νŠΈ(Interrupt)κ°€ λ°œμƒν•˜κ±°λ‚˜ μ‹œμŠ€ν…œ 콜(System Call)을 ν˜ΈμΆœν•˜κ²Œ 되면 컀널 λͺ¨λ“œ(Kernel Mode)둜 μ „ν™˜λœλ‹€.

컀널 λͺ¨λ“œλ‘œ μ „ν™˜λ  λ•Œμ—λŠ” μ‹€ν–‰ μ€‘μ΄λ˜ ν”„λ‘œκ·Έλž¨μ˜ ν˜„μž¬ CPU μƒνƒœλ₯Ό μ €μž₯ν•œλ‹€. 그리고 컀널이 μΈν„°λŸ½νŠΈλ‚˜ μ‹œμŠ€ν…œ μ½œμ„ 직접 μ²˜λ¦¬ν•œλ‹€. μ²˜λ¦¬κ°€ μ™„λ£Œλ˜λ©΄ μ€‘λ‹¨λλ˜ ν”„λ‘œκ·Έλž¨μ˜ CPU μƒνƒœλ₯Ό λ‹€μ‹œ λ³΅μ›ν•œλ‹€.

OS 컀널이 μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€λ₯Ό ν”„λ‘œκ·Έλž¨μ΄ μ΄μš©ν•˜κ³  싢을 λ•Œ μ‹œμŠ€ν…œ μ½œμ„ μ΄μš©ν•œλ‹€. μ‹œμŠ€ν…œ 콜이 λ°œμƒν•˜λ©΄ ν•΄λ‹Ή 컀널 μ½”λ“œκ°€ 컀널 λͺ¨λ“œμ—μ„œ μ‹€ν–‰λœλ‹€.

ν•˜λ“œμ›¨μ–΄ ν˜Ήμ€ μ‹œμŠ€ν…œ κ΄€λ ¨ κΈ°λŠ₯은 μ–΄λ–€ ν”„λ‘œκ·Έλž¨μ΄λΌλ„ λ°˜λ“œμ‹œ μ‹œμŠ€ν…œ μ½œμ„ ν†΅ν•΄μ„œλ§Œ μ‚¬μš© κ°€λŠ₯ν•˜λ‹€.

ν•˜μ§€λ§Œ μš°λ¦¬λŠ” κ°œλ°œν•  λ•Œ 직접 OS μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©ν•œ 적이 μ—†λ‹€. κ·ΈλŸΌμ—λ„ μš°λ¦¬λŠ” μ§€κΈˆκΉŒμ§€ 파일 I/O, λ„€νŠΈμ›Œν¬ I/O, ν”„λ‘œμ„ΈμŠ€, μŠ€λ ˆλ“œ κ΄€λ ¨ μž‘μ—…μ„ 잘 ν•΄μ™”λ‹€.

이게 μ–΄λ–»κ²Œ κ°€λŠ₯ν–ˆλ˜ κ²ƒμΌκΉŒ?

μš°λ¦¬κ°€ μ‚¬μš©ν•˜λŠ” ν”„λ‘œκ·Έλž˜λ° 언어듀이 μ‹œμŠ€ν…œ μ½œμ„ 포μž₯(wrapping)ν•˜μ—¬ κ°„μ ‘μ μœΌλ‘œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ œκ³΅ν–ˆκΈ° λ•Œλ¬Έμ΄λ‹€.