[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
에 계속해서 더한 후, sum
을 printf
로 출력하는 프로그램이다.위 프로그램을 리눅스 환경에서
gcc
를 이용해 컴파일해보자.ubuntu@ubuntu-VirtualBox:~$ gcc test.c -o test
strace
는 응용 프로그램이 사용하는 시스템 콜을 모두 추적하여 보여주는 리눅스 유틸리티이다. 빌드한 test
파일을 strace
유틸리티를 이용하여 분석해보자.ubuntu@ubuntu-VirtualBox:~$ strace ./test
다음은 필자의 컴퓨터에서 실행한 결과 화면이다.실행 시의 구체적인 값(메모리 주소 등)은 매 실행마다 달라지겠지만, 프로그램의 전체적인 흐름은 변하지 않는다.
이렇게 간단한 프로그램에도 수많은 시스템 콜이 쓰인 것을 볼 수 있다.
strace
결과를 간단하게 설명하면, 프로그램을 실행하고(execve
), 라이브러리를 로드한 후(access
, openat
, fstat
, read
, mmap
등), 프로그램의 보안 설정을 하고(mprotect
), 프로그램을 위한 메모리 공간을 할당하고(brk
), 실행 결과를 출력한다(write
).이런 일들은 응용 프로그램이 혼자서 실행할 수 없거나 해서는 안되는 성질의 작업들이다.1 따라서 커널은 이런 일들에 대해서 시스템 콜이라는 형태로 각 응용 프로그램으로부터의 요청을 받아 수행해 준다.
시스템 콜의 종류
운영체제마다 시스템 콜의 종류, 개수, 구현 등이 다 다르다. 하지만 일반적으로 시스템 콜은 크게 5개 정도로 분류해 볼 수 있다.-
프로세스 관리 (Process Control)
ex) 프로세스 생성, 프로세스 종료 등
-
파일 관리 (File Management)
ex) 파일 생성, 디렉토리 생성, 파일 열기 등
-
장치 관리 (Device Management)
ex) 장치 사용, 장치 사용 해제, 장치 설정 등
-
정보 유지 (Information Maintenance)
ex) 스톱워치, 시간 설정 등
-
통신 (Communication)
ex) 소켓 생성, 소켓 종료, 메시지 전달 등
- 만약 응용 프로그램이 직접 프로세스 관리, 메모리 할당 등을 할 수 있다면 심각한 보안 문제가 발생할 수 있다. 따라서 현대의 대부분의 운영체제에서는 응용 프로그램의 권한을 제한하여 시스템의 안정성을 해칠 수 있는 위험한 작업들은 오직 커널만이 수행할 수 있도록 한다. 커널은 시스템 콜을 통해 들어온 응용 프로그램들로부터의 요청의 유효성을 확인하여 유효한 명령만 처리해준다. ↩︎
>> | ||
02. 시스템 환경 |