1. Linux Kernel Module
리눅스 커널 모듈은 리눅스 커널에 동적으로 로드하거나 언로드할 수 있는 코드 조각으로 커널의 기능을 확장하거나 특정 기능을 추가할 때 사용된다. 커널 모듈은 실행 중인 커널에 동적으로 추가될 수 있어 커널을 재부팅하지 않고도 기능을 추가하거나 제거할 수 있는 장점이 있다.
2. Linux Device Driver
디바이스 드라이버는 특정 하드웨어 장치를 제어하기 위해 커널에서 실행되는 소프트웨어이다. 하드웨어 장치와 커널 간의 인터페이스를 제공하여 응용 프로그램이 하드웨어를 제어할 수 있게 하는 용도로 사용되며, 대부분의 디바이스 드라이버는 커널 모듈로 구현된다. 이를 통해 사용자가 원하는 하드웨어를 커널에 동적으로 추가하거나 제거할 수 있다.
즉, 커널 모듈은 커널에 로드되어 커널의 기능을 확장하는 모든 코드 조각을 말하며, 디바이스 드라이버를 특정 하드웨어 장치를 제어하는 커널 모듈의 일종이다.
3. Static Linux Kernel Module vs Dynamic LKM
커널 모듈은 정적 커널 모듈과 동적 커널 모듈로 구분되고 동적 커널 모듈은 다시 In-tree 모듈과 Out-of-tree 모듈로 구분된다.
3.1 정적 커널 모듈 (Static LKM, y로 설정된 모듈)
리눅스 커널을 빌드할 때 모듈을 커널 이미지에 정적으로 연결하여 모듈이 최종 리눅스 커널 이미지의 일부가 되게 할 수 있다. 이 방법은 최종 리눅스 커널 이미지의 크기를 증가시키며 런타임 동안 메모리를 영구적으로 차지하게 된다. 또한 모듈이 리눅스 커널 이미지에 '내장'되어 있기 때문에 모듈을 언로드할 수 없다.
3.2 동적 커널 모듈 (Dynamic LKM, m으로 설정된 모듈)
동적 커널 모듈은 최종 커널 이미지에 포함되지 않고, 별도로 컴파일된 .ko (Kernel Object) 파일로 존재한다. 이러한 커널 모듈은 사용자 공간 프로그램(insmod, modprobe, rmmod 등)을 통해 커널에서 동적으로 로드하거나 언로드할 수 있다.
동적 커널 모듈은 다시 In-tree 모듈과 Out-of-tree 모듈로 구분할 수 있다.
3.2.1 In-tree 커널 모듈
In-tree 커널 모듈은 리눅스 커널 소스 트리 내부에 포함된 모듈을 의미한다. Menuconfig와 같은 커널 구성 도구를 통해 선택할 수 있고, 커널의 탑 레벨 디렉토리의 Makefile을 통해 make modules 명령으로 빌드한다. Out-of-tree 모듈과 달리 In-tree 모듈은 커널의 일부로 간주되어 로드할 때 “tainted” warning이 나타나지 않는다.
3.2.2 Out-of-tree 커널 모듈
Out-of-tree 커널 모듈은 커널 외부에서 개발되어 커널과 독립적으로 관리되는 모듈을 말한다. 개발자가 특정 하드웨어나 소프트웨어의 기능 추가를 위해 작성할 수 있고, 빌드 시 커널 소스를 참조해야하긴 하지만 별도의 Makefile을 작성해 빌드한다. Out-of-tree 모듈을 커널에 로드할 때는 커널이 외부 모듈로 인해 tainted(오염된) 상태가 되었다는 warning이 나타난다. (모듈을 사용하는데 직접적인 문제가 되진 않는다.)
4. User space vs Kernel Space
리눅스 운영체제에서 CPU에서 실행되는 코드는 User space 코드와 Kernel space 코드로 구분된다.
- Kernel space 코드 : CPU가 Kernel space 코드를 실행할 때 CPU는 Privileged Mode로 동작한다. Kernel 레벨 코드는 시스템의 메모리, 주변 장치, 프로세서 등 제한된 리소스에 접근할 수 있다.
- User space 코드 : User space 프로그램이 실행될 때 CPU는 Restricted Mode로 동작한다. User space 코드는 접근이 허용되지 않는 메모리 위치(다른 프로세스의 메모리나 커널이 관리하는 보호된 메모리 영역)에 접근할 수 없다.
- System call : User space 프로그램은 직접 커널 메모리나 하드웨어에 접근할 수 없기 때문에 System call을 통해 커널의 도움을 요청한다. System call에 의해 호출되는 System call handler는 Kernel 레벨의 코드로 Privileged Mode에서 실행되어 User space 요청을 처리한다.
참고 : Fastbit Embedded Brain Academy | Linux device driver programming
'임베디드 개발 > 리눅스 디바이스 드라이버' 카테고리의 다른 글
LDD ] printk를 활용한 디버깅 (0) | 2024.10.06 |
---|---|
LDD ] 리눅스 커널 모듈 In-tree building (0) | 2024.10.04 |
LDD ] Hello World 커널 모듈 + Makefile 작성법 (0) | 2024.10.02 |
modprobe와 insmod의 차이 (0) | 2024.09.30 |