did_story
[μ΄μ체μ ] μμ€ν μ½(System Call) μμ μ 리 λ³Έλ¬Έ
[μ΄μ체μ ] μμ€ν μ½(System Call) μμ μ 리
μ΄μ μμ 2025. 9. 1. 23:29CS κΈ°μ λ©΄μ μ€λΉλ₯Ό νλ©΄μ κ³΅λΆ νλ κΉμ΄μ λν΄ μκ°ν΄λ³΄κ³ μλ€. κ·Έλ¦¬κ³ μ λ§ ν΄μΌν κ² λ§λλΌ(μ¬λ°λ€).μ΄λ²μ μ΄μ μ λ°°μ΄ λ΄μ©κ³Ό 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) λͺ¨λ μ ν κ³Όμ
[μ¬μ©μ νλ‘κ·Έλ¨] → [μμ€ν
μ½ νΈμΆ] → [μΈν°λ½νΈ λ°μ] → [컀λ λͺ¨λ μ ν]
↑ ↓
[κ²°κ³Ό λ°ν] ← [μ¬μ©μ λͺ¨λ 볡κ·] ← [μμ€ν
μ½ μ€ν] ← [컀λ μλΉμ€ μ€ν]
- μ¬μ©μ νλ‘κ·Έλ¨μμ μμ€ν μ½ νΈμΆ
- μννΈμ¨μ΄ μΈν°λ½νΈ(trap) λ°μ
- λͺ¨λ λΉνΈκ° 0μΌλ‘ λ³κ²½ (컀λ λͺ¨λ μ§μ )
- μΈν°λ½νΈ νΈλ€λ¬κ° ν΄λΉ μμ€ν μ½ μ€ν
- μμ μλ£ ν λͺ¨λ λΉνΈ 1λ‘ λ³κ²½ (μ¬μ©μ λͺ¨λ 볡κ·)
- κ²°κ³Όλ₯Ό μ¬μ©μ νλ‘κ·Έλ¨μ λ°ν
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 |
|---|