BOBO's Note

Linux Kernel의 개념 본문

Embedded System

Linux Kernel의 개념

bobo_hee 2020. 5. 22. 16:38

Kernel의 개념 및 역할

커널은 운영체제의 핵심이 되는 프로그램이다.  메모리에 항상 상주하며 CPU, 메모리, I/O와 같은 하드웨어 및 시스템 자원을 효율적으로 관리한다. user spcae 애플리케이션에 하드웨어/아키텍처에 independent한 API를 제공하고, 여러 애플리케이션에서 하드웨어에 동시 접근하는 것을 제어한다.

전체 시스템 구조

 

Linux Kernel의 특징

Linux Kernel은 1991년 Linus Tovalds가 취미로 개발한 것으로 다음과 같은 특징을 갖는다.

 

  1. Portability: 다양한 아키텍처(ex. x86, ARM 등) 및 하드웨어에서 실행될 수 있다.

  2. Scalability: 작은 디바이스부터 슈퍼 컴퓨터까지 실행될 수 있다.

  3. Security: 오픈소스로 공개되어 많은 이슈들이 빠르게 고쳐지므로 안전하다.

  4. Stability & Reliability

  5. Modularity: 모듈화하여 필요한 기능을 원하는 때에 추가할 수 있다.

Linux Kernel은 monolithic한 구조를 갖는다. 즉, 하나의 바이너리 프로그램으로 동작한다.

(+): 시스템 콜, 커널 태스크 간 상호작용 오버헤드가 작아 빠르다.

(-): 새로운 기능을 추가하기 어렵다.

(-): 디버깅하기 어렵다.

 

LKMs (Loadable Kernel Modules)

커널이 부팅되는 도중에 또는 부팅 후 필요한 모듈을 로드해서 사용할 수 있는데, 이러한 모듈을 LKM이라 한다.

 

로드된 이후에는 monolithic kernel의 일부로서 동작한다. 대부분의 디바이스 드라이버가 LKM으로 개발된다.

 

Kernel과 System Call

시스템 콜은 커널과 user space 사이의 인터페이스이다. 즉, 애플리케이션은 시스템 콜을 이용해 커널에서 제공하는 기능을 사용할 수 있다. 

 

시스템 콜은 항상 stable하다. 커널 버전이 달라지더라도 한번 정의된 시스템 콜은 변하지 않는다. 예를 들어 시스템 콜의 번호가 31번으로 정의되면, 그 이후의 커널 버전에서도 31번으로 고정된다.

시스템 콜은 래핑되어 라이브러리 형태로 제공된다.

애플리케이션에서 시스템 콜을 직접적으로 호출할 수도 있지만, 주로 개발의 편의성을 위해 부가기능을 추가하여 라이브러리 함수 형태로 제공된다. 예를 들어 stdio.h에 정의된 printf()는 내부적으로 write() 시스템 콜을 호출한다.

 

Kernel에서의 개발

커널 개발은 user space 애플리케이션을 개발하는 것과 차이가 있다.

 

우선, C로 개발된다. 커널의 일부로서 동작하는 코드는 C++로 개발하지 않는데, 그 이유는 C++은 개발자의 수고를 덜어줄 수는 있지만 리소스를 많이 사용할 수 있고 속도가 느리기 때문이다.

 

gcc로만 컴파일된다. ANSI C 표준을 벗어나는 코드도 존재하기 때문이다. 요즘에는 LLVM C 컴파일러도 사용된다.

 

표준 C 라이브러리(ex. printf(), memset(). malloc() 등)를 사용하지 못한다. 대신, printk(), memset(), kmalloc()과 같은 함수들을 사용해야 한다.

 

floating point 데이터를 사용하지 못 한다. 일부 프로세서는 부동소수점 연산을 지원하지 않을 수 있기 때문이다. 

 

마지막으로 커널 내의 API는 커널 버전에 따라 계속 바뀔 수 있으므로 kernel이 업데이트될 때 디바이스 드라이버도 다시 컴파일되어야 한다.

'Embedded System' 카테고리의 다른 글

Android Boot Sequence  (0) 2020.05.26
임베디드 시스템의 Boot Sequence  (0) 2020.05.26
Generic Boot Sequence  (0) 2020.05.25
Cross Compile  (0) 2020.05.25
Embedded System의 개념  (0) 2020.05.22
Comments