Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- .nret core 배포
- Docker
- rfc5508
- packet filter
- .net core 7
- vtable
- REDIS
- ioctl
- doupdate
- architecture
- edge trigger
- 풀이
- 취약점
- cbpf
- epoll_wait
- DOCKER-USER
- ncurses
- level trigger
- C언어
- iptables
- epoll
- BOF
- mvwin
- wnourefresh
- 어셈블리어
- LOB
- NAPT
- wrefresh
- Compiler
- packet flow
Archives
- Today
- Total
Tuuna Computer Science
system call 본문
- System Call interface
-> 시스템 콜 인터페이스는 user mode 프로세스인 응용 애플리케이션이 커널의 기능을 사용하게 해주는 것
- 커널
-> 하드웨어를 직접 제어하고 프로세스관리, 메모리관리, 파일시스템제어 등을 수행
->사용자가 실행싴는 응용프로그램과 하드웨어 사이에서 조정자 역할을 함.
- 커널 버전 용어
-> 매이저 버전 : 엔진 커널의 획기적인 변화가 있을 경우
-> 마이너 버전 : 큰 변경 없이 버그 수정 및 기능적 추가 있을 경우
-> 패치 버전 : 기능은 변화없이 수정이 나타날 경우 패치버전을 씀
- 시스템 콜 vs 라이브러리 함수
- Systme Call (커널 모드 + 하드웨어에 대한 모든 제어)
-> 커널의 자원을 사용자가 사용할 수 있도록 만들어 놓은 함수
- 라이브러리 함수 (유저모드 + 일반 응요 프로그램)
-> 일반 사용자들이 많이 사용할 수 있는 기능들을 미리 함수로 정의 해 놓은 것 // 문자열 처리, 표준 입출력, 수학 관련 공식 등
라이브러리 함수를 호출하여도 사용자 프로그램은 사용자 모드에서 실행됨
- 핵심
-> 하드웨어 제어를 할 때에는 커널 모드로 접근을 하여 하드웨어를 제어한다.
응용프로그램단은 커널 모드로 진입 할 수 없다. 하지만 간접 접근 방식을 이용하여 커널에 접근이 가능하다.
즉, 커널에게 자원 사용을 요청 후 접근한다. 이때 커널이 응용 프로그램단에 제공하는 함수가 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 ]
- exit() : 현재 프로세스의 종료
- fork() : 자식 프로세스 생성
- read() : 파일 지정자로 부터 읽기
- write() : 파일 지정자로부터 쓰기
- open() : 파일이나 장치 열기
- close() : 파일 지정자 닫기
- waitpid() : 프로세스의 종료를 기다린다.
- creat() : 파일이나 장치의 생성
- link() : 파일을 위한 새로운 이름 만들기
- unlink() : 파일 혹은 참조된 이름을 삭제한다.
- execv() : 프로그램의 실행
- chdir() : 작업디렉토리 변경
- time() : 초단위의 시간 얻기
- mknod() : 일반 혹은 특수파일의 생성
- chmod() : 파일의 권한 바꾸기
- chown() : 파일의 소유자 변경
- stat() : 파일의 상태 얻기
- lseek() : 파일에서의 위치 변경
- getpid() : 프로세스의 ID를 얻어온다.
- mount() : 파일 시스템의 마운트
- umount() : 파일 시스템 마운트 해제
- setuid() : 실제 유저 아이디 설정
- getuid() : 실제 유저 아이디 얻어오기
- stime() : 시스템의 시간과 날짜 설정
- ptrace() : 부모프로세스가 자식프로세스의 실행을 제어하돌고 허가
- alarm() : 설정시간후 alarm시그널이 전달되도록 한다.
- fstat() : 파일 상태 얻기
- pause() : 시그널이 전달될때까지 대기한다.
- utime() : 파일의 엑세스시간과 수정시간을 수정한다.
- access() : 파일의 권한을 검사한다.
- nice() : 프로세스의 우선순위를 변경한다.
- sync() : 슈퍼블럭을 업데이트 한다.
- kill() : 프로세스에 시그널을 전송한다.
- rename() : 파일의 이름과 위치를 바꾼다.
- mkdir() : 디렉토리를 생성한다.
- rmdir() : 디렉토리 제거
- dup() : 열린 파일 지정자를 복사한다.
- pipe() : 내부통신을 위한 채널을 생성한다.
- times() : 프로세스 시간을 얻는다
- brk() : 프로세스 데이터 세그먼트 크기를 변경한다.
- setgid() : real 그룹 아이디를 설정한다
- getgid() : real 그룹 아이디를 가져온다
- sys_signal() : ANSI C 시그널 제어
- geteuid() : effective 유저 아이디 가져오기
- getegid() : effective 그룹 아이디 가져오기
- acct() : 프로세스 측정을 켜거나 끈다.
- umount2() : 파일시스템 unmount
- ioctl() : 장치 제어
- fcntl() : 파일 제어
- mpx() : 사용되지 않음
- setpgid() : 프로세스의 그룹 아이디 설정
- ulimit() : 사용되지 않음
- olduname : 구식의 uname 시스템콜
- umaks() : 파일 마스크의 생성
- chroot() : 루트디렉토리의 변경
'System programing' 카테고리의 다른 글
리눅스 메모리에 대해 (0) | 2018.08.10 |
---|---|
[ 공유 메모리 ] (0) | 2018.06.09 |
[ 좀비 프로세스 ] (0) | 2018.06.09 |
[리눅스] 프로세스에 대해서 (0) | 2018.06.09 |
Comments