Linux system call

(무선)네트워크 2009. 1. 5. 14:38 Posted by 알 수 없는 사용자


▷ 작성자 : minams (minams@a3sc.co.kr)
▷ 편집자 : minams (minams@a3sc.co.kr
 )

Linux System_call


목차

1. 사용자 공간과 커널공간
2. SYSTEM CALL
3. SYSTEM CALL 과정
4. SYSTEM CALL reference

 

1. 사용자 공간과 커널공간

8051 프로세서는 ROM의 0번지부터 차례대로 읽어가면서 정해진 대로 프로그램을 수행한다. 결국 하나의 메모리에 하나의 프로그램만 존재한다. 반면에 운영체제는 최소한 2개 이상의 프로그램이 메모리에 존재한다.(운영체제, 프로그램) 이렇게 메모리에 운영체제와 사용자 프로그램을 공존하게 하기 위한 해결책이 바로 사용자 영역과 커널 영역이다.

[그림 1-a] 사용자 공간과 커널공간 - i386 32bit(리눅스)

 


 


위와 같이 포인터연산을 잘못해서 커널공간을 침범하는 것을 막기 위해 메모리 접근을 제한 할 수 있는 권한을 부여하였다.

[그림 1-b] 특권 레벨(privilege level)

 


    (보통 운영체제에서 0, 3 두 가지 영역만 사용)

운영체제는 부팅과정 동안에 GDT(Global Descriptor Table)을 이용해 해당 레벨에 사용할 메모리 영역을 지정한다. GDT의 type필드는 코드영역(읽기/실행)인지 데이터영역(읽기/쓰기)인지 지정하고, offset필드는 접근할 수 있는 메모리의 상대범위를 나타낸다.


 

2. SYSTEM CALL

시스템 호출이란 상위레벨(커널영역)로 접근가능하게 하는 문(함수)이다.
- JMP명령으로는 서로 다른 레벨로 접근할 수 없다.
- C언어를 이용해서 프로그래밍을 할 경우 대부분의 SYSTEM CALL은 libc를통한 포장(wrapper)형태로 제공받을 수 있다.
Ex) syscall(SYS_getpid); - 직접 호출
getpid();  - libc를 통한 wrapper 형태
- 인터럽트번호 128번 사용(0x80)



3. SYSTEM CALL 과정

 사용자 프로세스에서 시스템 호출사용 - ex)open()

 Libc에서 시스템 호출 준비
 시스템 호출에 필요한 인자를 register에 저장
 인터럽트 0x80을 발생 (소프트웨어 인터럽트 = 트랩)

 SYSTEM CALL
 IDT에 의해 system call 발생
 인터럽트 서비스 루틴 실행 – system_call()

 결과값 반환 – register에 저장


 

4.  참고 사이트 및 문헌

[표 1-a] 시스템 콜 레퍼런스 - kernel 2.6 #define NR_syscalls 318

번호

함수 이름

설명

소스

1

exit()

현재 프로세스의 종료

kernel/exit.c

2

fork()

자식 프로세스의 생성

arch/i385/kernel/process.c

3

read()

파일 지정자로 부터 읽기

fs/read_write.c

4

write()

파일 지정자로 쓰기

fs/read_write.c

5

open()

파일이나 장치열기

fs/open

6

close()

파일 지정자 닫기

fs/open.c

7

waitpid()

프로세스의 종료를 기다린다

kernel/exit.c

8

creat()

파일이나 장치의 생성

fs/open.c

9

link()

파일을 위한 새로운 이름 만들기

fs/namei.c

10

unlink()

파일 혹은 참조된 이름을 삭제한다

fs/namei.c

11

execv()

프로그램의 실행

arch/i386/kernel/process.c

12

chdir()

작업디렉토리의 변경

fs/open.c

13

time()

초단위의 시간 얻기

kernel/time.h

14

mknod()

일반 혹은 특수파일의 생성

fs/namei.c

15

chmod()

파일의 권한 바구기

fs/open.c

16

chown()

파일의 소유자 변경

fs/open.c

18

stat()

파일의 상태 얻기

fs/stat.c

19

lseek()

파일에서의 위치 변경

fs/read_write.c

20

getpid()

프로세스의 ID를 얻어온다

kernel/sched.c

21

mount()

파일 시스템의 마운트

fs/super.c

22

umount()

파일 시스템 마운트 해제

fs/super.c

23

setuid()

실제 유저 아이디 설정

kernel/sys.c

24

getuid()

실제 유저 아이디 얻어오기

kernel/sched.c

25

stime()

시스템의 시간과 날짜 설정

kernel/time.c

26

ptrace()

부모프로세스가 자식프로세스의 실행을 제어하도록 허가

arch/i386/kernel/ptrace.c

27

alarm()

실정시간후 alarm시그널이 전달되도록 한다.

kernel/sched.c

28

fstat()

파일 상태 얻기

fs/stat.c

29

pause()

시그널이 전달될때까지 대기한다.

arch/i386/kernel/sys_i386.c

30

utime()

파일의 엑세스시간과 수정시간을 수정한다.

fs/open.c

33

access()

파일의 권한을 검사한다.

fs/open.c

34

nice()

프로세스의 우선순위를 번경한다.

kernel/sched.c

36

sync()

슈퍼블럭을 업데이트 한다.

fs/buffer.c

37

kill()

프로세스에 시그널을 전송한다.

kernel/signal.h

38

rename()

파일의 이름과 위치를 변경한다.

fs/namei.c

39

mkdir()

디렉토리를 생성한다.

fs/namei.c

40

rmdir()

디렉토리를 제거한다.

fs/namei.c

41

dup()

열린 파일 지정자를 복사한다.

fs/fcntl.c

42

pipe()

내부통신을 위한 채널을 생성한다.

arch/i386/kernel/sys_i386.c

43

times()

프로세스 시간을 얻는다.

kernel/sys.c

45

brk()

프로세스의 데이터 세그먼트 크기를 변경한다.

mm/mmap.c

46

setgid()

real 그룹 아이디를 설정한다.

kernel/sys.c

47

getgid()

real 그룹 아이디를 얻어온다.

kernel/sched.c

48

sys_signal()

ANSI C 시그널 제어

kernel/signal.c

49

geteuid()

effective 유저 아이디 가져오기

kernel/sched.c

50

getegid()

effective 그룹 아이디 가져오기

kernel/sched.c

51

acct()

프로세스 측정을 켜거나 끈다.

kernel/acct.c

52

umount2()

파일시스템 unmount

fs/super.c

54

ioctl()

장치 제어

fs/ioctl.c

55

fcntl()

파일 제어

fs/fcntl.c

56

mpx

사용되지 않음

 

57

setpgid()

프로세스의 그룹 아이디 설정

kernel/sys.c

58

ulimit()

사용되지 않음

 

59

olduname

구식의 uname 시스템콜

arch/i386/kernel/sys_i386.c

60

umaks()

파일 마스크의 생성

kernel/sys.c

61

chroot()

루트디렉토리의 변경

fs/open.c