什么是设备驱动程序?

设备驱动程序本质上是操作系统和硬件设备之间的桥梁,它屏蔽了硬件设备的物理差异,向上层提供标准的操作接口。

// 假设这里是操作系统的 demo, 操作系统定义了 init exit print 三个抽象接口,当用户点击打印按钮之后,操作系统就会按序执行接口内容,接口实现在驱动程序中,具体逻辑要在驱动加载 probe 之后才能知道;
typedef struct {
    void (*device_init) ();
    void (*device_print)(const char *buf);
    void (*device_exit)();
} DeviceDriverInterface;

int main() {
    DeviceDriverInterface driver_exa;

    if (driver_probe(&driver_exa) != 0) {
        printf("[OS] 错误:驱动加载失败!\n");
        return -1;
    }

    printf("用户点击打印按钮\n");
    driver_exa.device_init();
    driver_exa.device_print("hello world");
    driver_exa.device_exit();

    return 0;
}

// 这里是 driver 内容,定义了具体的逻辑代码(对应到实际的硬件应该是一些寄存器操作)
void driver_init() {
    printf("driver_init\n");
}

void driver_print(char *buf) {
    printf("driver_print: %s\n", buf);
}

void driver_exit() {
    printf("driver_exit\n");
}

void driver_probe(DeviceDriverInterface *interface) {
    printf("driver_probe\n");
    interface->device_init = driver_init;
    interface->device_print = driver_print;
    interface->device_exit = driver_exit;
}

什么是 LKM?

Linux 提供了运行时动态拓展的特性,在不重新编译/重启内核的情况下,可以动态添加或移除的代码被称为内核模块。
每个模块由目标代码(通常为 ko 文件)组成,通过 insmod 将模块动态链接到正在运行的内核空间中,使其成为内核代码的一部分,也可以通过 rmmod 使其从内核中安全移除。可以使用 lsmod 查看已经加载的内核模块。

许可证条款

Linux 驱动程序中的 MODULE_LICENSE(“GPL”); 意味着该驱动遵循 GNU 通用公共许可证(GPL)发布。
它允许出于任何目的运行该程序。
它允许查看源代码,也允许根据需要修改代码。
它允许修改代码并发布产品赚钱,但在分发该产品时,必须把修改后的代码免费公开,并且附上同样的 GPL 条款。

Linux 遵循 GPL2 发布,模块声明 MODULE_LICENSE(“GPL”) 会直接触发以下两个技术机制:
1、解锁专属 API(权限控制)
机制:内核核心函数通过 EXPORT_SYMBOL_GPL 导出。只有声明 GPL 的模块才有权调用,否则内核在加载时会直接报错拒绝。
(注:普通函数用 EXPORT_SYMBOL 导出,所有模块皆可调用。)
2、避免内核污染(责任界定)
机制:加载非 GPL(闭源)模块会给内核打上“污染标记”(Tainted flag)。
后果:一旦系统崩溃(Kernel Panic),官方社区看到污染标记后,通常会拒绝协助排查问题。

用户空间和内核空间

用户空间(用户态 / Ring 3):CPU 运行在低特权级模式,只能执行常规指令,无法直接访问硬件或受保护的内存。
内核空间(内核态 / Ring 0):CPU 运行在高特权级模式,可以执行包括特权指令在内的任何指令,拥有对硬件和内存的完全控制权。

内存映射机制:
两种模式拥有各自的内存映射。其中,用户空间的虚拟地址在每个进程间是相互隔离、各自独立的;但内核空间的虚拟地址在所有进程间是全局共享的。

状态切换机制:
当发生以下三种情况时,CPU 会从用户态切换到内核态:
系统调用(主动请求内核服务,如读写文件)。
异常(CPU 执行时遇到内部事件,如缺页中断)。
外部中断(硬件设备发出中断信号,如网卡收包、定时器触发)。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐