Character 子系统架构与源码总览
1. 目录定位
字符设备以字节流、命令或事件接口向用户空间暴露硬件/内核服务。drivers/char是驱动集合,不是字符设备核心本身:
fs/char_dev.c:major/minor管理、cdev和chrdev_open();include/linux/cdev.h:cdev API;drivers/base:class/device/sysfs;drivers/char/misc.c:major 10的misc复用框架;- 本目录其它文件:具体字符设备。
TTY虽然由drivers/char/Kconfigsource,但实现位于drivers/tty,应单独分析。
2. 用户态调用链
1 | open("/dev/node") |
Device node只保存dev_t和类型;真正分发由已注册cdev决定。
3. 目录主要模块
| 模块 | 对外接口 |
|---|---|
mem.c |
/dev/mem/null/zero/full/random/urandom/kmsg入口 |
random.c |
CRNG、熵池、getrandom和random fops |
misc.c |
misc minor分配和open二次分发 |
hw_random/ |
/dev/hwrng及硬件熵源 |
tpm/ |
/dev/tpmN、/dev/tpmrmN |
virtio_console.c |
hvc console、/dev/vportNpn |
ipmi/ |
BMC消息、watchdog、poweroff和用户接口 |
agp/ |
旧式AGP aperture/GART |
pcmcia/ |
PC Card字符设备 |
xillybus/ |
FPGA/host streaming device files |
| 顶层legacy | lp、ppdev、NVRAM、HPET、平台专用设备 |
4. 三种注册模式
固定Major
mem.c注册MEM_MAJOR=1,open后按minor替换fops。
Dynamic CDev
1 | alloc_chrdev_region |
适合拥有多个实例或minor的驱动。
Misc
1 | misc_register |
适合单个简单字符接口。
5. 文件操作语义
read/write:字节数据;unlocked_ioctl/compat_ioctl:结构化控制;poll:事件就绪;mmap:映射设备/页;llseek:地址或offset;fasync:SIGIO;open/release:引用、独占和资源初始化。
Driver必须明确blocking、nonblocking、short I/O和signal行为。
6. 并发
同一device可被多进程、fork后的fd、异步I/O和remove同时访问。常见保护:
- mutex:配置和串行command;
- spinlock:IRQ和短队列;
- waitqueue/completion:阻塞read;
- kref/refcount:open fd跨remove;
- RCU/SRCU:读多的全局表;
fasync/poll wait:事件通知。
7. 安全边界
字符设备常直接暴露内核或硬件能力:
/dev/mem物理内存;/dev/kmsg内核日志;- TPM密钥与PCR;
- IPMI BMC控制;
- FPGA重配置;
- mmap寄存器;
- vendor ioctl和DMA buffer。
Device node mode只是第一层;还需capability、LSM、namespace、IOMMU、参数验证和最小Kconfig。
8. RK3588重点
本树Rockchip配置显式启用:
HW_RANDOM=y;HW_RANDOM_ROCKCHIP=y;TCG_TPM=y;TCG_TIS_I2C_INFINEON=y。
RK3588 DTS启用rockchip,trngv1节点,因此Rockchip TRNG是本目录最明确的平台专用路径。TPM Core虽启用,但是否有物理TPM仍取决于板级I2C节点;SoC DTS本身不等于存在TPM。
正在加载留言…