티스토리 뷰

System call과 Function call의 차이점?

함수 호출은 하나의 프로세스 안에서 하나의 함수가 다른 함수를 호출하는 것이다.

모드 스위치가 발생하지 않는다.

시스템 호출은 한 프로세스 안에 함수가 OS 커널안에 있는 부분을 호출하는 것이다.

모드 스위치가 (사용자 -> 커널) 발생한다.

 

왜 OS를 통해서 접근할까?  사용자 모드에서는 하드웨어에 직접적으로 접근할 권한이 없기 때문이다.

 

시스템 콜할때 과정

1. 프로세스의 상태를 저장

2. 커널로 모드 스위치가 발생한다. 커널이 CPU를 사용

3. 커널에서는 전달받은 파라미터를 검사한다.

4. 실제적으로 시스템 콜에 해당하는 함수를 사용한다.

5. 커널의 상태를 저장한다.

6. 다시 Caller 프로세스로 전환하기 위해서 유저모드로 스위치를 한다.

여러 단계를 거치기 때문에 시스템 콜은 오버헤드가 크다 (cpu를 많이 사용한다.)

 

시스템 콜의 예

 

1. execve(프로그램을 실행시키는 시스템 콜) 호출

2. glibc의 execve라는 referfunction을 호출한다.

3. int 0x80이라는 인터럽트를 걸어준다.  (커널 모드로 스위치를 한다.)

4. system call 테이블에서 시스템 콜 위치를 찾는다.

5. sys_execve를 수행하고 error를 리턴한다.

6. 다시 사용자 모드로 돌아간다.

7. glibc 호출했던곳으로 돌아가고 원래 수행했던 곳으로 돌아간다.

 

리눅스에서는 시스템콜이 400여가지가 있다.

시스템 콜들의 종류

getuid() : 유저 id를 리턴

fork() : 자식 프로세스를 생성

exec() : 새로운 프로그램을 수행시킨다.

 

man syscalls : 시스템에서 사용하는 시스템콜들의 메뉴얼 페이지를 출력해주는 명령어

man 2 open : open이 무엇을 수행하는지 궁금할때

 

 

시스템 콜을 사용할때에는 에러를 다루는것이 중요하다.

시스템 콜을 호출했을때 제대로,정상적으로 호출되었는지 알 필요가 있다.

성공을 못했다면 그 이유는 무엇인지 알아야 한다.

실패할 경우 '-1'을 리턴해준다.

errno : 가장 최근에 실패한 시스템 콜의 에러 번호가 저장되어 있는 변수 이다.

각각의 번호가 의미하는 바는 errno.h에 기록되어있다.

perror() : 각각의 에러번호의 의미를 출력해준다.

 

간단한 예제

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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