[OS] 리눅스 시스템 콜 추가하기 - 01. 서론

[OS] 리눅스 시스템 콜 추가하기
01. 서론
02. 시스템 환경
03. 실습환경 설치하기
04. 리눅스 시스템 콜 추가하기

01. 서론

이번 글에서는 리눅스 커널에 새로운 시스템 콜을 추가해 보도록 하겠다.

시스템 콜

시스템 콜이란 커널이 응용 프로그램과 (또는 사용자와 직접적으로) 의사소통하는 방법이다. 커널은 자신이 할 수 있는 일들, 이를테면 프로세스를 생성하거나 종료하는 일, 파일 시스템을 조작하는 일 등을 '시스템 콜’이라는 형태로 외부에 제공한다. 응용 프로그램은 시스템 콜을 적절히 사용해 본인이 맡은 일을 처리한다.
다음 C 프로그램(test.c)을 보자.
/* test.c */
#include <stdio.h>

int main()
{
    int sum = 0;
    for(int i = 1; i <= 10; i++)
    {
        sum += i;
    }
    printf("%d\n", sum);
    return 0;
}
프로그램은 아주 간단하다. for 반복문에서 1부터 10까지의 숫자를 sum에 계속해서 더한 후, sumprintf로 출력하는 프로그램이다.
위 프로그램을 리눅스 환경에서 gcc를 이용해 컴파일해보자.
ubuntu@ubuntu-VirtualBox:~$ gcc test.c -o test
strace는 응용 프로그램이 사용하는 시스템 콜을 모두 추적하여 보여주는 리눅스 유틸리티이다. 빌드한 test 파일을 strace 유틸리티를 이용하여 분석해보자.
ubuntu@ubuntu-VirtualBox:~$ strace ./test
다음은 필자의 컴퓨터에서 실행한 결과 화면이다.
strace

실행 시의 구체적인 값(메모리 주소 등)은 매 실행마다 달라지겠지만, 프로그램의 전체적인 흐름은 변하지 않는다.
이렇게 간단한 프로그램에도 수많은 시스템 콜이 쓰인 것을 볼 수 있다. strace 결과를 간단하게 설명하면, 프로그램을 실행하고(execve), 라이브러리를 로드한 후(access, openat, fstat, read, mmap 등), 프로그램의 보안 설정을 하고(mprotect), 프로그램을 위한 메모리 공간을 할당하고(brk), 실행 결과를 출력한다(write).
이런 일들은 응용 프로그램이 혼자서 실행할 수 없거나 해서는 안되는 성질의 작업들이다.1 따라서 커널은 이런 일들에 대해서 시스템 콜이라는 형태로 각 응용 프로그램으로부터의 요청을 받아 수행해 준다.

시스템 콜의 종류

운영체제마다 시스템 콜의 종류, 개수, 구현 등이 다 다르다. 하지만 일반적으로 시스템 콜은 크게 5개 정도로 분류해 볼 수 있다.
  1. 프로세스 관리 (Process Control)
    ex) 프로세스 생성, 프로세스 종료 등
  2. 파일 관리 (File Management)
    ex) 파일 생성, 디렉토리 생성, 파일 열기 등
  3. 장치 관리 (Device Management)
    ex) 장치 사용, 장치 사용 해제, 장치 설정 등
  4. 정보 유지 (Information Maintenance)
    ex) 스톱워치, 시간 설정 등
  5. 통신 (Communication)
    ex) 소켓 생성, 소켓 종료, 메시지 전달 등

  1. 만약 응용 프로그램이 직접 프로세스 관리, 메모리 할당 등을 할 수 있다면 심각한 보안 문제가 발생할 수 있다. 따라서 현대의 대부분의 운영체제에서는 응용 프로그램의 권한을 제한하여 시스템의 안정성을 해칠 수 있는 위험한 작업들은 오직 커널만이 수행할 수 있도록 한다. 커널은 시스템 콜을 통해 들어온 응용 프로그램들로부터의 요청의 유효성을 확인하여 유효한 명령만 처리해준다. ↩︎
>>
02. 시스템 환경