在 Linux 中,“驱动加载”通常指内核模块(kernel module,.ko 文件)或编译进内核的驱动如何使用和加载。下面按常见场景系统说明。
make menuconfig 中选为 *.komake menuconfig 中选为 Minsmod hello.ko
或(推荐,自动处理依赖):
modprobe hello
lsmod
或:
cat /proc/modules
rmmod hello
或:
modprobe -r hello
modinfo hello.ko
系统模块通常位于:
/lib/modules/$(uname -r)/
加载前若使用 modprobe,需先更新依赖:
depmod -a
/etc/modules-load.d/echo hello > /etc/modules-load.d/hello.conf
/etc/modprobe.d/用于指定参数或黑名单:
options hello param=1
blacklist bad_driver
在设备树中声明设备:
&i2c1 {
status = "okay";
my_sensor@48 {
compatible = "vendor,my-sensor";
reg = <0x48>;
};
};
驱动通过 of_match_table 匹配。
| 总线 | 匹配方式 |
|---|---|
| PCI | vendor/device id |
| USB | id_table |
| Platform | compatible(设备树) |
| I2C/SPI | 设备树或板级代码 |
insmod 失败:dmesg | tail
Unknown symbol in module
通常是未 EXPORT_SYMBOL#include <linux/module.h>
#include <linux/kernel.h>
static int __init hello_init(void)
{
printk(KERN_INFO "Hello driver\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_INFO "Bye driver\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");
编译后:
insmod hello.ko
dmesg | tail
如果你指的是 特定硬件(如 USB / PCI / GPU)、Android / 嵌入式 Linux,或 如何写和编译驱动,可以告诉我具体场景,我可以给更针对性的说明。