Kernel Module
用户态和内核态通信
file_operations
可以为Kernel Module实现file_operations
,让设备可以作为文件被用户空间使用。
file_operations 通常可以实现以下接口:
read
/write
ioctl
如果有特殊操作,可以通过IOCTL完成mmap
:将内核内存(如设备寄存器、DMA 缓冲区)映射到用户空间,直接访问。典型场景:高性能数据传输(如摄像头帧缓冲)、硬件寄存器操作。
Netlink
基于套接字(socket)的内核-用户空间双向通信机制,支持异步事件通知。内核可主动推送消息(如热插拔事件)。
其他
- debugfs
- shared memory
- eBPF
- io_uring
方法 | 适用场景 | 性能 | 复杂度 | 安全性 |
---|---|---|---|---|
ioctl | 驱动自定义控制命令 | 中 | 中 | 中(需自定义) |
procfs/sysfs | 配置和状态查询 | 低 | 低 | 高(文件权限) |
netlink | 内核主动通知或网络配置 | 高 | 高 | 中(需协议设计) |
mmap | 高频大数据量(如 DMA) | 极高(零拷贝) | 高 | 中(需同步) |
eBPF | 网络过滤、性能分析 | 极高 | 极高 | 高(沙盒) |
io_uring | 异步高性能 I/O | 极高 | 极高 | 中 |
实际开发中,常组合多种方法(如 mmap
+ ioctl
)兼顾功能与性能。
内核态和设备通信
MMIO是一种让CPU通过内存访问指令来访问设备寄存器的技术。
需要先放数据放到内存中,然后发命令给设备,设备再dma读走,如果让cpu一点一点发数据给设备就效率太低了