커널이란?

커널(kernel)은 리눅스 공부할 때에 있어 아주 핵심적이며 자주 사용하는 용어이다. 하지만 커널이 무엇인지 명확하게 설명하기 어려워 커널이 무엇인지 정리해 보고 싶었다. 커널은 사물의 중심이라는 뜻을 가지며 운영체제의 중심을 의미한다. 보통 커널은 하나의 프로그램으로 구성되어 컴퓨터를 구성하는 모든 하드웨어와 소프트웨어를 관리한다. ‘리눅스’라고 표현하면 커널을 의미하는 것이고, ‘리눅스 운영체제’라고 하면 커널뿐만 아니라 다른 소프트웨어가 포함된 것을 의미한다.

리눅스의 루트 경로(/) 또는 /boot 디렉토리에서 ls 명령어를 실행해 보면 vmlinuz나 vmlinuxm vmlinuz-X.X.X라는 이름의 파일이 있는데 이것이 리눅스 커널의 본체이다.

리눅스 커널의 버전은 아래 세 명령어 중 하나로 확인할 수 있다.

uname -a
cat /etc/issue or issue*
cat /proc/version

시스템 콜(System Call)

커널의 중요한 역할 중 하나는 컴퓨터의 하드웨어를 관리하는 것이다. CPU, 메모리, HHD, SSD, DVD-ROM 드라이브, CD-ROM 드라이브, 그래픽 어댑터, 네트워크 어댑터, 사운드 카드, 시계와 같은 물리적인 디바이스를 총괄한다. 이런 하드웨어를 직접 다루는 것은 커널만이 할 수 있기 때문에 일반 프로그램은 하드웨어를 조작하기 위해 커널에 요청해야 한다. 이처럼 프로그램이 커널에 디바이스 조작 작업을 의뢰하기 위해 사용하는 것을 시스템 콜(system call)이라고 한다. read, open, write, fork, exec, state, unlink가 대표적인 시스템 콜이며 일반 함수를 사용하는 것과 크게 차이가 없다.

예를 들어 read와 write는 각각 아래 코드로 시스템 콜을 호출할 수 있다.

n = read(fd, buf, sizeof buf)
ssize_t write(int fd, const void *buf, size_t count)

시스템 콜과 라이브러리 함수의 차이

라이브러리 함수 내부적으로 시스템 콜을 사용할 수도 아닐 수도 있다. 예를 들어 printf()의 경우 write()라는 시스템 콜을 사용하고, strlen()의 경우 어떤 시스템 콜도 사용하지 않는다.

man 페이지에도 man 1은 General commands manual, man 2는 System call manual, man 3은 Library functions manual으로 구분되어 있다. 시스템 콜에 대한 write의 설명을 보고 싶다면 ‘man 2 write’ 라이브러리 함수에 대한 설명을 보고 싶다면 ‘man 3 printf’라고 입력해야 한다. printf 과제를 할 때 ‘man printf’라고만 검색해 원형을 바로 찾을 수 없었던 이유도 여기서 찾을 수 있었다.

정리하자면 시스템 콜은 커널에 직접 요청하는 것이며, 라이브러리 함수는 시스템 콜 함수를 래핑(wrapping) 한 것이다.