[Linux]Kernel System Call

2021. 8. 17. 21:28ㆍSystem μž‘μ—…μ‹€/LINUX

728x90
λ°˜μ‘ν˜•

 

 

μ•ˆλ…•ν•˜μ„Έμš”? μ£Όλ‹ˆν•˜λž‘μž…λ‹ˆλ‹€.

μ˜€λŠ˜μ€ Linux Kernel의 System Call에 λŒ€ν•΄ 곡뢀λ₯Ό μ‹œμž‘ ν•΄ 보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€!

 

[Kernel] System Call

κ°œλ…μΌλ°˜μ μœΌλ‘œ 운영체제(컀널)κ°€ ν•˜λ“œμ›¨μ–΄/μ‹œμŠ€ν…œμ— μ§€μ •λœ λ˜λŠ” 특ꢌ이 μžˆμ–΄μ•Ό ν•˜λŠ” λ™μž‘λ“€μ„ μˆ˜ν–‰ν† λ‘ μš”μ²­ν•˜λŠ” 컴퓨터 ν•˜λ“œμ›¨μ–΄μ™€ μ‚¬μš©μž μ‚¬μ΄μ˜ μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” ν•¨μˆ˜ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯에 λŒ€ν•˜μ—¬ 운영체제의 루틴을 ν˜ΈμΆœν•˜μ—¬ 이용 μ»΄ν“¨νŒ… μžμ›μ„ 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ ν—ˆμš©ν•˜μ§€ μ•Šμ€ μ‚¬μš©μžμ˜ 침범을 방지해 ν”„λ‘œκ·Έλž¨μ˜ 독립적인 μˆ˜ν–‰μ„ 보μž₯ μ›ν™œν•œ 운영체제의 μ—­ν•  μˆ˜ν–‰μ„ μœ„ν•΄μ„œλŠ” μ‹œμŠ€ν…œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‘μš© μ†Œν”„νŠΈμ›¨μ–΄λ‘œλΆ€ν„° λ³΄ν˜Έν•  수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μ΄ ν•„μš”

I. H/W와 μ‚¬μš©μž μ‚¬μ΄μ˜ μΈν„°νŽ˜μ΄μŠ€, μ‹œμŠ€ν…œ 호좜(System Call)의 κ°œμš”

   κ°€. UNIX OS의 μ‹œμŠ€ν…œ 호좜(System Call)의 μ •μ˜

  • 일반적으둜 운영체제(컀널)κ°€ ν•˜λ“œμ›¨μ–΄/μ‹œμŠ€ν…œμ— μ§€μ •λœ λ˜λŠ” 특ꢌ이 μžˆμ–΄μ•Ό ν•˜λŠ” λ™μž‘λ“€μ„ μˆ˜ν–‰ν† λ‘ μš”μ²­ν•˜λŠ” 컴퓨터 ν•˜λ“œμ›¨μ–΄μ™€ μ‚¬μš©μž μ‚¬μ΄μ˜ μΈν„°νŽ˜μ΄μŠ€ λ˜λŠ” ν•¨μˆ˜
  • ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ—μ„œ μ§€μ›ν•˜μ§€ μ•ŠλŠ” κΈ°λŠ₯에 λŒ€ν•˜μ—¬ 운영체제의 루틴을 ν˜ΈμΆœν•˜μ—¬ 이용
  • μ»΄ν“¨νŒ… μžμ›μ„ 효율적으둜 κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ ν—ˆμš©ν•˜μ§€ μ•Šμ€ μ‚¬μš©μžμ˜ 침범을 방지해 ν”„λ‘œκ·Έλž¨μ˜ 독립적인 μˆ˜ν–‰μ„ 보μž₯
  • μ›ν™œν•œ 운영체제의 μ—­ν•  μˆ˜ν–‰μ„ μœ„ν•΄μ„œλŠ” μ‹œμŠ€ν…œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό μ‘μš© μ†Œν”„νŠΈμ›¨μ–΄λ‘œλΆ€ν„° λ³΄ν˜Έν•  수 μžˆλŠ” λ©”μ»€λ‹ˆμ¦˜μ΄ ν•„μš”

   λ‚˜. μ‹œμŠ€ν…œ 호좜의 κΈ°λ³Έ κ°œλ…, 특ꢌλͺ¨λ“œμ™€ μ‚¬μš©μž λͺ¨λ“œ

 



​

 

  • μ‚¬μš©μž 곡간과 컀널 곡간은 κΆŒν•œ λ ˆλ²¨μ„ μ„€μ •ν•¨μœΌλ‘œμ¨ ꡬ뢄
  • μ‚¬μš©μž λͺ¨λ“œμ—μ„œ 특ꢌ λͺ¨λ“œλ‘œ κΆŒν•œ λ ˆλ²¨μ„ 바꾸지 μ•ŠμœΌλ©΄ μ»€λ„μ˜ λ‚΄λΆ€ κΈ°λŠ₯을 μ‚¬μš©ν•  수 μ—†μŒ
  • 이 경우 보호 였λ₯˜λ₯Ό λ°œμƒμ‹œμΌœ 컀널 μ˜μ—­μ— λŒ€ν•œ 침범을 차단
  • λ‹¨μˆœνžˆ 컀널 μ˜μ—­μœΌλ‘œ λ“€μ–΄κ°€λŠ” 것이 μ•„λ‹ˆλΌ 특ꢌ 레벨둜 λ³€κ²½ν•˜λŠ” κ²ƒμž„

II. μ‹œμŠ€ν…œ 호좜의 ꡬ쑰 및 μ’…λ₯˜

   κ°€. UNIX OS의 μ‹œμŠ€ν…œ 호좜 ꡬ쑰



​

  • μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ μ†Œν”„νŠΈμ›¨μ–΄μ μΈ μΈν„°λŸ½νŠΈ 인트랩(SWI:S/W Interrupt)을 λ°œμƒ
  • λ¦¬λˆ…μŠ€μ˜ 경우? 0x80 μΈν„°λŸ½νŠΈλ₯Ό λ°œμƒ

   λ‚˜. μ‹œμŠ€ν…œ 호좜의 μ’…λ₯˜

ꡬ뢄 μ’…λ₯˜
ν”„λ‘œμ„ΈμŠ€ 관리 fork(), execve(), getpid(), signal() λ“±
νŒŒμΌμ‹œμŠ€ν…œ open(), read(), write(), close() λ“±
λ©”λͺ¨λ¦¬ 관리 brk() λ“±
λ„€νŠΈμ›Œν¬ 관리 socket(), bind(), connect() λ“±
μ‹œμŠ€ν…œμ •λ³΄/μ œμ–΄ time() λ“±
  • 특히 λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„ κ΄€λ ¨ μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ 가상 파일 μ‹œμŠ€ν…œμ„ ν†΅ν•˜λ―€λ‘œ νŒŒμΌμ‹œμŠ€ν…œκ³Ό κ΄€λ ¨ 있음
  • 컀널(Kernel)에 μ‚¬μš©μž μ •μ˜ν•¨μˆ˜λ₯Ό μΆ”κ°€ν•¨μœΌλ‘œμ¨ μ‚¬μš©μž μ •μ˜ μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•  수 있음

 

 

III. μ‹œμŠ€ν…œ 호좜의 λ™μž‘κ³Όμ • 및 μ˜ˆμ‹œ

    κ°€. μ‹œμŠ€ν…œ 호좜의 λ™μž‘κ³Όμ •

  • μœ λ‹‰μŠ€λŠ” μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ 컀널에 λŒ€ν•œ μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•  경우 이에? λŒ€ν•œ μ„œλΉ„μŠ€λ₯Ό ν•  수 μžˆλŠ” 잘 μ •μ˜λœ μ œν•œλœ μ’…λ₯˜μ˜ ν•¨μˆ˜μΈ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 제곡
  • μ‚¬μš©μžκ°€ 운영체제의 κΈ°λŠ₯ ν˜Ήμ€ λͺ¨λ“ˆμ„ ν™œμš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 이용
  • μ‚¬μš©μž λͺ¨λ“œμ—μ„œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μˆ˜ν–‰ν•˜λ©΄ μ‹œμŠ€ν…œ λͺ¨λ“œλ‘œ μ „ν™˜λ˜λ©°, μ»€λ„μ—μ„œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ’…λ£Œν•˜λ©΄ μ‚¬μš©μž λͺ¨λ“œλ‘œ λ‹€μ‹œ λŒμ•„μ˜΄
  • μ‚¬μš©μž ν”„λ‘œμ„ΈμŠ€κ°€ ν‘œμ€€ 라이브러리λ₯Ό μ‚¬μš©ν•΄ 컀널에 μ ‘κ·Όν•˜λŠ” 것도 λ‚΄λΆ€μ μœΌλ‘œ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ μ‚¬μš©

   λ‚˜. μ‹œμŠ€ν…œ 호좜의 λ™μž‘κ³Όμ • μ˜ˆμ‹œ ? fork() 경우



​

단계 μ„€λͺ…
1단계 fork() μ‹œμŠ€ν…œν˜ΈμΆœ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜λ €λ©΄ fork() ν•¨μˆ˜ 정보가 μžˆλŠ”/include/unistd.h ν—€λ”νŒŒμΌμ„ include. 링컀둜 λΌμ΄λΈŒλŸ¬λ¦¬μ—μ„œ λŒ€μ‘ν•˜λŠ” ν•¨μˆ˜μ™€ μ—°κ²°
2단계 라이브러리 λ‚΄λΆ€μ˜ fork() ν•¨μˆ˜: “swi 900002” 의미
μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈλ₯Ό 톡해 μ‚¬μš©μž λͺ¨λ“œμ—μ„œ 컀널 λͺ¨λ“œλ‘œ μ „ν™˜λ˜μ–΄ 컀널 μžμ›μ„ μ ‘κ·Ό
3단계 호좜 번호 2에 ν•΄λ‹Ήν•˜λŠ” μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜ sys_fork() μ‹€ν–‰
4단계 가상 νŒŒμΌμ‹œμŠ€ν…œμ„ 톡해 컀널 μžμ›μΈ 파일, 디렉토리, λ””λ°”μ΄μŠ€ 등을 ν•˜λ‚˜μ˜ 파일처럼 μ ‘κ·Ό

IV. μ‹œμŠ€ν…œ 호좜 κ΅¬ν˜„ 및 절차

    κ°€. μ‹œμŠ€ν…œ 호좜 κ΅¬ν˜„μ˜ κ°œμš”

  • μœ λ‹‰μŠ€ OSμ—μ„œ νƒœλ™ν•œ? Linux OS의 경우 μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό 컀널을 μž¬λΉŒλ“œ ν•¨μœΌλ‘œμ¨ κ΅¬ν˜„ν•  수 있음
  • μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ 컀널 μˆ˜μ€€μ˜ ν”„λ‘œκ·Έλž˜λ° μž‘μ—…μ„ ν•΄μ•Ό ν•˜κ³ , κ΅¬ν˜„λœ μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό ν…ŒμŠ€νŠΈν•˜λ €λ©΄ μ‚¬μš©μž μˆ˜μ€€μ˜ μ‘μš©ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•΄μ•Ό 함
  • μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 컀널에 κ΅¬ν˜„ν•˜λ €λ©΄ μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό μ •μ˜ν•΄μ•Ό ν•  뿐만 μ•„λ‹ˆλΌ μ‹œμŠ€ν…œ 호좜 번호λ₯Ό ν• λ‹Ήν•˜κ³  μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό 등둝해야 함

   λ‚˜. μ‹œμŠ€ν…œ 호좜 κ΅¬ν˜„μ˜ 절차



​

  • UNIX OS의 κ²½μš°λŠ” Open Source일 κ²½μš°κ°€ λ“œλ¬Όμ§€λ§Œ Linux의 경우 μœ„μ™€ 같은 절차둜 μ‚¬μš©μž μ •μ˜ μ‹œμŠ€ν…œ 호좜 ν•¨μˆ˜λ₯Ό κ΅¬ν˜„ν•¨
  • μ‹œμŠ€ν…œ ν˜ΈμΆœμ€ μ»€λ„μ—μ„œ μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•˜λŠ” 효과적인 λ°©λ²•μ΄μ§€λ§Œ, ν‘œμ€€ν™”λœ μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 점과 μƒˆλ‘œμš΄ μ‹œμŠ€ν…œ ν˜ΈμΆœμ„ 컀널에 μΆ”κ°€ν•˜κΈ° μ–΄λ ΅λ‹€λŠ” 문제점 있음

< System Call μ˜ˆμ‹œ >



​



​

 


​

 

β€‹μ£Όλ‹ˆν•˜λž‘μ˜ 글이 λ§ˆμŒμ— λ“œμ…¨λ‚˜μš”? ꡬ독과 곡감! 그리고, λŒ“κΈ€μ€ μ£Όλ‹ˆν•˜λž‘μ—κ²Œ λ§Žμ€ 힘이 λ©λ‹ˆλ‹€

728x90
λ°˜μ‘ν˜•