Character 子系统架构与源码总览

Character 子系统架构与源码总览

1. 目录定位

字符设备以字节流、命令或事件接口向用户空间暴露硬件/内核服务。drivers/char是驱动集合,不是字符设备核心本身:

  • fs/char_dev.c:major/minor管理、cdevchrdev_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
2
3
4
5
6
7
8
9
10
open("/dev/node")
-> VFS inode
-> chrdev_open
-> kobj_lookup(dev_t)
-> cdev/file_operations
-> driver .open

read/write/ioctl/mmap/poll
-> driver file_operations
-> hardware/core service

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
2
3
alloc_chrdev_region
-> cdev_init/cdev_add
-> class_create/device_create

适合拥有多个实例或minor的驱动。

Misc

1
2
3
4
misc_register
-> dynamic/fixed minor under major 10
-> /dev/<name>
-> misc_open switches to device fops

适合单个简单字符接口。

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。

文章互动

阅读 --

留言

0 条留言

正在加载留言…