1. 驱动接口设计背后的哲学思考
第一次给DHT11温湿度传感器写Linux驱动时,我也曾困惑:为什么内核里既有sysfs又有字符设备?把数据直接扔到/dev下不就行了吗?直到踩过几个坑才明白,这两种接口代表着完全不同的设计哲学。
在嵌入式开发中,像DHT11这样的低速传感器通常需要两种访问方式:一种是用户态程序主动查询(比如每分钟读取一次数据),另一种是系统管理员需要实时查看设备状态。前者适合用字符设备实现,后者则是sysfs的专长。举个例子,当我们用cat /sys/class/dht11/values查看实时数据时,背后其实是内核在帮我们处理并发访问和缓冲区管理。
2. sysfs与字符设备的本质区别
2.1 访问模式对比
| 特性 | sysfs | 字符设备 |
|---|---|---|
| 数据流向 | 内核→用户空间 | 双向通信 |
| 访问频率 | 低频诊断 | 高频数据采集 |
| 典型操作 | cat/echo | read/write/ioctl |
| 并发控制 | 内核自动处理 | 需驱动自己实现 |
2.2 内核实现差异
在DHT11驱动中,sysfs接口通过show/store方法实现:
c复制static ssize_t dht11_value_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
return sprintf(buf, "%d %d\n", humidity, temperature);
}
而字符设备需要实现完整的file_operations结构体:
c复制static const struct file_operations dht11_fops = {
.owner = THIS_MODULE,
.read = dht11_r
