커널 모듈은 장치 드라이버가 아닐 수도 있습니다.
"커널 드라이버 (Kernel driver)"는 잘 정의 된 용어는 아니지만 한 번 봅시다.
이것은 어떤 하드웨어도 구동하지 않으므로 "장치 드라이버"로 합리적으로 고려할 수없는 커널 모듈입니다.
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("GPL");
static int myinit(void)
{
printk(KERN_INFO "hello init\n");
return 0;
}
static void myexit(void)
{
printk(KERN_INFO "hello exit\n");
}
module_init(myinit)
module_exit(myexit)
빌드 후 다음과 함께 사용할 수 있습니다.
insmod hello.ko
그리고로 인쇄 hello init
됩니다 dmesg
.
그러나 장치 드라이버는 아니지만 커널 디버깅 / 성능 정보를 노출하는 모듈과 같이 실제로 유용한 커널 모듈이 있습니다.
장치 드라이버는 일반적으로 커널 모듈이기도합니다.
"장치 드라이버"인 무언가의 예는 구동하기 위해 하드웨어가 필요하고 하드웨어 설명이 복잡하기 때문에 생성하기가 조금 더 어렵다.
그러나 QEMU 또는 기타 에뮬레이터를 사용하여 실제 또는 단순화 된 하드웨어의 소프트웨어 모델을 구성 할 수 있습니다. 이는 하드웨어와 대화하는 방법을 배우는 좋은 방법입니다. 다음은 최소 PCI 장치 드라이버의 간단한 예입니다. https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module/hello.c
x86에서 하드웨어와 대화하는 것은 다음과 같습니다.
사용자 공간과 커널 공간의 차이점은 무엇입니까?에 설명 된대로 이러한 작업은 일반적으로 사용자 영역에서 수행 할 수 없습니다 . 그러나 몇 가지 예외가 있습니다 : https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
그런 다음 커널은보다 높은 수준의 API를 제공하여 이러한 하드웨어 상호 작용을보다 쉽고 휴대하기 쉽게 만듭니다.
request_irq
인터럽트 처리
ioreadX
및 IO 메모리 매핑
- PCI 및 USB와 같은 널리 사용되는 프로토콜을위한 더 높은 수준의 인터페이스