추상화의 층구조

응용 프로그램 application program

ex. hello.c

라이브러리 library

ex. printf()

시스템 콜 system call

ex. sys_write()

파일 시스템 file system

ex. fs_write()

디바이스 드라이버 device driver

ex. disk_write()

디바이스 자체 device itself

ex. HW

 

 

 

 

 

라이브러리와 라이브러리 함수 (feat. libc)

 라이브러리 함수는 내부적으로 시스템 콜을 사용하기도 하고, 그렇지 않을 수도 있다. 예를 들어 printf()의 경우, 내부에서 write()라는 시스템 콜을 사용하고 strlen()의 경우는 어떤 시스템 콜도 사용하지 않는다. 또한, 예전에는 시스템 콜이었던 작업이 라이브러리 함수로 구현되는 경우도 있고, 그 반대의 경우도 있다. 그래서 라이브러리 함수와 시스템 콜을 굳이 의식적으로 구분해서 사용하지 않는 경우도 많다.

 그러나 시스템 콜과 라이브러리 함수의 차이를 아는 것은 리눅스가 돌아가는 근본 원리에 해당하므로 잘 알아둘 필요가 있다. 또한, man 페이지를 참조할 때도 도움이 된다. 예를 들어 printf라는 셸 명령어도 있고 라이브러리 함수도 존재한다. 라이브러리 함수에 대한 설명을 보고 싶으면 'man 3 printf'라고 입력해야 한다. 한편 write는 셸 명령어와 시스템 콜에 각각 존재하는데, 시스템 콜에 대한 설명을 보고 싶다면 'man 2 write'라고 입력해야 한다.

 리눅스에는 여러 라이브러리가 있는데, 그 중에서 특히 중요한 라이브러라가 C 표준 라이브러리(C standard library), 약칭 libc 이다. 우분투의 경우 /lib, CentOS는 /lib64 디렉토리에 있다. libc.so.6이 libc의 중심이 되는 파일이다.

 

 

 

 

 

시스템 콜

 리눅스의 핵심에는 커널이 있고, 이 커널에 일을 맡기기 위해 시스템 콜을 이용한다. 또한 리눅스의 세 가지 중요 개념인 파일 시스템, 프로세스, 스트림도 시스템 콜을 통해 동작한다. 즉, 리눅스를 이해하는 중심에는 시스템 콜이 있다.

 하드웨어를 직접 다루는 건 커널만이 할 수 있기 때문에 일반 프로그램은 하드웨어를 조작하기 위해 커널에 의뢰해야만 한다. 커널은 시스템에서 가장 높은 위치에 있는 통치자이기도 하지만, 이처럼 밑바닥에서 혹사당하는 프로그램이기도 한 것이다.

 일반 프로그램이 커널에 디바이스 조작 작업을 의뢰하기 위해 사용하는 것이 시스템 콜(system call)이다. 시스템 콜이란 이름에서 시스템은 커널을 말하며, 커널을 부른다(call)는 의미에서 시스템 콜이라 한다. 구체적으로는 다음과 같은 시스템 콜이 존재한다.

open, read, write, fork, exec, stat, unlink

 일반적으로 시스템 콜을 호출하는 코드는 겉으로 봤을 때는 일반 함수를 사용하는 것과 큰 차이가 없다.

 

 

 

 

 

디바이스와 디바이스 드라이버

커널이 관리하는 하드웨어의 종류에는 CPU, 메모리, HDD(Hard Disk Drive), SSD(Solid State Drive), DVD-ROM 드라이브, CD-ROM 드라이브, 크래픽 어댑터(화면을 모니터에 전달), 네트워크 어댑터, 사운드 카드, 시계(하드웨어 클록) 등이 있다. 이와 같은 물리적인 부품들을 디바이스(device)라고 한다. 커널은 위에 나열한 디바이스들을 총괄한다. 그런더 HDD에도 여러 종류가 있고 종류 별로 조작 방법이 다 다르다. 따라서 종류가 다른 HDD가 세 개 있다면, 커널에도 이에 대응한 어댑터 코드가 세 개 필요하다. 이러한 디바이스를 다루는 코드는 필요에 따라 커널에 적재할 수 있도록 디자인되어 있다. 이렇게 특정 디바이스를 조작하는 소프트웨어를 디바이스 드라이버(device driver)라고 한다.

+ Recent posts