본문 바로가기

코드^학습/메모한 지식

리눅스 커널 심층분석 0x003

1_ 리눅스 커널의 개요

◆ 운영체제와 커널

 책에서 말하는 운영체제란 기초적인 사용과 관리를 위한 기능을 지원하는 시스템의 일부분을 말한다. 커널, 디바이스 드라이버, 부트 로더, 커맨드 쉘, 유저 인터베이스, 파일 시스템 이런 종류를 말한다. 커널은 하드웨어를 관리하며, 시스템 자원을 분배한다. 커널의 주 구성요소로는 인터럽트 요청을 처리하는 interrupt handler, 프로세스 간에 프로세서 시간을 분배하는 scheduler,  momory manager를 갖는다. 보호 메모리(protected memory)를 지원하는 커널은 일반적인 유저 응용 프로그램보다 높은 시스템 상태를 갖게 되는데, 높은 상태란 메모리가 보호되며 하드웨어가 자유로이 접근할 수 있음을 포함한다. 이런 시스템 상태와 메모리 영역을 합쳐 커널 공간(kernel0space)라고 한다.


 시스템 상에서 실행되는 응용 프로그램은 시스템 콜을 통하여 커널과 통신한다. C언어로 프로그램을 만들면서 라이브러리 함수를 쓰면 그 라이브러리에 있는 시스템 콜을 사용하여 기능을 구현하게 된다. 구현된 응용프로그램은 라이브러리 함수에 따라서 시스템 콜과 1:1관계를 맺는 것도 있고 아닌 것도 있다. (시스템콜을 안 쓰는 것도 있다. 우리가 아는 string.h의 관련 함수들이 대표적) 응용프로그램이 시스템 콜을 실행한다는 것은 응용 프로그램 대신 커널이 수행된다는 것이다.


 커널은 시스템의 하드웨어를 관리한다. 대부분 시스템의 아키텍쳐가 interrupt란 개념을 사용한다.  하드웨어가 시스템과 통신할 때 interrupt를 발생시키는데, 인터럽트는 비동기적으로 커널을 중단시키게 된다. 인터럽트는 어떤 번호를 가지는데, 커널을 이 번호를 이용하여 특정 인터럽트 핸들러를 작동, 처리하고 응답한다.

 예를 들어서 키보드 입력 인터럽트가 발생한다면 시스템으로 하여금 키보드 버퍼에 처리해야할 데이터가 있음을 알린다. 커널은 발생한 인터럽트의 번호를 보고 알맞은 인터럽트 핸들러를 실행한다. 핸들러는 키보드 데이터를 처리하고 키보드 컨트롤러에 데이터를 받아들일 준비가 되었음을 알리게 된다. 커널은 종종 인터럽트를 발생하지 않도록 할 수 있다.(전부다 혹은 특정 인터럽트만)


 인터럽트 핸들러는 어떤 프로세스와도 관련되지 않는 특정한 인터럽트 컨텍스트(영역)에서 수행되는데, 이렇게 특정한 영역을 사용하는 이유는 좀더 빨리 인터럽트에 응답할 수 있게 위해서이다.

멍2