Linux 驱动是指运行在 Linux 内核中的程序,用来让操作系统能够识别、控制和使用硬件设备。它是硬件与 Linux 内核之间的桥梁。
你可以把 Linux 驱动理解为:
“硬件的翻译官”
例如:
/dev/sdb应用程序
↓
系统调用
↓
Linux 内核
↓
设备驱动
↓
硬件(CPU / 内存 / 寄存器)
驱动运行在内核空间,拥有很高的权限。
| 类型 | 说明 | 例子 |
|---|---|---|
| 字符设备驱动 | 按字节流访问 | 键盘、串口、LED、传感器 |
| 块设备驱动 | 按数据块访问 | 硬盘、U 盘、SSD |
| 网络设备驱动 | 负责网络数据收发 | 网卡、WiFi |
| 类型 | 说明 |
|---|---|
| 静态驱动 | 编译进内核(uImage/zImage) |
| 动态驱动(模块) | .ko 文件,可随时加载/卸载 |
动态驱动示例:
insmod hello.ko
rmmod hello
一个典型的驱动会完成以下工作:
初始化硬件
注册设备
提供操作接口
open / read / write / ioctl与硬件交互
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);
| 对比项 | 驱动 | 应用程序 |
|---|---|---|
| 运行空间 | 内核空间 | 用户空间 |
| 权限 | 很高 | 受限制 |
| 调试 | 困难 | 较容易 |
| 出错后果 | 系统崩溃 | 程序崩溃 |
✅ C 语言(重点:指针、结构体)
✅ 计算机组成原理(寄存器、中断)
✅ Linux 基础(文件、模块、Shell)
✅ 内核基础(进程、内存、同步)
✅ 硬件手册(Datasheet)
❌ 驱动 = 应用程序
❌ 驱动一定要写
✅ 很多驱动内核已经提供,只需配置
如果你愿意,我可以:
你现在是 初学者 / 嵌入式 / 内核开发 哪一类?