Một mô-đun hạt nhân có thể không phải là một trình điều khiển thiết bị.
"Trình điều khiển hạt nhân" không phải là một thuật ngữ được xác định rõ ràng, nhưng hãy thử xem.
Đây là mô-đun hạt nhân không điều khiển bất kỳ phần cứng nào và do đó không thể được coi là "trình điều khiển thiết bị" một cách hợp lý:
#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)
Sau khi xây dựng, bạn có thể sử dụng nó với:
insmod hello.ko
và nó in hello init
ra dmesg
.
Tuy nhiên, có các mô-đun hạt nhân không phải là trình điều khiển thiết bị, nhưng thực sự hữu ích, ví dụ, các mô-đun phơi bày thông tin gỡ lỗi / hiệu năng của hạt nhân.
Trình điều khiển thiết bị thường là các mô-đun hạt nhân.
Một ví dụ về một cái gì đó là "trình điều khiển thiết bị" khó tạo ra hơn một chút, vì nó yêu cầu phần cứng để lái và các mô tả phần cứng có xu hướng phức tạp.
Tuy nhiên, sử dụng QEMU hoặc các trình giả lập khác, chúng ta có thể xây dựng các mô hình phần mềm của phần cứng thực hoặc đơn giản hóa, đây là một cách tuyệt vời để tìm hiểu cách nói chuyện với phần cứng. Dưới đây là một ví dụ đơn giản về trình điều khiển thiết bị PCI tối thiểu: https://github.com/cirosantilli/linux-kernel-module-cheat/blob/6788a577c394a2fc512d8f3df0806d84dc09f355/kernel_module
Sau đó chúng ta thấy rằng trong x86, nói chuyện với phần cứng đi xuống:
Những hoạt động nói chung không thể được thực hiện từ vùng người dùng, như được giải thích tại: Sự khác biệt giữa không gian người dùng và không gian hạt nhân là gì? Tuy nhiên, có một số trường hợp ngoại lệ: https://stackoverflow.com/questions/7986260/linux-interrupt-handling-in-user-space .
Sau đó, hạt nhân cung cấp các API cấp cao hơn để giúp tương tác phần cứng như vậy dễ dàng hơn và dễ mang theo hơn:
request_irq
để xử lý các ngắt
ioreadX
và ánh xạ bộ nhớ IO
- giao diện cấp cao hơn cho các giao thức phổ biến như PCI và USB