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 实现与定义。
相关推荐
hz5678929 分钟前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC34 分钟前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
优橙教育39 分钟前
零基础学AI应用开发要多久?3个月能到什么水平
服务器·开发语言·网络·php
IT研究所1 小时前
AI-ITR平台如何减少客户问题反复升级?
大数据·运维·人工智能·低代码·自然语言处理·安全架构·企微
BLUcoding1 小时前
接口服务公网超时排查记录:SecureRandom 阻塞问题分析与解决
java·linux·springboot·aes·securerandom
AIgorithmGEEK1 小时前
[Linux]从手写报头到内核套路:序列化、反序列化与自定义协议全链路
linux·运维·服务器·网络·序列化·反序列化
Nil2081 小时前
leetcode 139单词拆分
linux·运维·服务器
Starry-sky(jing)1 小时前
BUG: unable to handle kernel paging request 完整排查:dmesg 四要素与三路定罪
linux·运维·服务器·内核·排障
mounter6251 小时前
从硬件互连到操作系统变革:CXL 技术演进与 Linux 内核工程挑战
linux·运维·服务器
zhengqweasd1 小时前
机房托管服务器怎么选硬盘,机械盘和 SSD 托管场景差异
运维·服务器·github