Linux内核驱动--设备驱动

一、驱动概念

设备驱动(Device Driver) 是连接硬件与操作系统内核的桥梁。它使得上层应用程序能够通过统一的接口访问底层硬件资源,而无需关心具体的硬件细节。Linux 内核将设备抽象为三大类:字符设备、块设备 和 网络设备,每种类型对应不同的数据访问模式和驱动模型。

二、驱动分类

类型 访问方式 典型设备 缓冲机制 主要系统调用
字符设备 字节流(顺序/随机) 串口、键盘、LED、ADC 无(或简单缓冲) open, read, write, ioctl
块设备 固定大小块(通常512B/4KB) 硬盘、SD卡、eMMC 有(内核页缓存) open, read, write, fsync
网络设备 数据包(报文) 以太网卡、Wi-Fi 模块 有(sk_buff 缓冲区) socket, send, recv(非文件操作)

三、Linux 字符设备驱动架构图

四、字符设备驱动的核心组件

1. struct file_operations ------ 驱动的"接口表"

这是字符设备驱动的灵魂,定义了用户空间调用系统调用时内核应执行的函数。
cs 复制代码
static struct file_operations demo_fops = {
    .owner = THIS_MODULE,
    .open = demo_open,
    .release = demo_release,
    .read = demo_read,
    .write = demo_write,
};
  • open():设备打开时调用(如 fd = open("/dev/demo", O_RDWR))
  • release():close(fd) 时调用,释放资源
  • read() / write():核心数据传输函数

2. 设备号(Device Number)

每个字符设备由 主设备号(Major) + 次设备号(Minor) 唯一标识。
  • 主设备号:标识设备类型(如 4 表示 TTY)
  • 次设备号:区分同一类型的不同实例(如 ttyS0、ttyS1)
cs 复制代码
// 静态指定
int major = register_chrdev(200, "mydev", &demo_fops);
3. cdev 结构体 ------ 内核中的字符设备对象

现代 Linux 使用 cdev 结构管理字符设备:

cs 复制代码
struct cdev my_cdev;

// 初始化并绑定 fops
cdev_init(&my_cdev, &demo_fops);
my_cdev.owner = THIS_MODULE;

// 添加到内核
cdev_add(&my_cdev, dev, 1);  // dev 是 alloc_chrdev_region 返回的 dev_t

五、高效开发利器:ctags 源码导航

在开发字符设备驱动时,经常需要查阅内核源码中的函数定义、结构体成员和宏展开。ctags 是一个强大的代码索引工具,可让你在 Vim、Emacs 或 VS Code 中快速跳转到符号定义。

1. 安装 ctags

cs 复制代码
# Ubuntu/Debian
sudo apt install exuberant-ctags

# CentOS/RHEL
sudo yum install ctags

2. 在内核源码目录生成 tags 文件

cs 复制代码
ctags -R

3. 在编辑器中使用 ctags

  • 将光标放在函数名上(如 cdev_add)
  • 按 Ctrl + ] → 跳转到定义
  • 按 Ctrl + t → 返回上一位置
  • :ts → 显示所有匹配项(适用于重载)

六、总结

  • 字符设备驱动是 Linux 最基础的驱动类型,用于以字节流方式访问硬件(如 LED、串口、传感器等)。
  • 通过 file_operations 结构体将用户系统调用(open/read/write/ioctl)映射到内核函数。
  • 通过 cdev_add() 注册设备。
  • 开发过程中配合 ctags 工具(ctags -R)可快速跳转内核源码,高效查阅 API 实现与定义。
相关推荐
安科瑞小许11 小时前
零碳园区的电力保障——变电站综合自动化系统
运维·自动化·零碳园区
袁小皮皮不皮12 小时前
【HCIA】第二章 ipv4协议以及子网划分与集合
linux·运维·服务器·网络·网络协议·tcp/ip·信息与通信
FriendshipT12 小时前
Ubuntu 20.04 LTS 安装 Docker 指南
linux·ubuntu·docker
科技前瞻观察12 小时前
赋能智算升级|基于极海G32R501实时控制DSP MCU的AI服务器电源应用方案
服务器·人工智能·单片机
暴力求解12 小时前
Linux---ELF动态库加载
linux·运维·服务器
技术宅星云12 小时前
【极客的Ubuntu 操作系统维护手册】
linux·运维·ubuntu
Ken_111512 小时前
Linux放开端口
linux·服务器·网络
艾莉丝努力练剑12 小时前
System V IPC内核实现精析
linux·运维·服务器·网络·c++·人工智能·学习
海盗猫鸥12 小时前
「Linux工具」yum和vim
linux·编辑器·vim
缘友一世12 小时前
ubuntu24.04最新内核6.17.0.19卸载折腾记
linux·kernel