did_story

[운영체제] μ‹œμŠ€ν…œ 콜(System Call) μ™„μ „ 정리 λ³Έλ¬Έ

ComputerSciencπŸ“š/OS

[운영체제] μ‹œμŠ€ν…œ 콜(System Call) μ™„μ „ 정리

μ–΄μ œμ‹œμž‘ 2025. 9. 1. 23:29
CS 기술 λ©΄μ ‘ μ€€λΉ„λ₯Ό ν•˜λ©΄μ„œ 곡뢀 ν•˜λŠ” κΉŠμ΄μ— λŒ€ν•΄ 생각해보고 μžˆλ‹€. 그리고 정말 ν•΄μ•Όν• κ²Œ λ§Žλ”λΌ (μž¬λ°Œλ‹€).
μ΄λ²ˆμ— 이전에 배운 λ‚΄μš©κ³Ό Claude와 ν•¨κ»˜ μ€€λΉ„λ₯Ό ν•˜λ©΄μ„œ λ‚΄μš©μ„ 정리해보렀고 ν•©λ‹ˆλ‹€. (μžŠν˜€μ§„ λ‚˜μ˜ 머리 속 λ•Œλ¬Έμ— 고생이 λ§Žλ‹€..)

λ§Œμ•½μ— λ‚΄μš©μ€‘ ν‹€λ¦° λ‚΄μš©μ΄ μžˆλ‹€λ©΄ μ•Œλ €μ£Όμ„Έμš”. 컀피라도 ν•œμž”.. μ‚¬λ“œλ €μ•Ό ν•  κ±° κ°™μŠ΅λ‹ˆλ‹€. (κ°μ‚¬ν•˜λΈŒλ‹ˆλ‹€...)

 

1. System Call μ΄λž€?

μš΄μ˜μ²΄μ œλŠ” μ‚¬μš©μžκ°€ μ‹€ν–‰ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ΄ ν•˜λ“œμ›¨μ–΄ μžμ›μ— 직접 μ ‘κ·Όν•˜λŠ” 것을 λ°©μ§€ν•΄ μžμ›μ„ λ³΄ν˜Έν•©λ‹ˆλ‹€. μ™œλƒν•˜λ©΄, ν”„λ‘œκ·Έλž¨μ΄ CPU, λ©”λͺ¨λ¦¬, ν•˜λ“œ λ””μŠ€ν¬μ— λ§ˆμŒλŒ€λ‘œ μ ‘κ·Όν•˜κ³  μ‘°μž‘ν•  수 μžˆλ‹€λ©΄, μžμ›μ΄ λ¬΄μ§ˆμ„œν•˜κ²Œ 관리될 수 있으며 ν•œ ν”„λ‘œκ·Έλž¨μ˜ μ‹€μˆ˜κ°€ 전체 컴퓨터에 영ν–₯을 μ£ΌκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€. μš΄μ˜μ²΄μ œλŠ” ν”„λ‘œκ·Έλž¨λ“€μ΄ μžμ›μ— μ ‘κ·Όν•˜λ € ν•  λ•Œ 였직 μžμ‹ μ„ ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•˜λ„λ‘ ν•˜μ—¬ μžμ›μ„ λ³΄ν˜Έν•©λ‹ˆλ‹€.

 

λ”°λΌμ„œ, ν”„λ‘œκ·Έλž¨μ€ μžμ›μ— μ ‘κ·Όν•˜κΈ° μœ„ν•΄μ„œ μš΄μ˜μ²΄μ œμ—κ²Œ 도움을 μš”μ²­ν•΄μ•Ό ν•©λ‹ˆλ‹€. 그리고, ν”„λ‘œκ·Έλž¨μ˜ μš”μ²­μ„ 받은 μš΄μ˜μ²΄μ œλŠ” μ‘μš© ν”„λ‘œκ·Έλž¨ λŒ€μ‹  μžμ›μ— μ ‘κ·Όν•΄ μš”μ²­ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ 과정은 이쀑 λͺ¨λ“œλ‘œ κ΅¬ν˜„λ˜λŠ”λ°μš”. 이쀑 λͺ¨λ“œ(Dual Mode) λŠ” CPUκ°€ λͺ…령을 μ‹€ν–‰ν•˜λŠ” λͺ¨λ“œλ₯Ό μ‚¬μš©μž λͺ¨λ“œμ™€ 컀널 λͺ¨λ“œλ‘œ κ΅¬λΆ„ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.

 

즉, μ‹œμŠ€ν…œ 콜(System Call)은 운영체제 컀널이 μ œκ³΅ν•˜λŠ” μ„œλΉ„μŠ€μ— λŒ€ν•œ μΈν„°νŽ˜μ΄μŠ€λ‘œ, 두 λͺ¨λ“œμ˜ μ „ν™˜μ„ μœ„ν•΄ ν˜ΈμΆœν•˜λŠ” ν•¨μˆ˜λΌκ³  μƒκ°ν•΄λ³Όμˆ˜ μžˆμŠ΅λ‹ˆλ‹€. 

1) μ£Όμš” νŠΉμ§•

  • μΈν„°λŸ½νŠΈλ₯Ό ν†΅ν•œ OS 컀널 ν•¨μˆ˜ 호좜 - μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ(trap)λ₯Ό λ°œμƒμ‹œμΌœ μ‹€ν–‰
  • κΆŒν•œ λͺ¨λ“œ μ „ν™˜ - μ‚¬μš©μž λͺ¨λ“œμ—μ„œ 컀널 λͺ¨λ“œλ‘œ μ•ˆμ „ν•˜κ²Œ μ „ν™˜
  • ν•˜λ“œμ›¨μ–΄ 좔상화 - ν”„λ‘œκ·Έλž˜λ¨Έκ°€ ν•˜λ“œμ›¨μ–΄ μ„ΈλΆ€ 사항을 λͺ°λΌλ„ μ‹œμŠ€ν…œ μžμ› μ ‘κ·Ό κ°€λŠ₯

2) System Call 이 ν•„μš”ν•œ 이유

ν˜„λŒ€ μš΄μ˜μ²΄μ œλŠ” μ‹œμŠ€ν…œ λ³΄ν˜Έμ™€ μ•ˆμ •μ„±μ„ μœ„ν•΄ λ“€μ–Ό λͺ¨λ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€:

  • μ‚¬μš©μž λͺ¨λ“œ(User Mode): 일반 μ‘μš© ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λͺ¨λ“œ
  • 컀널 λͺ¨λ“œ(Kernel Mode): 운영체제 μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” 특ꢌ λͺ¨λ“œ

μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ 파일 μ ‘κ·Ό, λ©”λͺ¨λ¦¬ ν• λ‹Ή λ“± μ‹œμŠ€ν…œ μžμ›μ„ μ‚¬μš©ν•˜λ €λ©΄ λ°˜λ“œμ‹œ μ‹œμŠ€ν…œ μ½œμ„ 톡해 컀널 λͺ¨λ“œλ‘œ μ „ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

즉, μ‹œμŠ€ν…œ 콜이 ν•„μš”ν•œ μ΄μœ λŠ” λ³΄μ•ˆμ„±κ³Ό μ•ˆμ •μ„± λ•Œλ¬Έμž…λ‹ˆλ‹€. μ•ˆμ •μ„±μ΄λž€, λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ˜ λ©”λͺ¨λ¦¬λ₯Ό μΉ¨λ²”ν•˜μ§€ μ•Šλ„λ‘ ν•˜κ±°λ‚˜, κΆŒν•œ 및 접근을 μ œμ–΄, λͺ…ν™•ν•œ 성곡/μ‹€νŒ¨ μ—¬λΆ€ νŒλ‹¨μ„ ν†΅ν•œ 였λ₯˜ 처리 등을 μ˜λ―Έν•©λ‹ˆλ‹€

3) System Call 의 μ’…λ₯˜

운영체제 μ‹œμŠ€ν…œ μ½œμ€ 크게 6κ°€μ§€ μΉ΄ν…Œκ³ λ¦¬λ‘œ λΆ„λ₯˜λ©λ‹ˆλ‹€:

μ’…λ₯˜ Windows μ˜ˆμ‹œ Unix/Linux μ˜ˆμ‹œ μ„€λͺ…
ν”„λ‘œμ„ΈμŠ€ μ œμ–΄ CreateProcess(), ExitProcess() fork(), exit(), wait() ν”„λ‘œμ„ΈμŠ€ 생성/μ’…λ£Œ/μ œμ–΄
파일 관리 CreateFile(), ReadFile(), WriteFile() open(), read(), write(), close() 파일 생성/읽기/μ“°κΈ°/μ‚­μ œ
μž₯치 관리 SetConsoleMode(), ReadConsole() ioctl(), read(), write() λ””λ°”μ΄μŠ€ μž…μΆœλ ₯ μ œμ–΄
정보 μœ μ§€ GetCurrentProcessID(), SetTimer() getpid(), alarm(), sleep() μ‹œμŠ€ν…œ 정보 쑰회/μ„€μ •
톡신 CreatePipe(), CreateFileMapping() pipe(), shm_open(), mmap() ν”„λ‘œμ„ΈμŠ€ κ°„ 톡신
보호 SetFileSecurity(), InitializeSecurityDescriptor() chmod(), umask(), chown() μ ‘κ·Ό κΆŒν•œ μ œμ–΄

 

4) μ£Όμš” System Call μ˜ˆμ‹œ

1. open() - 파일 μ—΄κΈ°

#include <fcntl.h>
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

κΈ°λŠ₯: νŒŒμΌμ„ μ—΄κ±°λ‚˜ μƒμ„±ν•©λ‹ˆλ‹€.

  • pathname: μ—΄κ³ μž ν•˜λŠ” 파일 경둜
  • flags: 파일 μ ‘κ·Ό λͺ¨λ“œ (O_RDONLY, O_WRONLY, O_RDWR λ“±)
  • mode: μƒˆ 파일 생성 μ‹œ κΆŒν•œ μ„€μ •
  • λ°˜ν™˜κ°’: 성곡 μ‹œ 파일 λ””μŠ€ν¬λ¦½ν„°(μ–‘μˆ˜), μ‹€νŒ¨ μ‹œ -1

2. read() - 파일 읽기

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);

κΈ°λŠ₯: 파일 λ””μŠ€ν¬λ¦½ν„°μ—μ„œ 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€.

  • fd: 파일 λ””μŠ€ν¬λ¦½ν„°
  • buf: 읽은 데이터λ₯Ό μ €μž₯ν•  버퍼
  • count: 읽을 μ΅œλŒ€ λ°”μ΄νŠΈ 수
  • λ°˜ν™˜κ°’: μ‹€μ œ 읽은 λ°”μ΄νŠΈ 수, μ‹€νŒ¨ μ‹œ -1

3. write() - 파일 μ“°κΈ°

#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);

κΈ°λŠ₯: 파일 λ””μŠ€ν¬λ¦½ν„°μ— 데이터λ₯Ό μ”λ‹ˆλ‹€.

  • fd: 파일 λ””μŠ€ν¬λ¦½ν„°
  • buf: μ“Έ 데이터가 μžˆλŠ” 버퍼
  • count: μ“Έ λ°”μ΄νŠΈ 수
  • λ°˜ν™˜κ°’: μ‹€μ œ μ“΄ λ°”μ΄νŠΈ 수, μ‹€νŒ¨ μ‹œ -1

μ‹€μ œ μ‚¬μš© 예제

#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 10

int main(int argc, char *argv[]) {
    int fd;
    int start_offset;
    int read_bytes;
    char filename[256];
    char buf[BUFSIZE];
    
    if (argc < 3) {
        fprintf(stderr, "Usage: %s [file name] [start offset]\n", argv[0]);
        exit(1);
    }
    
    strcpy(filename, argv[1]);
    start_offset = atoi(argv[2]);
    
    // 파일 μ—΄κΈ°
    fd = open(filename, O_RDONLY);
    if (fd == -1) {
        perror(filename);
        exit(1);
    }
    
    // 파일 μœ„μΉ˜ μ„€μ •
    lseek(fd, start_offset, SEEK_SET);
    
    // 파일 읽기 및 좜λ ₯
    while ((read_bytes = read(fd, buf, BUFSIZE)) > 0) {
        write(1, buf, read_bytes);  // 1 = stdout
    }
    
    printf("\n\n");
    close(fd);
    return 0;
}

2. λ“€μ–Ό λͺ¨λ“œ 운영

1) λͺ¨λ“œ λΉ„νŠΈ(Mode Bit)

CPUλŠ” ν•˜λ“œμ›¨μ–΄μ μœΌλ‘œ λͺ¨λ“œ λΉ„νŠΈλ₯Ό μ œκ³΅ν•˜μ—¬ ν˜„μž¬ μ‹€ν–‰ λͺ¨λ“œλ₯Ό κ΅¬λΆ„ν•©λ‹ˆλ‹€:

  • λͺ¨λ“œ λΉ„νŠΈ = 1: μ‚¬μš©μž λͺ¨λ“œ (User Mode)
  • λͺ¨λ“œ λΉ„νŠΈ = 0: 컀널 λͺ¨λ“œ (Kernel Mode)

2) λͺ¨λ“œ μ „ν™˜ κ³Όμ •

[μ‚¬μš©μž ν”„λ‘œκ·Έλž¨] → [μ‹œμŠ€ν…œ 콜 호좜] → [μΈν„°λŸ½νŠΈ λ°œμƒ] → [컀널 λͺ¨λ“œ μ „ν™˜] 
       ↑                                                           ↓
[κ²°κ³Ό λ°˜ν™˜] ← [μ‚¬μš©μž λͺ¨λ“œ 볡귀] ← [μ‹œμŠ€ν…œ 콜 μ‹€ν–‰] ← [컀널 μ„œλΉ„μŠ€ μ‹€ν–‰]
  1. μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ—μ„œ μ‹œμŠ€ν…œ 콜 호좜
  2. μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ(trap) λ°œμƒ
  3. λͺ¨λ“œ λΉ„νŠΈκ°€ 0으둜 λ³€κ²½ (컀널 λͺ¨λ“œ μ§„μž…)
  4. μΈν„°λŸ½νŠΈ ν•Έλ“€λŸ¬κ°€ ν•΄λ‹Ή μ‹œμŠ€ν…œ 콜 μ‹€ν–‰
  5. μž‘μ—… μ™„λ£Œ ν›„ λͺ¨λ“œ λΉ„νŠΈ 1둜 λ³€κ²½ (μ‚¬μš©μž λͺ¨λ“œ 볡귀)
  6. κ²°κ³Όλ₯Ό μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ— λ°˜ν™˜

3. System Call κ΅¬ν˜„

1. System Call 번호

각 μ‹œμŠ€ν…œ μ½œμ—λŠ” κ³ μœ ν•œ λ²ˆν˜Έκ°€ ν• λ‹Ήλ©λ‹ˆλ‹€. μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€λŠ” 이 번호λ₯Ό 기반으둜 ν•œ ν…Œμ΄λΈ”μ„ μœ μ§€ν•©λ‹ˆλ‹€.

2. System Call μΈν„°νŽ˜μ΄μŠ€

// μ‚¬μš©μž ν”„λ‘œκ·Έλž¨
int main() {
    open("file.txt", O_RDONLY);  // μ‹œμŠ€ν…œ 콜 호좜
}

// μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€ (libc)
open() {
    movl $5, %eax       // μ‹œμŠ€ν…œ 콜 번호λ₯Ό λ ˆμ§€μŠ€ν„°μ— μ €μž₯
    int $0x80           // μ†Œν”„νŠΈμ›¨μ–΄ μΈν„°λŸ½νŠΈ λ°œμƒ
}

// OS 컀널
sys_open() {
    // μ‹€μ œ 파일 μ—΄κΈ° κ΅¬ν˜„
}

3. λ§€κ°œλ³€μˆ˜ 전달

μ‹œμŠ€ν…œ 콜 λ§€κ°œλ³€μˆ˜λŠ” λ‹€μŒ λ°©λ²•λ“€λ‘œ μ „λ‹¬λ©λ‹ˆλ‹€:

  • λ ˆμ§€μŠ€ν„° μ‚¬μš©: λΉ λ₯΄μ§€λ§Œ 개수 μ œν•œ
  • λ©”λͺ¨λ¦¬ 블둝: λ§Žμ€ λ§€κ°œλ³€μˆ˜ 전달 κ°€λŠ₯
  • μŠ€νƒ: 일반적인 ν•¨μˆ˜ 호좜과 μœ μ‚¬

System Call vs ν‘œμ€€ 라이브러리 ν•¨μˆ˜

μ£Όμš” 차이점

κ΅¬λΆ„μ‹œμŠ€ν…œ System Call ν‘œμ€€ 라이브러리 ν•¨μˆ˜
제곡자 운영체제 컀널 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄
μ‹€ν–‰ λͺ¨λ“œ 컀널 λͺ¨λ“œμ—μ„œ μ‹€ν–‰ μ‚¬μš©μž λͺ¨λ“œμ—μ„œ μ‹€ν–‰
μ˜€λ²„ν—€λ“œ λͺ¨λ“œ μ „ν™˜μœΌλ‘œ μΈν•œ μ˜€λ²„ν—€λ“œ μƒλŒ€μ μœΌλ‘œ 빠름
κΈ°λŠ₯ 기본적인 μ‹œμŠ€ν…œ μ„œλΉ„μŠ€ νŽΈμ˜μ„±κ³Ό μΆ”κ°€ κΈ°λŠ₯ 제곡

 

ꡬ체적인 비ꡐ μ˜ˆμ‹œ

1. 파일 μ“°κΈ° ν•¨μˆ˜λ“€

// μ‹œμŠ€ν…œ 콜: write()
ssize_t write(int fd, const void *buf, size_t count);

// ν‘œμ€€ 라이브러리: printf()  
int printf(const char *format, ...);

printf()λŠ” λ‚΄λΆ€μ μœΌλ‘œ write() μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

2. 파일 읽기 ν•¨μˆ˜λ“€

// μ‹œμŠ€ν…œ 콜: read()
ssize_t read(int fd, void *buf, size_t count);

// ν‘œμ€€ 라이브러리: fread()
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

fread()λŠ” 버퍼링과 편의 κΈ°λŠ₯을 μ œκ³΅ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ read()λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ 호좜 계측 ꡬ쑰

μ‚¬μš©μž ν”„λ‘œκ·Έλž¨
    ↓
printf() / fread()  ← ν‘œμ€€ C 라이브러리
    ↓
write() / read()    ← μ‹œμŠ€ν…œ 콜 μΈν„°νŽ˜μ΄μŠ€
    ↓
컀널 λͺ¨λ“œ           ← 운영체제 컀널
    ↓
ν•˜λ“œμ›¨μ–΄

마무리

μ‹œμŠ€ν…œ μ½œμ€ 운영체제의 핡심 λ©”μ»€λ‹ˆμ¦˜μœΌλ‘œ, μ‚¬μš©μž ν”„λ‘œκ·Έλž¨μ΄ μ•ˆμ „ν•˜κ²Œ μ‹œμŠ€ν…œ μžμ›μ— μ ‘κ·Όν•  수 있게 ν•΄μ£ΌλŠ” μ€‘μš”ν•œ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.

핡심 포인트:

  • μ‹œμŠ€ν…œ μ½œμ€ μ‚¬μš©μž λͺ¨λ“œμ™€ 컀널 λͺ¨λ“œ μ‚¬μ΄μ˜ μ•ˆμ „ν•œ 닀리 μ—­ν• 
  • λͺ¨λ“  μ‹œμŠ€ν…œ μžμ› 접근은 μ‹œμŠ€ν…œ μ½œμ„ 톡해 이루어짐
  • ν‘œμ€€ 라이브러리 ν•¨μˆ˜λ“€λ„ λ‚΄λΆ€μ μœΌλ‘œ μ‹œμŠ€ν…œ μ½œμ„ μ‚¬μš©
  • μΈν„°λŸ½νŠΈ λ©”μ»€λ‹ˆμ¦˜μ„ 톡해 효율적으둜 κ΅¬ν˜„λ¨

운영체제λ₯Ό μ΄ν•΄ν•˜λŠ” 데 μžˆμ–΄ μ‹œμŠ€ν…œ 콜의 λ™μž‘ 원리λ₯Ό νŒŒμ•…ν•˜λŠ” 것은 맀우 μ€‘μš”ν•©λ‹ˆλ‹€. 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ΄ μ–΄λ–»κ²Œ μš΄μ˜μ²΄μ œμ™€ μƒν˜Έμž‘μš©ν•˜λŠ”μ§€ 깊이 있게 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

'ComputerSciencπŸ“š > OS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[운영체제] Chapter 1. Introduction (Interrupt)  (0) 2025.03.10