Linux

Linux System Calls λ¦¬λˆ…μŠ€ μ‹œμŠ€ν…œ 호좜

🐧 Yon 2023. 3. 8. 00:09
λ°˜μ‘ν˜•

Linux System Calls

I. μ‹œμŠ€ν…œ 호좜(System Calls) κ°œμš”

- μ‹œμŠ€ν…œ 호좜(System Call)은 컀널이 μžμ‹ μ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ λ§Œλ“  μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 컀널은 μ‚¬μš©μžλ‚˜ μ‘μš© ν”„λ‘œκ·Έλž¨μœΌλ‘œλΆ€ν„° 컴퓨터 μžμ›μ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄ μžμ›μ— 직접 μ ‘κ·Όν•˜λŠ” 것을 μ°¨λ‹¨ν•˜λ―€λ‘œ, μžμ›μ„ μ΄μš©ν•˜λ €λ©΄ μ‹œμŠ€ν…œ ν˜ΈμΆœμ΄λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ΄μš©ν•˜μ—¬ μ ‘κ·Όν•΄μ•Ό ν•œλ‹€.

- μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ κ·Όλ³Έμ μœΌλ‘œ μœ μ €λͺ¨λ“œμ—μ„œ μ‹€ν–‰λ˜κ³  μžˆλŠ” ν”„λ‘œκ·Έλž¨μœΌλ‘œλΆ€ν„° OSλ₯Ό ν–₯ν•΄ λ§Œλ“€μ–΄μ§„ μš”μ²­μœΌλ‘œμ¨, νŠΉμ • κΆŒν•œμ΄ ν•„μš”ν•œ μ•‘μ…˜μ„ μˆ˜ν–‰ν•˜λ„둝 μš”μ²­ν•œλ‹€. κ°€μž₯ ν”ν•œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ˜ μ˜ˆμ‹œλŠ” νŒŒμΌμ„ μ—΄κΈ°,λ‹«κΈ°,μƒˆλ‘œμš΄ ν”„λ‘œμ„ΈμŠ€ μƒμ„±ν•˜κΈ°, λ©”λͺ¨λ¦¬ κ΄€λ¦¬ν•˜κΈ° λ“±μ˜ μž‘업이 μžˆλ‹€. μ΄λŸ¬ν•œ μž‘업듀은 μœ μ € λ ˆλ²¨ μ½”λ“œμ—μ„œ μ§μ ‘ μˆ˜ν–‰λ  μˆ˜ μ—†κΈ° λ•Œλ¬Έμ— μ»€λ„, OS λ ˆλ²¨μ—μ„œ μˆ˜ν–‰λœλ‹€.
  
- μ‘μš© ν”„λ‘œκ·Έλž¨ μž…μž₯μ—μ„œμ˜ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚΄νŽ΄λ³΄λ©΄, μ–΄λ–€ μ‘μš© ν”„λ‘œκ·Έλž¨μ€ μˆ«μž 14λ₯Ό, λ˜ μ–΄λ–€ μ‘μš© ν”„λ‘œκ·Έλž¨μ€ μˆ«μž 21을 ν•˜λ“œλ””μŠ€ν¬μ— μ €μž₯ν•˜λ € ν•œλ‹€κ³  κ°€μ •ν•  μˆ˜ μžˆλ‹€. λ‘ μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μžκΈ° λ§ˆμŒμ— λ“œλŠ” μœ„μΉ˜μ— μ§μ ‘ μ ‘κ·Όν•˜μ—¬ λ°μ΄ν„°λ₯Ό μ €μž₯ν•  μˆ˜ μžˆλ„둝 ν—ˆμš©ν•œλ‹€λ©΄, λ‹€λ₯Έ μ‚¬λžŒμ˜ λ°μ΄ν„°λ₯Ό μ§€μš°κ±°λ‚˜ λ‚΄ λ°μ΄ν„°κ°€ λ‹€λ₯Έ μ‚¬λžŒμ— μ˜ν•΄ μ§€μ›Œμ§ˆ μˆ˜λ„ μžˆλ‹€.
  
- μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ ν†΅ν•œ μ ‘κ·Όμ˜ κ²½μš°, μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ§μ ‘ ν•˜λ“œλ””μŠ€ν¬μ— λ°μ΄ν„°λ₯Ό μ €μž₯ν•˜μ§€ μ•Šκ³  μ»€λ„μ΄ μ œκ³΅ν•˜λŠ” write() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ°μ΄ν„°λ₯Ό μ €μž₯해달라고 μš”μ²­ν•˜λŠ” κ²ƒμ΄λ‹€. μ‘μš© ν”„λ‘œκ·Έλž¨μ€ λ°μ΄ν„°κ°€ ν•˜λ“œλ””μŠ€ν¬μ˜ μ–΄λŠ μœ„μΉ˜μ— μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ €μž₯λ˜λŠ”μ§€ μ§μ ‘ μ•Œ μˆ˜ μ—†κ³ , λ°μ΄ν„°λ₯Ό μ½μ„ λ•ŒλŠ” read() ν•¨μˆ˜λ‘œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ΄μš©ν•˜μ—¬ κ°€μ Έμ˜¬ μˆ˜ μžˆλ‹€. μ΄μ²˜λŸΌ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ΄μš©ν•˜λ©΄ μ»€λ„μ΄ λ°μ΄ν„°λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ €μž₯ν•˜λŠ” ν–‰μœ„λ₯Ό μ „μ μœΌλ‘œ μ±…μž„μ§€κΈ° λ•Œλ¬Έμ— μ»΄ν“¨ν„° μžμ›μ„ κ΄€λ¦¬ν•˜κΈ° μˆ˜μ›”ν•΄μ§€λŠ” μ΄μ μ΄ μžˆλ‹€.


II. μ‹œμŠ€ν…œ 호좜이 λ™μž‘ν•˜λŠ” 방식

- μœ μ €λͺ¨λ“œμ—μ„œ μ‹€ν–‰μ€‘인 ν”„λ‘œκ·Έλž¨μ΄ μ‹œμŠ€ν…œν˜ΈμΆœμ„ ν•˜κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œμ„Έμ„œλ₯Ό Kerenel λͺ¨λ“œλ‘œ λ³€κ²½ν•˜μ—¬ νŠΉμ • κΆŒν•œμ΄ ν•„μš”ν•œ μ•‘μ…˜ μˆ˜ν–‰ λ° λ¦¬μ†ŒμŠ€ μ ‘근이 κ°€λŠ₯ν•  μˆ˜ μžˆλ„둝 ν•œλ‹€. μ΄ κ³Όμ •μ„ Software Interrupt μ΄λΌκ³  ν•œλ‹€.

- μΈν„°λŸ½νŠΈλž€ μ•‘μ…˜μ΄ ν•„μš”ν•œ ν•˜λ“œμ›¨μ–΄/μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ μ΄λ²€νŠΈμ— λŒ€ν•΄ ν”„λ‘œμ„Έμ„œμ—κ²Œ λ³΄λ‚΄λŠ” μ•Œλ¦Ό μ‹ ν˜Έμ΄λ‹€. μ‘μš©ν”„λ‘œκ·Έλž¨μ— μ˜ν•΄ μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈκ°€ λ°œμƒν•˜λ©΄, ν”„λ‘œμ„Έμ„œμ— νŠΉμ • μΈν„°λŸ½νŠΈ μ½”λ“œλ₯Ό λ³΄λ‚΄ OS의 μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ λ£¨ν‹΄μ„ μ‹€ν–‰ν•˜λ„둝 νŠΈλ¦¬κ±°ν•œλ‹€.

- μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ λ£¨ν‹΄μ€ OS μ»€λ„ λ ˆλ²¨μ— μ‚¬μ „에 μ •μ˜λœ μ½”λ“œλ‘œ μœ μ € λ ˆλ²¨ ν”„λ‘œκ·Έλž¨μ˜ μΈν„°λŸ½νŠΈλ₯Ό λ‹€λ£° μˆ˜ μžˆλ„둝 λ””μžμΈλ˜μ–΄μžˆλ‹€. λ°œμƒλœ μ‹œμŠ€ν…œ ν˜ΈμΆœ λ‚΄μš©μ„ μ‹λ³„ν•˜κ³  μΈν’‹ νŒŒλΌλ―Έν„°λ₯Ό κ²€μ¦ν•œ λ’€ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ λŒ€μ‹ ν•˜μ—¬ μš”청받은 μž‘μ—… λ˜λŠ” λ¦¬μ†ŒμŠ€ μ ‘근을 μˆ˜ν–‰ν•œλ‹€.

- μš”청받은 μž‘업이 λͺ¨λ‘ μ™„λ£Œλ˜κ³  λ‚˜λ©΄ μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ λ£¨ν‹΄μ€ μž‘μ—… κ²°κ³Όκ°’을 λ°˜ν™˜ν•¨μœΌλ‘œμ¨ λ‹€μ‹œ μ‘μš©ν”„λ‘œκ·Έλž¨μ—κ²Œ μ œμ–΄κΆŒ(control)을 λ„˜κΈ°κ³ , μ‘μš©ν”„λ‘œκ·Έλž¨μ€ μΈν„°λŸ½νŠΈ μš”μ²­ μ§μ „에 μˆ˜ν–‰μ€‘μ΄λ˜ μž‘업을 μ΄μ–΄λ‚˜κ°€κ²Œ λœλ‹€.


III. μ‹œμŠ€ν…œ 호좜의 λΉ„μš©μ  μΈ‘λ©΄

- μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ μ‹€ν–‰μ€‘μ΄λ˜ μ‘μš©ν”„λ‘œκ·Έλž¨ λ™μž‘μ„ λ©ˆμΆ”κ³  μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ 루틴을 ν˜ΈμΆœν•˜λ―€λ‘œ μžμ› μ‚¬μš©μœ¨ μΈ‘λ©΄μ—μ„œ μƒλŒ€μ μœΌλ‘œ λΉ„μ‹Ό(?) ν”„λ‘œμ„ΈμŠ€μ΄λ‹€. 이에 따라 효율적인 μ‹œμŠ€ν…œ 호좜 방식과 λ£¨ν‹΄μ˜ ꡬ쑰가 μ€‘μš”ν•΄μ§€λŠ”λ°, μ΄λŠ” OS/ν•˜λ“œμ›¨μ–΄/μ†Œν”„νŠΈμ›¨μ–΄ λ³„λ‘œ μ•½κ°„μ”© λ‹€λ₯Έ νŠΉμ§•μ„ μ§€λ‹ˆκ²Œ λœλ‹€. 예λ₯Ό λ“€μ–΄ OS λ³„λ‘œ μ—¬λŸ¬ κ°€μ§€μ˜ μž‘μ—…λ“€μ΄ 1회 호좜 이내에 ν•œλ²ˆμ— μˆ˜ν–‰λ  수 μžˆλ„λ‘ ν•˜μ—¬ μ˜€λ²„ν—€λ“œλ₯Ό μ€„μ΄λŠ” 데 도움이 λ˜λŠ” 각기 λ‹€λ₯Έ λ°©μ‹μ˜ μ‹œμŠ€ν…œ 호좜 방식을 μ§€μ›ν•˜λŠ” 식이닀. 예: Linux - ioctl() , Windows - CreateProcess() , macOS - xattr()

- λ˜ ν”„λ‘œμ„Έμ„œ λ³„λ‘œ μ‹œμŠ€ν…œν˜ΈμΆœμ„ μœ„ν•œ κ°κΈ° λ‹€λ₯Έ ν•˜λ“œμ›¨μ–΄μ  μ„œν¬νŠΈλ₯Ό μ§€μ›ν•˜μ—¬ λ³΄λ‹€ μ μ€ μ˜€λ²„ν—€λ“œλ‘œ μš”청받은 μž‘업을 λΉ λ₯΄κ²Œ μˆ˜ν–‰ν•  μˆ˜ μžˆλ„둝 μ„€κ³„λ˜μ–΄μžˆλ‹€. (ν”„λ‘œμ„Έμ„œκ°€ μžλ™μœΌλ‘œ μ»€λ„λͺ¨λ“œλ‘œ μ „ν™˜ ν›„ μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬ λ£¨ν‹΄ μ§„μž…> Context Switch둜 λ°œμƒλ˜λŠ” μ˜€λ²„ν—€λ“œ μ΅œμ†Œν™”) λ‘œμ¨μ˜ κΈ°λŠ₯적 λ¬Έλ§₯은 λ™μΌν•˜λ‹€. 

- x86-64 μ•„ν‚€ν…μ²˜: syscall 
- ARM μ•„ν‚€ν…μ²˜: svc(superviso call) 
- IBM POWER μ•„ν‚€ν…μ²˜: sc(system call) 

λ°˜μ‘ν˜•