温馨提示×

什么是linux驱动

小樊
40
2026-07-10 13:04:05
栏目: 智能运维

Linux 驱动是指运行在 Linux 内核中的程序,用来让操作系统能够识别、控制和使用硬件设备。它是硬件与 Linux 内核之间的桥梁


一、通俗理解

你可以把 Linux 驱动理解为:

“硬件的翻译官”

  • 硬件只懂电信号、寄存器
  • Linux 内核只懂统一的内核接口
  • 驱动负责把两者对接起来

例如:

  • 插上 U 盘 → 驱动让系统识别成 /dev/sdb
  • 按下键盘 → 驱动把按键事件上报给系统
  • 网卡收到数据 → 驱动通知内核处理网络包

二、驱动在系统中的位置

应用程序
   ↓
系统调用
   ↓
Linux 内核
   ↓
设备驱动
   ↓
硬件(CPU / 内存 / 寄存器)

驱动运行在内核空间,拥有很高的权限。


三、Linux 驱动的分类

1️⃣ 按设备类型分(最重要)

类型 说明 例子
字符设备驱动 按字节流访问 键盘、串口、LED、传感器
块设备驱动 按数据块访问 硬盘、U 盘、SSD
网络设备驱动 负责网络数据收发 网卡、WiFi

2️⃣ 按加载方式分

类型 说明
静态驱动 编译进内核(uImage/zImage)
动态驱动(模块) .ko 文件,可随时加载/卸载

动态驱动示例:

insmod hello.ko
rmmod hello

四、驱动主要做什么?

一个典型的驱动会完成以下工作:

  1. 初始化硬件

    • 使能时钟
    • 配置 GPIO / 寄存器
  2. 注册设备

    • 向内核注册字符/块/网络设备
  3. 提供操作接口

    • open / read / write / ioctl
  4. 与硬件交互

    • 读写寄存器
    • 处理中断

五、一个简单的字符设备驱动示例(概念)

static int my_open(struct inode *inode, struct file *file)
{
    return 0;
}

static ssize_t my_read(struct file *file, char __user *buf, size_t size, loff_t *off)
{
    return 0;
}

static struct file_operations fops = {
    .open = my_open,
    .read = my_read,
};

注册后,应用层就可以:

fd = open("/dev/mydev", O_RDONLY);
read(fd, buf, 10);

六、驱动和应用的区别

对比项 驱动 应用程序
运行空间 内核空间 用户空间
权限 很高 受限制
调试 困难 较容易
出错后果 系统崩溃 程序崩溃

七、学习 Linux 驱动需要掌握什么?

✅ C 语言(重点:指针、结构体)
✅ 计算机组成原理(寄存器、中断)
✅ Linux 基础(文件、模块、Shell)
✅ 内核基础(进程、内存、同步)
✅ 硬件手册(Datasheet)


八、常见误区

❌ 驱动 = 应用程序
❌ 驱动一定要写
✅ 很多驱动内核已经提供,只需配置


如果你愿意,我可以:

  • 一句话解释 Linux 驱动
  • 零写一个 LED 驱动
  • 字符设备驱动完整流程
  • 对比 Linux 驱动 vs MCU 裸机驱动

你现在是 初学者 / 嵌入式 / 内核开发 哪一类?

0