[SW_Jungle] system call

Jin Lee·2022년 1월 6일
0

PintOS

목록 보기
12/16
post-thumbnail

시스템콜

  • 정의
    응용프로그램에서 운영체제에게 기능(시스템 자원)을 수행해달라고 하는 하나의 수단

  • 효과

    • 저수준 프로그래밍을 몰라도 되므로 프로그래밍이 쉬워지며 호환성이 증대
    • 사용자 요청을 처리하기전 인터페이스 수준에서 올바른 요청인지 검사할 수 있으므로 시스템 보안성이 높아진다.
  • 이해
    사용자프로세서가 소프트웨어 인터럽트를 통해 커널의 기능을 이용하기 위한 서비스를 요청하는 하나의 방법

  • 처리방식 간단(ver.)
    1. 사용자 프로세서가 시스템콜 요청
    2. 제어가 커널로 넘어감 (사용자모드에서 커널모드로 전환) -> 이때 현재 상태 저장

    커널의 내부에 시스템 콜을 구분하기 위해 기능별 고유번호가 할당되어 있고,
    해당 번호로 커널내부에 제어루틴 정의

    3. 커널은 요청받은 시스템 콜에 대응하는 기능번호 확인
    4. 커널은 그 번호에 맞는 인터럽트 핸들러(인터럽트 서비스 루틴) 호출
    5. 인터럽트를 모두 처리하고 나면 커널 모드에서 사용자 모드로 복귀

  • 인터럽트 과정을 자세히 알아보자
    상황 : process A 실행 중 디스크에서 어떤 데이터를 읽어오라는 명령을 받음

    1. process A는 system call을 통해 인터럽트를 발생시킨다.
    2. CPU는 현재 진행 중인 기계어 코드를 완료한다.
    3. 현재까지 수행중이었던 상태를 해당 process의 PCB(Process Control Block)에 저장한다. (수행중이던 MEMORY주소, 레지스터 값, 하드웨어 상태 등...)
    4. PC(Program Counter, IP)에 다음에 실행할 명령의 주소를 저장한다.
    5. 인터럽트 벡터를 읽고 ISR 주소값을 얻어 ISR(Interrupt Service Routine)로 점프하여 루틴을 실행한다.
    6. 해당 코드를 실행한다.
    7. 해당 일을 다 처리하면, 대피시킨 레지스터를 복원한다.
    8. ISR의 끝에 IRET 명령어에 의해 인터럽트가 해제 된다.
    9. 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

profile
깃허브 : https://github.com/jinlee9270

0개의 댓글