시스템콜
-
정의
응용프로그램에서 운영체제에게 기능(시스템 자원)을 수행해달라고 하는 하나의 수단
-
효과
- 저수준 프로그래밍을 몰라도 되므로 프로그래밍이 쉬워지며 호환성이 증대
- 사용자 요청을 처리하기전 인터페이스 수준에서 올바른 요청인지 검사할 수 있으므로 시스템 보안성이 높아진다.
-
이해
사용자프로세서가 소프트웨어 인터럽트를 통해 커널의 기능을 이용하기 위한 서비스를 요청하는 하나의 방법
-
처리방식 간단(ver.)
1. 사용자 프로세서가 시스템콜 요청
2. 제어가 커널로 넘어감 (사용자모드에서 커널모드로 전환) -> 이때 현재 상태 저장
커널의 내부에 시스템 콜을 구분하기 위해 기능별 고유번호가 할당되어 있고,
해당 번호로 커널내부에 제어루틴 정의
3. 커널은 요청받은 시스템 콜에 대응하는 기능번호 확인
4. 커널은 그 번호에 맞는 인터럽트 핸들러(인터럽트 서비스 루틴) 호출
5. 인터럽트를 모두 처리하고 나면 커널 모드에서 사용자 모드로 복귀
-
인터럽트 과정을 자세히 알아보자
상황 : process A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받음
- process A는 system call을 통해 인터럽트를 발생시킨다.
- CPU는 현재 진행 중인 기계어 코드를 완료한다.
- 현재까지 수행중이었던 상태를 해당 process의 PCB(Process Control Block)에 저장한다. (수행중이던 MEMORY주소, 레지스터 값, 하드웨어 상태 등...)
- PC(Program Counter, IP)에 다음에 실행할 명령의 주소를 저장한다.
- 인터럽트 벡터를 읽고 ISR 주소값을 얻어 ISR(Interrupt Service Routine)로 점프하여 루틴을 실행한다.
- 해당 코드를 실행한다.
- 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다.
- ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제 된다.
- IRET 명령어가 실행되면, 대피시킨 PC 값을 복원하여 이전 실행 위치로 복원한다.
-
시스템 콜의 종류
- 프로세스 제어
- exec() : 다른 프로그램의 실행
- fork() : 새 프로세스의 생성
- wait() : 자식 프로세스가 끝날 때까지 대기
- 장치관리
- 시스템 정보 및 자원관리
- 통신 관련
-
sys_call_table
- 시스템 콜 테이블 배열 ENTRY에 시스템 콜 정의
- arch/x86/kernel/syscall_table_32.S 또는 arch/x86/syscalls/syscall_32.tbl(syscall_64.tbl)
- 각각의 시스템 콜에 대한 호출 번호는 따로 정의되어 있다. (include/asm-generic/unistd.h 또는 include/uapi/asm-generic/unistd.h)
-
시스템 콜 호출 규약
- 커널 호출 : int 0x80, sysenter
- 프로세스로 복귀 : iret, sysexit
시스템콜의 초기화는 시스템 부팅시 커널초기화 과정에서 trap_init()함수내의 set_system_date(SYSCALL_VECTOR, &system_call)을 수행해서 0x80인터럽트를 위한 게이트 디스크립터를 설정한다.
SYSCALL_VECTOR : 0x80로 정의된 상수
&system_call : 시스템콜을 위한 핸들러 주소
ref)
1. https://duksoo.tistory.com/entry/System-call-등록-순서
2. https://velog.io/@adam2/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8
3. https://moldd.tistory.com/entry/%EC%8B%9C%EC%8A%A4%ED%85%9C-%EC%BD%9C1