Tuuna Computer Science

system call 본문

System programing

system call

GuTTe 2018. 6. 11. 19:36


  • System Call interface 

-> 시스템 콜 인터페이스는 user mode 프로세스인 응용 애플리케이션이 커널의 기능을 사용하게 해주는 것 

  • 커널 

-> 하드웨어를 직접 제어하고 프로세스관리, 메모리관리, 파일시스템제어 등을 수행 
->사용자가 실행싴는 응용프로그램과 하드웨어 사이에서 조정자 역할을 함. 

  • 커널 버전 용어 

-> 매이저 버전 : 엔진 커널의 획기적인 변화가 있을 경우 

-> 마이너 버전 : 큰 변경 없이 버그 수정 및 기능적 추가 있을 경우 

-> 패치 버전 :  기능은 변화없이 수정이 나타날 경우 패치버전을 씀 

  • 시스템 콜 vs 라이브러리 함수 

  1. Systme Call (커널 모드 + 하드웨어에 대한 모든 제어) 
-> 커널의 자원을 사용자가 사용할 수 있도록 만들어 놓은 함수 

  1. 라이브러리 함수 (유저모드 + 일반 응요 프로그램) 
-> 일반 사용자들이 많이 사용할 수 있는 기능들을 미리 함수로 정의 해 놓은 것 // 문자열 처리, 표준 입출력, 수학 관련 공식 등 
라이브러리 함수를 호출하여도 사용자 프로그램은 사용자 모드에서 실행됨 

  1. 핵심 
-> 하드웨어 제어를 할 때에는 커널 모드로 접근을 하여 하드웨어를 제어한다. 
응용프로그램단은 커널 모드로 진입 할 수 없다. 하지만 간접 접근 방식을 이용하여 커널에 접근이 가능하다. 
즉, 커널에게 자원 사용을 요청 후 접근한다. 이때 커널이 응용 프로그램단에 제공하는 함수가 System Call이다. 
즉, 다시 말해서 System Call을 호출하면 유저모드에서 커널모드로 전환하여 실행한다. 

================================================================================
dansuchang@dansuchang-VirtualBox:~$ strace ./test_systemcall
execve("./test_systemcall", ["./test_systemcall"], [/* 71 vars */]) = 0
brk(NULL)                               = 0x126b000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=111782, ...}) = 0
mmap(NULL, 111782, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ff5d66a1000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5d66a0000
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ff5d60ce000
mprotect(0x7ff5d628e000, 2097152, PROT_NONE) = 0
mmap(0x7ff5d648e000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7ff5d648e000
mmap(0x7ff5d6494000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ff5d6494000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5d669f000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ff5d669e000
arch_prctl(ARCH_SET_FS, 0x7ff5d669f700) = 0
mprotect(0x7ff5d648e000, 16384, PROT_READ) = 0
mprotect(0x600000, 4096, PROT_READ)     = 0
mprotect(0x7ff5d66bd000, 4096, PROT_READ) = 0
munmap(0x7ff5d66a1000, 111782)          = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ff5d669f9d0) = 2767
pipe([3, 4])                            = 0
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=2767, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
open("/dev/null", O_RDONLY)             = 5
open("./diary", O_RDONLY)               = -1 ENOENT (No such file or directory)  ::-1을 제외하고 다른 숫자가뜨면 있다는 거임 
exit_group(0)                           = ?
+++ exited with 0 +++
=============================================================================

strace ./test_systemcall  :: 리눅스에는 실행 프로그램의 시스템 콜을 추적할 수 있는 strace가 제공됨 

clone( ) :: fork( )는 내부적으로 clone( ) 이라는 시스템콜을 호출.   Q. clone( ) fork( ) 함수는 뭔가? 

pipe( ) :: pipe( )  시스템콜을 사용한것을 알 수 있음 

open("/dev/null",~~~) :: /dev/null을 가리키는 파일 서술자의 값이 5임을 알 수 있음 Q. 파일 디스크립터의 값인가? 

open("./diary",~~~) :: strace를 통해 diary라는 파일을 open( ) 시스템콜로 찾는다는 것과, 그 파일이 존재하지 않음을 알 수 있음. ( = -1 ) Q. 만약 파일이 있다면? 다른 값이 뜸 

========================================================================================================

[ System Call reference ]

  1. exit() : 현재 프로세스의 종료 
  2. fork() : 자식 프로세스 생성 
  3. read() : 파일 지정자로 부터 읽기 
  4. write() : 파일 지정자로부터 쓰기 
  1. open() : 파일이나 장치 열기 
  2. close() : 파일 지정자 닫기 
  3. waitpid() : 프로세스의 종료를 기다린다. 
  4. creat() : 파일이나 장치의 생성 
  5. link() : 파일을 위한 새로운 이름 만들기 
  6. unlink() : 파일 혹은 참조된 이름을 삭제한다. 
  7. execv() : 프로그램의 실행 
  8. chdir() : 작업디렉토리 변경 
  9. time() : 초단위의 시간 얻기
  10. mknod() : 일반 혹은 특수파일의 생성 
  11. chmod() : 파일의 권한 바꾸기
  12. chown() : 파일의 소유자 변경 
  13. stat() : 파일의 상태 얻기 
  14. lseek() : 파일에서의 위치 변경 
  15. getpid() : 프로세스의 ID를 얻어온다. 
  16. mount() : 파일 시스템의 마운트
  17. umount() : 파일 시스템 마운트 해제 
  18. setuid() : 실제 유저 아이디 설정 
  19. getuid() : 실제 유저 아이디 얻어오기 
  20. stime() : 시스템의 시간과 날짜 설정 
  21. ptrace() : 부모프로세스가 자식프로세스의 실행을 제어하돌고 허가 
  22. alarm() : 설정시간후 alarm시그널이 전달되도록 한다. 
  23. fstat() : 파일 상태 얻기 
  24. pause() : 시그널이 전달될때까지 대기한다. 
  25. utime() : 파일의 엑세스시간과 수정시간을 수정한다. 
  26. access() : 파일의 권한을 검사한다. 
  27. nice() : 프로세스의 우선순위를 변경한다. 
  28. sync() : 슈퍼블럭을 업데이트 한다. 
  29. kill() : 프로세스에 시그널을 전송한다.
  30. rename() : 파일의 이름과 위치를 바꾼다. 
  31. mkdir() : 디렉토리를 생성한다. 
  32. rmdir() : 디렉토리 제거 
  33. dup() : 열린 파일 지정자를 복사한다. 
  34. pipe() : 내부통신을 위한 채널을 생성한다. 
  35. times() : 프로세스 시간을 얻는다
  36. brk() : 프로세스 데이터 세그먼트 크기를 변경한다. 
  37. setgid() : real 그룹 아이디를 설정한다
  38. getgid() : real 그룹 아이디를 가져온다
  39. sys_signal() : ANSI C 시그널 제어 
  40. geteuid() : effective 유저 아이디 가져오기 
  41. getegid() : effective 그룹 아이디 가져오기 
  42. acct() : 프로세스 측정을 켜거나 끈다. 
  43. umount2() : 파일시스템 unmount 
  44. ioctl() : 장치 제어 
  45. fcntl() : 파일 제어 
  46. mpx() : 사용되지 않음 
  47. setpgid() : 프로세스의 그룹 아이디 설정 
  48. ulimit() : 사용되지 않음 
  49. olduname : 구식의 uname 시스템콜 
  50. umaks() : 파일 마스크의 생성 
  51. chroot() : 루트디렉토리의 변경 























'System programing' 카테고리의 다른 글

리눅스 메모리에 대해  (0) 2018.08.10
[ 공유 메모리 ]  (0) 2018.06.09
[ 좀비 프로세스 ]  (0) 2018.06.09
[리눅스] 프로세스에 대해서  (0) 2018.06.09
Comments