温馨提示×

linux drivers如何加载

小樊
45
2026-09-27 19:08:24
栏目: 智能运维

在 Linux 中,“驱动加载”通常指内核模块(kernel module,.ko 文件)或编译进内核的驱动如何使用和加载。下面按常见场景系统说明。


一、Linux 驱动的存在形式

  1. 编译进内核(built-in)
    • 随内核启动自动加载
    • 在 make menuconfig 中选为 *
  2. 可加载内核模块(Loadable Kernel Module, LKM)
    • 文件后缀 .ko
    • 可动态加载/卸载
    • 在 make menuconfig 中选为 M

二、手动加载驱动(最常用)

1. 加载模块

insmod hello.ko

或(推荐,自动处理依赖):

modprobe hello

2. 查看已加载模块

lsmod

或:

cat /proc/modules

3. 卸载模块

rmmod hello

或:

modprobe -r hello

4. 查看模块信息

modinfo hello.ko

三、模块存放位置

系统模块通常位于:

/lib/modules/$(uname -r)/

加载前若使用 modprobe,需先更新依赖:

depmod -a

四、开机自动加载驱动

方法 1:/etc/modules-load.d/

echo hello > /etc/modules-load.d/hello.conf

方法 2:/etc/modprobe.d/

用于指定参数或黑名单:

options hello param=1
blacklist bad_driver

五、设备树(Device Tree)相关(ARM / 嵌入式)

在设备树中声明设备:

&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,或 如何写和编译驱动,可以告诉我具体场景,我可以给更针对性的说明。

0 踩