리눅스 - 시스템 호출
시스템 호출
1. 개요
시스템 호출은 하드웨어와 사용자 공간 프로세스 사이에 있는 계층이다.
이 계층은 3가지 역할을 한다.
- 사용자 공간에 하드웨어 인터페이스를 추상화된 형태로 제공한다.
- 시스템 보안 및 안정성을 제공한다.
- 프로세스별 가상 시스템 환경을 제공할 수 있다.
사실 추상화된 형태로 제공하기 때문에 보안과 안정성, 그리고 가상 시스템 환경 기능이 따라오는 것이긴 하지만 일단은 위의 세가지에 대해서 좀 더 세부적으로 각각 알아보자.
2. 하드웨어 인터페이스 추상화
어플리케이션에서는 시스템 호출을 직접 사용하지 않고 사용자 공간에 구현된 API(Application Programming Interface)를 이용한다.
이러한 인터페이스는 0개 이상의 시스템 호출을 사용해 구현되며 내부 구현이 달라도 동일한 인터페이스를 제공해준다.
리눅스에서 이런 API는 POSIX 표준이다. IEEE 표준의 집합이며, 유닉스 기반 운영체제 간의 이식성 제공을 목적으로 정해졌다.
초기 유닉스 시스템의 인터페이스를 본따 만들어졌지만 지금은 윈도우 NT 같은 시스템에서도 POSIX 호환 라이브러리를 제공하기도 한다.
리눅스에서 시스템 호출 인터페이스는 C 라이브러리 형태로 제공되는데 이 C 라이브러리에는 표준 C 라이브러리와 시스템 호출 라이브러리등 유닉스 시스템의 API가 구현되어있다.
3. 시스템 보안 및 안정성 제공
1) 시스템 콜
줄여서 시스콜(syscall)이라고 부르는 이 시스템 호출은 보통 c라이브러리에 정의된 함수를 호출하는 방식으로 사용한다.
0개 이상의 인자를 받고 하나 이상의 사이드 이펙트를 발생시킬 수 있다.
모든 시스템 콜은 번호가 할당되는데 이를 시스템 호출 번호, 줄여서 시스콜 번호라고 한다. 이 번호는 특정 시스템 호출을 참조하는데 사용하는 고유번호이다. 한번 할당되면 변경할 수 없는게 이는 변경되버린다면 이전에 이미 컴파일된 어플리케이션이 실행되지 않을 것이기 때문이다.
따라서 시스템 호출이 제거된 경우라도 해당 시스템 호출 번호는 재 사용하지 않는게 원칙이다.
이런 경우 없는 시스템 호출에 대해 예외처리를 하기 위해 sys_ni_syscall()함수를 제공하는데 유효하지 않은 시스템 호출이라는 뜻의 -ENOSYS 오류 코드를 반환하는 일만 한다.
2) 시스템 호출 핸들러
리눅스는 사용자 공간에서 구동중인 어플리케이션이 직접 커널 코드를 호출 할 수 없다.
이는 커널 코드에 직접 접근이 가능하게 되면 보안이나 안정성을 기대할 수 없기 때문이다.
대신에 시스템 공간 어플리케이션이 커널에 필요한 시스템 호출이 있다는 것을 알리는 방식을 사용하는데 이렇게 알리게되면 커널은 시스템을 커널 모드로 전환해서 시스템 호출을 하게 된다. 이때 사용하는 것이 소프트웨어 인터럽트라는 방법을 사용하는 것이다. 일반적으로 예외가 발생하면 시스템은 커널 모드로 전환하고 예외 처리기가 실행되어 예외를 처리한다.
소프트웨어 인터럽트도 예외의 일종이고 이 경우 시스템 호출 핸들러가 예외처리기가 된다.
3) 시스템 호출 절차
위에서 설명한 내용을 바탕으로 x86기준 시스템 호출 절차를 설명하자면 다음과 같다.
- eax 레지스터에 필요한 시스콜 번호를 넣는다.
- 소프트웨어 인터럽트를 발생시킨다.
- 커널모드로 전환된다.
- system_call() 함수에서 유효한 시스콜 번호인지 확인한다.
- 유효하지 않으면 -ENOSYS 값을 반환한다.
- 유효하면 지정된 시스템 호출을 실행한다.
4. 프로세스별 가상 시스템 환경을 제공
프로세스 별로 가상 시스템 환경을 제공할 수 있는 이유가 사실 위에서 언급한 시스템 호출 핸들러 덕분이다.
만약 시스템 호출 핸들러를 통해 커널 영역 기능을 사용하는게 아니라 각 프로세스가 직접 커널 영역에 접근하여 관련 기능을 사용한다고 가정해보자. 그런 경우 모든 프로세스가 사용하기 전에 현재 내가 사용하려하는 기능이 다른 프로세스에 의해 점유중인지 확인해야할 것이고, 좀 더 고려해야할 경우가 많아 질 것이다.
프로세스단에서 커널 영역까지 고려하지 않아도 되기 때문에 멀티 태스킹이 가능한것이며 흡사 페이징과 같이 프로세스별 가상 시스템 환경을 제공한다고 할 수도 있는 것이다.
참고문헌
- 리눅스 커널 심층분석 (에이콘 임베디드 시스템프로그래밍 시리즈 33, 로버트 러브 저자(글) · 황정동 번역)