이것이 점프 투 공작소

시스템 콜 (Sys Call)에 대해 알아보자 본문

리눅스

시스템 콜 (Sys Call)에 대해 알아보자

겅겅겅 2023. 5. 6. 20:48

시스템 호출이란?

시스템 호출(SysCall)은 하드웨어와 사용자 공간 프로세스안에 존재하는 레이어(Layer)이고

장치파일이나 /proc 파일시스템을 호출할때도 시스템 호출을 통하게됩니다.

다음은 시스템 호출의 대표적인 역할입니다.

 

  • 사용자 공간에 하드웨어 인터페이스를 추상화된 형태로 제공합니다.
  • 시스템 보안 및 안정성을 제공합니다.
  • 사용자공간과 시스템 사이 공간을 둠으로써 프로세스별 가상 시스템 환경을 제공 할 수 있습니다.

시스템 호출 번호

리눅스의 모든 시스콜은 고유의 번호를 가집니다.

사용자 공간 프로세스가 시스콜을 실행하고자 할때 시스콜 번호를 통해 실행할 시스템 호출을 찾아냅니다.

커널에 등록된 모든 시스템 호출 목록은 sys_call_table이라는 테이블에 저장합니다.

어쩌다 시스컬이 제거되었거나 모종의 이유로 시스템호출을 사용 할 수 없는 상황이 발생하였을때는 sys_ni_syscall() 함수에 의해 오류코드만이 반환됩니다.

시스템 호출 핸들러

사용자 어플리케이션은 직접 커널 코드를 실행 할 수 없기에, 실행하고싶은 시스템호출이 있다면 커널에 이를 알려서 시스템을 커널 모드로 변환시켜야합니다.

이때 커널에 신호를 보내는 방법으로 소프트웨어 인터럽트라는 방법을 사용합니다.

예외(exception)가 발생하면 시스템은 커널 모드로 전환되고 예외처리기(시스템 호출 핸들러)가 실행됩니다. 

커널에서 원하는 시스템 호출 찾기

시스템 호출은 여러 종류가 있고, 모두 같은 방법으로 커널공간에 진입하기에 커널은 시스템 호출번호를 반드시 알아야,

원하는 시스템호출을 발생시킬 수 있습니다.

시스템 호출 번호는 eax레지스터를 통해 전달되고 이떄 시스템 호출 핸들러가 eax레지스터에서 값을 읽어 호출번호를 판단합니다.

시스템콜에서는 대부분 매개변수가 함께 전달되는데 이때 매개변수들도 차례대로 ebx, ecx, edx, esi, edi 레지스터에 저장됩니다.

system_call() 함수는 주어진 시스템호출 번호가 유효한 값인지 확인하고 아니라면 오류를 반환합니다.

 

시스템 호출 동작 순서

마지막으로 시스템 호출이 실행되는 과정을 간단한 예시와 함께 순서로 적어보았습니다.

 

-------------------------------------------사용자 공간-----------------------------------------

사용자공간

1. 어플리케이션에서 read() 함수를 호출합니다.

2. C라이브러리에서 read() 함수 래퍼가 실행됩니다.

 

--------------------------------------------커널 공간-----------------------------------------

커널공간

3. 시스콜 핸들러 system_call() 가 실행됩니다.

4. sys_read() 시스콜 호출이 실행됩니다.