首页/目录/全部文章

全部文章

八个专题的源码、算法与协议笔记都在这里。

笔记列表

Virtio Console、HVC 与多端口

Virtio Console、HVC 与多端口

1. 两种功能

virtio_console.c同时提供:

  1. early/primary console,通过HVC接入内核console和TTY;
  2. generic multiport字符通道,创建/dev/vportNpn
1
2
3
4
guest userspace/TTY
-> virtio_console
-> input/output/control virtqueues
-> hypervisor host backend

2. 对象

  • ports_device:一个virtio device;
  • port:一个console或generic port;
  • port_buffer:入站virtqueue buffer;
  • 全局pdrvdata:class、major/minor和device list。

每个port有input/output virtqueue、waitqueue、spinlock、mutex、open状态和host connection状态。

3. Probe

1
2
3
4
5
6
7
8
9
virtio probe
-> negotiate features
-> allocate ports_device
-> find/create control queues
-> register dynamic char major
-> init config work
-> host sends PORT_ADD
-> add_port
-> cdev/device_create

Multiport依赖control virtqueues;单console可使用固定data queues。

4. Host控制消息

控制事件包括:

  • DEVICE_READY;
  • PORT_ADD/REMOVE;
  • PORT_READY;
  • CONSOLE_PORT;
  • PORT_OPEN;
  • PORT_NAME;
  • RESIZE。

Control work解析host消息并创建/删除port。所有ID、size和状态都来自host,应验证范围和当前生命周期。

5. Read

1
2
3
4
5
read /dev/vport
-> wait for inbuf
-> copy available bytes
-> recycle buffer to input vq
-> kick host

Nonblocking无数据返回-EAGAIN;host remove或disconnect返回EOF/error并唤醒waiters。

6. Write

Write把用户buffer放入output virtqueue并等待used completion或可用descriptor。Large write可能分段;blocking状态受host消费速度影响。

不能在持port state spinlock时copy_from_user或等待virtqueue。

7. Open/Close

Generic port通常限制单open语义。Open向host发送PORT_OPEN,close通知关闭并清理fasync/wait。

Host也可改变连接状态。Local open与host open是两层状态。

8. HVC

Console port注册hvc console/tty ops,用于:

  • kernel boot log;
  • guest login console;
  • emergency output。

Console写不能依赖普通用户进程上下文,应避免不可控长阻塞。

9. Hot Unplug

Port remove:

1
2
3
4
5
6
7
mark removed
-> remove from list
-> device_destroy/cdev_del
-> wake readers/writers
-> flush work
-> wait/open reference cleanup
-> free buffers

Virtio device remove还需reset device、del vqs并注销major。

10. 安全

Host/hypervisor能:

  • 注入console输入;
    -读取guest输出;
  • 创建命名port;
  • 触发hotplug;
    -控制backpressure。

机密数据不应无加密地经vport发送给不可信host。Udev按host提供name创建symlink时需防名称策略混淆。

11. RK3588

Rockchip主要defconfig未显式启用VIRTIO_CONSOLE。裸机RK3588通常使用UART console;只有作为虚拟机guest或特殊virtio transport环境才使用本驱动。

Host侧virtio backend也不在此文件中。

IPMI 字符接口与消息通路

IPMI 字符接口与消息通路

1. 分层

1
2
3
4
5
userspace /dev/ipmiN
-> IPMI device interface
-> message handler
-> SI(KCS/SMIC/BT) / SSIF / other transport
-> BMC

Message handler负责user、sequence、request/response匹配、event和watchdog/poweroff client协调。

2. 核心对象

  • IPMI SMI实例;
  • ipmi_user
  • receive message;
  • sequence table;
  • SMI handler callbacks;
  • maintenance mode和watcher。

Transport注册到message handler后,device interface创建字符node。

3. 用户接口

/dev/ipmiN主要通过ioctl:

  • 设置/获取本地地址;
  • send command;
  • receive message/event;
  • register command;
  • 设置event接收;
  • timing/retry参数。

Read/write并非普通字节流协议,应用应使用OpenIPMI或规范结构。

4. 消息路径

1
2
3
4
5
6
7
8
9
ioctl SEND_COMMAND
-> allocate request/sequence
-> format netfn/cmd/address
-> lower-layer sender
-> KCS/SMIC/BT/SSIF transaction
-> response callback
-> match sequence
-> enqueue user receive queue
-> poll/read ioctl wakeup

Timeout可能触发retry;late response必须避免匹配到已复用sequence。

5. SI

System Interface支持KCS、SMIC、BT等BMC寄存器协议。状态机可能在IRQ、timer或polling中推进,单次寄存器操作不能阻塞完整命令周期。

6. SSIF

SSIF通过SMBus/I2C发送IPMI message,受adapter传输长度、multipart消息、clock stretching和BMC busy影响。

它与TPM I2C是不同协议和设备。

7. Watchdog边界

IPMI watchdog在本目录实现,但向Linux watchdog语义提供BMC watchdog。它与drivers/watchdog中的SoC watchdog不同:

  • BMC可能独立于SoC;
  • timeout/action由IPMI命令配置;
    -主机总线故障可能导致无法ping;
  • reboot/power cycle语义不同。

RK3588本地DW watchdog不走IPMI。

8. Poweroff

IPMI poweroff可向BMC发送chassis control。在无BMC或BMC不响应时不能作为唯一可靠关机路径。

9. 并发

  • message handler锁保护interface/user/sequence;
  • per-user queue配waitqueue;
  • transport状态机有自身spinlock/timer;
  • unregister需完成pending messages为error;
  • callback不能使用已释放user。

10. 安全

IPMI通常拥有高权限:

  • reset/power;
    -传感器和FRU;
  • BMC网络配置;
  • raw OEM命令;
  • firmware更新。

/dev/ipmiN应只给受信管理服务,容器默认不可见。BMC协议和固件也属于独立攻击面。

11. RK3588

Rockchip主要defconfig未显式启用IPMI,常见RK3588板也没有BMC KCS/SSIF节点。服务器化定制板若增加BMC,需按实际transport、DTS/ACPI和最终.config判断。

12. 调试

1
2
3
4
ls -l /dev/ipmi*
dmesg | grep -i ipmi
ipmitool mc info
ipmitool sensor

传输timeout时区分BMC无响应、I2C/KCS硬件问题、sequence耗尽和权限错误。

并口、Legacy 与专用字符驱动

并口、Legacy 与专用字符驱动

1. 并口打印

lp.c在parport Core之上创建/dev/lpN

  • claim/release port;
  • 分块write;
  • 检查busy/paper/error/select;
  • wait或轮询;
  • ioctl获取状态/超时。

打印机离线可让blocking write长时间等待。

2. PPDEV

ppdev.c创建/dev/parportN,让用户态执行并口协议:

  • claim/release;
  • data/control/status;
  • direction;
  • negotiate mode;
  • IRQ等待;
  • timeout。

它比直接I/O port安全一些,但仍允许控制物理引脚,应限制权限。

RK3588一般没有PC parport controller。

3. NVRAM

nvram.c暴露架构NVRAM操作。空间可能包含firmware/BIOS关键配置,写错会破坏启动。

RK3588通常使用EEPROM、OTP、RPMB或nvmem framework,不使用PC /dev/nvram

4. HPET与MMTimer

  • hpet.c:HPET timer miscdevice和可选mmap;
  • uv_mmtimer.c:SGI UV memory-mapped RTC。

Mmap硬件timer寄存器会扩大侧信道和MMIO风险,配置明确警告page可能包含其它寄存器。

RK3588使用ARM arch timer,不使用HPET。

5. Hangcheck

hangcheck-timer.c比较monotonic时间与预期timer间隔,判断系统是否长时间未调度,并可reboot。

它不是硬件watchdog:若CPU完全锁死到timer无法执行,可能无法采取动作。RK3588产品应使用硬件watchdog。

6. TTY Printk

ttyprintk.c提供/dev/ttyprintk,把用户写入转为printk。适合把早期/容器console消息并入kernel log。

不可信用户可制造日志洪泛和伪造内核风格消息,默认关闭合理。

7. APM Emulation

apm-emulation.c为ARM用户态提供旧APM接口兼容。现代系统使用sysfs、电源管理daemon和reboot/suspend syscall。

8. 平台历史驱动

顶层还包括:

  • NetWinder温度、button和flash;
  • Sony VAIO PI;
  • Toshiba SMM;
  • IBM Mwave modem;
  • NatSemi GPIO;
  • Applicom fieldbus;
  • PS3 flash;
  • POWER operator panel;
  • SPARC ADI;
  • telecom clock。

这些受严格architecture Kconfig限制。

9. Legacy Ioctl风险

老驱动常包含:

  • 固定major/minor;
  • packed user struct;
  • raw I/O port;
  • 大量自定义ioctl;
  • 不完整compat ioctl;
  • 缺少现代device-managed生命周期。

移植到64位ARM不能只解除Kconfig依赖,必须审计pointer size、endianness、alignment、DMA和并发。

10. 配置原则

RK3588量产内核应关闭无硬件对应的:

  • PRINTER/PPDEV;
  • HPET;
  • NVRAM;
  • PCMCIA legacy;
  • x86 GPIO/PI;
  • NetWinder/PS3/POWER/SPARC模块。

减少攻击面和镜像体积比保留“可能有用”更可靠。

AGP、PCMCIA、Xillybus 与 FPGA 接口

AGP、PCMCIA、Xillybus 与 FPGA 接口

1. AGP

agp/实现旧式Accelerated Graphics Port/GART:

  • aperture分配;
  • GATT;
  • bridge probe;
  • bind/unbind pages;
  • Intel/AMD/VIA/NVIDIA等chipset。

它不是现代DRM GEM/TTM或IOMMU通用接口。RK3588 Mali GPU不使用AGP。

2. PCMCIA

pcmcia/包含PC Card function driver,例如:

  • synchronous serial;
  • smart card;
    -其它legacy通信卡。

它依赖PCMCIA socket/Core和card services。RK3588常见板没有PCMCIA。

3. Xillybus架构

Xillybus把FPGA endpoint中的逻辑stream映射为字符设备:

1
2
3
4
5
userspace read/write
-> xillybus channel
-> DMA/buffer descriptors
-> PCIe/OF/USB transport
-> FPGA logic

Core和transport分离:

  • class:minor和device node;
  • core:channel、buffer、read/write/poll;
  • PCIe/OF/USB:底层I/O和IRQ。

4. Xillybus Open

Channel可配置:

  • host-to-FPGA或FPGA-to-host;
  • seekable/nonseekable;
  • synchronous/asynchronous;
  • buffer size/count;
  • exclusive open。

Endpoint提供的channel metadata控制device创建,必须验证数量、name和buffer参数。

5. 数据路径

Write:

1
2
3
4
5
wait free buffer
-> copy user data
-> mark ready
-> notify FPGA
-> completion/IRQ frees buffer

Read:

1
2
3
4
wait FPGA-filled buffer
-> copy to user
-> recycle
-> notify endpoint

Poll和fasync按buffer状态通知。

6. Remove

PCIe/USB/OF transport remove时要:

  • 停止IRQ/DMA;
  • 标记channels offline;
  • 唤醒所有read/write;
  • 删除device nodes;
  • 等open引用;
  • 释放buffers。

FPGA重配置也可能让endpoint逻辑消失,应按hot remove处理。

7. Xilinx HWICAP

xilinx_hwicap/通过ICAP让MicroBlaze系统重配置FPGA。它可写bitstream/configuration frame,权限错误可能使系统立即失效。

这不是RK3588外接FPGA的标准加载路径;现代系统优先使用FPGA manager framework。

8. 安全

FPGA字符通道可能直接连DMA或控制逻辑:

  • 验证endpoint描述;
  • 限制node权限;
  • IOMMU隔离PCIe DMA;
  • bitstream签名;
  • reset/reconfigure期间阻止I/O;
  • 不信任FPGA返回长度;
  • 防止channel name注入udev路径。

9. RK3588可能性

RK3588若PCIe/USB连接Xillybus兼容FPGA,理论上可使用对应transport,但主要defconfig未显式启用Xillybus。必须确认:

  • endpoint固件;
  • Kconfig;
  • PCI ID/DT compatible;
  • DMA mask和IOMMU;
  • PCIe link;
  • device node策略。

源码存在不代表板载FPGA自动适用。

并发、缓冲、阻塞、轮询与生命周期

并发、缓冲、阻塞、轮询与生命周期

1. 执行上下文

字符驱动同时面对:

  • process context的open/read/write/ioctl/mmap;
  • IRQ/threaded IRQ;
  • workqueue/timer;
  • PM callback;
  • device remove;
  • async notification;
  • fork/dup后的共享file。

User copy可fault和睡眠,不能在spinlock/hardirq执行。

2. Per-device与Per-file

Per-device:

  • MMIO/IRQ;
  • hardware queue;
  • global configuration;
  • remove状态;
  • class/cdev。

Per-file:

  • read offset;
  • pending response;
  • mode/filter;
  • event cursor;
  • ownership;
  • references。

把per-file command response放全局buffer会导致用户间串线。

3. 阻塞Read

标准循环:

1
2
3
4
5
6
7
8
9
10
lock
while no data and device alive:
unlock
if O_NONBLOCK return -EAGAIN
wait_event_interruptible(condition)
if signal return -ERESTARTSYS
lock
if removed return EOF/-ENODEV
copy data
unlock

条件必须在锁下重查,waitqueue只负责通知,不保存事件。

4. Write Backpressure

Buffer满时:

  • nonblock返回-EAGAIN
  • blocking等待space;
  • device remove返回-ENODEV/EPIPE
  • signal可能返回short write。

Driver不能无限分配内存吸收用户数据。

5. Poll

poll_wait()注册waitqueue,再读取当前状态。常见返回:

  • EPOLLIN|EPOLLRDNORM:有数据;
  • EPOLLOUT|EPOLLWRNORM:有空间;
  • EPOLLERR:硬件/协议错误;
  • EPOLLHUP:对端或设备消失。

Wake时可带poll mask减少无效唤醒。

6. Ring Buffer

IRQ producer与process consumer:

  • spinlock保护head/tail;
  • release/acquire或barrier保证payload先于index可见;
  • 长copy可在锁外进行但要固定buffer ownership;
  • wrap和size必须防溢出;
  • overflow策略要明确drop/newest/oldest/error。

7. Ioctl

Ioctl配置常与read/write并发。需要:

  • mutex串行硬件模式;
  • 防止模式切换使pending buffer解释失效;
  • copy_from_user前检查size;
  • reserved清零;
  • compat转换;
  • command超时;
  • remove状态检查。

8. Mmap

Mmap建立后close不会自动撤销VMA。Driver要用VMA open/close引用对象,并在remove时:

  • 禁止新mmap;
  • 停止DMA;
  • 必要时zap mapping;
  • 等VMA引用;
  • 再释放pages/MMIO。

不要把包含其它寄存器的整页映射给用户。

9. Remove

安全状态机:

1
2
3
4
5
6
7
8
LIVE
-> DYING
-> unregister node/cdev
-> stop IRQ/DMA/work
-> wake all waiters
-> complete pending I/O
-> wait open/VMA refs
-> DEAD/free

只调用device_destroy()不会让已有fd失效。

10. Module引用

fops.owner=THIS_MODULE阻止open期间卸载模块代码,但不能解决:

  • platform remove释放private data;
  • USB/PCI热拔;
  • device-managed MMIO失效;
  • VMA长于fd;
    -异步callback。

需要kref、get_device()或明确disconnect对象。

11. PM

Open/read前runtime get,完成后autosuspend。阻塞read不能永久持电源引用,除非硬件必须持续监听。

Suspend应唤醒或冻结等待者,并保存能够恢复的状态。Resume后硬件queue可能丢失,需向用户报告。

12. 故障注入

测试:

  • 多进程并发;
  • nonblock/poll;
  • signal;
  • short user buffer;
  • device unplug;
  • suspend中I/O;
  • mmap后remove;
  • command timeout;
  • buffer overflow;
  • 32位compat应用。

字符设备安全、权限与故障排查

字符设备安全、权限与故障排查

1. 攻击面

字符设备可直接承载:

  • ioctl命令解析;
  • user pointer;
  • 任意长度buffer;
  • MMIO/mmap;
  • DMA;
    -固件命令;
  • 密钥和随机数;
  • power/reset;
  • host/hypervisor输入。

Device node是内核攻击面的入口,不是普通文件。

2. 权限

组合使用:

  • devtmpfs/udev mode和group;
  • capability;
  • SELinux/AppArmor;
  • cgroup device policy;
  • namespace设备映射;
  • seccomp限制ioctl;
  • module/Kconfig最小化。

不要依赖应用“不会调用危险ioctl”。

3. User Copy

原则:

  • 先复制固定header;
  • 验证version、size、count;
  • 检查乘加溢出;
  • 设全局上限;
  • 再分配;
  • 再复制payload;
  • 输出结构先清零,防内核padding泄露。

TOCTOU敏感结构应一次复制到内核buffer,不反复读取user memory。

4. Ioctl ABI

稳定ABI应:

  • 使用__u32/__u64
  • 避免裸pointer和long
  • 保留reserved字段;
  • 明确endianness;
  • 支持版本/size扩展;
  • 实现compat;
  • 未知flags返回错误。

5. Mmap

验证:

  • offset/length;
  • page alignment;
  • overflow;
  • resource范围;
  • cache attributes;
  • writable权限;
  • VMA生命周期。

映射物理MMIO应要求明确capability,且不能越过设备resource。

6. DMA

用户提供长度、offset和descriptor时:

  • pin/map页数上限;
  • IOMMU;
  • DMA direction;
  • 同步;
  • completion后才unmap;
  • remove/reset取消DMA;
  • 防止设备访问已释放user page。

7. Random和TPM

  • 应用使用getrandom()而非直接信任/dev/hwrng
  • HWRNG quality需硬件依据;
  • TPM node权限不能替代TPM policy;
  • event log和PCR需联合验证;
  • 不在日志中输出随机seed、密钥或TPM auth。

8. /dev/memkmsg

量产建议:

  • STRICT_DEVMEM
  • 限制/关闭DEVMEM
  • dmesg_restrict=1
  • 控制/dev/kmsg写;
  • 容器不映射;
  • 禁止/dev/mem作为正式驱动替代。

9. 基础排障

1
2
3
4
5
6
cat /proc/devices
ls -l /dev
udevadm info /dev/<node>
readlink /sys/dev/char/<major>:<minor>/device
cat /sys/dev/char/<major>:<minor>/uevent
dmesg -w

确认:

  1. Kconfig;
  2. driver已注册;
  3. device probe成功;
  4. cdev/misc注册成功;
  5. devtmpfs/udev创建node;
  6. major/minor匹配;
  7. LSM/权限;
  8. open后的硬件状态。

10. Strace

1
strace -yy -e openat,read,write,ioctl,mmap,poll ./app

区分:

  • ENOENT:node不存在;
  • ENODEV/ENXIO:driver/实例无效;
  • EACCES/EPERM:权限;
  • EAGAIN:nonblock无数据;
  • ERESTARTSYS/EINTR:signal;
  • ETIMEDOUT:硬件/协议;
  • EFAULT:user pointer。

11. Dynamic Debug

1
2
3
echo 'file drivers/char/* +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file drivers/char/hw_random/* +p' > /sys/kernel/debug/dynamic_debug/control
echo 'file drivers/char/tpm/* +p' > /sys/kernel/debug/dynamic_debug/control

随机数、TPM和管理消息日志可能敏感,调试后关闭。

12. 产品裁剪

保留实际使用的mem/random/misc、Rockchip HWRNG和必要TPM transport;关闭AGP、PCMCIA、并口、IPMI、Xillybus和legacy平台驱动,除非硬件明确需要。

RK3588 配置、DTS 与实际启用矩阵

RK3588 配置、DTS 与实际启用矩阵

1. Defconfig明确项

三份主要Rockchip defconfig均包含:

1
2
3
4
CONFIG_HW_RANDOM=y
CONFIG_HW_RANDOM_ROCKCHIP=y
CONFIG_TCG_TPM=y
CONFIG_TCG_TIS_I2C_INFINEON=y

这说明HWRNG Core、Rockchip RNG和TPM Core/Infineon transport被编入,但设备是否出现仍取决于DTS与硬件。

2. 固定构建

无论上述选项,drivers/char/Makefile固定构建:

  • mem.o
  • random.o
  • misc.o

实际node还受:

  • CONFIG_DEVMEM
  • CONFIG_DEVPORT
  • CONFIG_PRINTK
  • devtmpfs/udev;
  • security policy。

3. Rockchip TRNG

rk3588s.dtsi定义rng@fe378000

  • rockchip,trngv1
  • secure SCMI clock/reset;
  • 默认disabled。

rk3588-linux.dtsirk3588-android.dtsi&rng设为okay。使用这些include的板型通常会probe rockchip-rng

4. TRNG运行链

1
2
3
4
5
6
7
8
DT rng node
-> rockchip-rng platform probe
-> devm_hwrng_register("rockchip")
-> HWRNG Core选择current RNG
-> /dev/hwrng
-> hwrng fill thread
-> add_hwgenerator_randomness
-> kernel CRNG

/dev/random不是直接映射TRNG寄存器。

5. TPM

Defconfig启用TPM不代表RK3588 SoC内建离散TPM。SoC DTS未提供TPM设备;具体板必须有:

  • I2C TPM节点;
  • 实际Infineon芯片;
  • 电源/reset/IRQ;
  • 正确compatible和address。

无节点时TPM Core存在但无/dev/tpm0

6. 未显式启用

Rockchip主要defconfig未显式包含:

  • VIRTIO_CONSOLE
  • TTY_PRINTK
  • PRINTER/PPDEV
  • IPMI;
  • Xillybus;
  • TPM SPI/generic I2C/fTPM;
  • OP-TEE RNG;
  • SMCCC TRNG。

最终配置可能由fragment/select改变,应以构建后的.config为准。

7. 与其它子系统边界

目标 实际目录
UART/console drivers/tty/serial
RK watchdog drivers/watchdog
OP-TEE drivers/tee
Crypto accelerator drivers/crypto/rockchip
OTP/eFuse nvmem driver
GPIO drivers/gpio
DRM/GPU drivers/gpu

不要因为这些设备提供字符node就认为实现位于drivers/char

8. 运行时核对

1
2
3
4
5
6
zcat /proc/config.gz | grep -E 'HW_RANDOM|TCG_TPM|DEVMEM|VIRTIO_CONSOLE|IPMI'
cat /proc/devices
ls -l /dev/{random,urandom,hwrng,tpm0,tpmrm0,mem,kmsg} 2>/dev/null
cat /sys/class/misc/hw_random/rng_available
cat /sys/class/misc/hw_random/rng_current
dmesg | grep -Ei 'rockchip.*rng|hwrng|tpm'

9. DTB核对

1
2
dtc -I fs -O dts /sys/firmware/devicetree/base | \
grep -A12 -B2 'rng@fe378000'

检查status和clock/reset phandle是否指向运行固件支持的SCMI provider。

TPM应在最终DTB中搜索tpm@及实际compatible。

10. 随机数启动验证

1
2
3
cat /proc/sys/kernel/random/entropy_avail
cat /proc/sys/kernel/random/boot_id
dmesg | grep -i 'crng init'

量产测试应覆盖cold boot、无网络、无存储seed、低温和重复重启,确认CRNG能及时初始化且输出不重复。

11. 安全建议

  • 保留Rockchip TRNG但验证quality与健康状态;
  • 可信bootloader注入唯一seed;
  • 应用使用getrandom;
    -限制/dev/hwrng普通用户访问;
  • 开启STRICT_DEVMEM或关闭DEVMEM;
  • TPM只启用实际transport;
  • 未使用的legacy字符驱动关闭。

12. 结论

RK3588在本目录的主路径是“内核CRNG + Rockchip TRNG + 可选板载TPM”。其它大量驱动主要用于跨平台源码共享,不能由文件存在推断为RK3588功能。

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。

Linux 6.1 Character 驱动文档索引

Linux 6.1 Character 驱动文档索引

源码:rk3588/kernel-6.1/drivers/char/

文档 内容
Char子系统架构与源码总览.md 字符设备模型、目录分层和RK3588重点
源码目录与模块索引.md 228个文件、Kconfig、Makefile和子目录
01-字符设备注册CDev与Misc框架.md major/minor、cdev、misc和open分发
02-Mem-Null-Zero-Full与Kmsg设备.md major 1设备及/dev/mem安全
03-内核Random-CRNG与用户接口.md /dev/random、urandom、getrandom和熵池
04-HWRNG-Core注册选择与熵注入.md /dev/hwrng、quality和后台填充
05-RK3588-Rockchip-TRNG驱动.md trngv1、时钟、PM和随机数读取
06-TPM-Core命令设备与Resource-Manager.md TPM chip、/dev/tpm、tpmrm和PCR
07-TPM传输驱动与RK3588配置.md TIS、SPI/I2C、fTPM和板级状态
08-Virtio-Console-HVC与多端口.md virtqueue、console和vport字符设备
09-IPMI字符接口与消息通路.md SI/SSIF/BT、用户接口和watchdog边界
10-并口Legacy与专用字符驱动.md lp、ppdev、NVRAM、HPET及历史平台
11-AGP-PCMCIA-Xillybus与FPGA接口.md 大型子目录及非RK3588模块
12-并发缓冲阻塞轮询与生命周期.md waitqueue、mutex、refcount和remove
13-字符设备安全权限与故障排查.md device node权限、ioctl、mmap和调试
14-RK3588配置DTS与实际启用矩阵.md defconfig、TRNG、TPM及运行时核对
ipmi/README.md IPMI Core、SI/SSIF/IPMB、BMC侧、watchdog和RK3588适用性详解
agp/README.md AGP/GART Core、芯片组、legacy frontend及RK3588不适用性详解
tpm/README.md TPM Core、TPMRM、TIS/CRB/I2C/SPI、vTPM/fTPM及RK3588部署详解

RK3588默认直接相关的重点是内建mem.orandom.omisc.o,以及启用的HWRNG Core、Rockchip TRNG和TPM Core。目录中大量x86、PowerPC、MIPS、旧式PC并口/PCMCIA驱动不会在RK3588运行。

源码目录与模块索引

源码目录与模块索引

1. 规模

drivers/char共约228个文件。顶层Makefile无统一char-core.o,而是固定对象、条件模块和子目录集合。

固定构建:

1
2
3
4
mem.o
random.o
misc.o
agp/ # 进入子目录,具体对象仍受Kconfig控制

2. 顶层核心文件

文件 职责
mem.c major 1设备统一open分发
random.c CRNG、熵源、random/urandom接口
misc.c major 10 misc registry
virtio_console.c virtio console和multiport
ttyprintk.c 将TTY写入转成printk
lp.cppdev.c 并口打印和用户态parport
nvram.c legacy NVRAM
hpet.cuv_mmtimer.c timer字符接口
hangcheck-timer.c 系统卡死检测
apm-emulation.c ARM APM兼容
powernv-op-panel.c POWER operator panel
adi.c SPARC ADI版本访问

其它顶层文件多为x86、MIPS、PowerPC、NetWinder或旧式专用卡。

3. hw_random/

包含HWRNG Core和大量厂商driver:

  • core.c:registry、/dev/hwrng、选择和熵注入;
  • rockchip-rng.c:Rockchip Crypto/TRNG/RKRNG多代实现;
  • virtio、OP-TEE、SMCCC;
  • Intel/AMD/VIA、Broadcom、OMAP、Meson、MTK、Exynos等。

CONFIG_HW_RANDOM构建rng-core;各厂商选项独立构建。

4. tpm/

核心:

  • tpm-interface.ctpm-chip.c
  • tpm-dev.ctpm-dev-common.c
  • tpmrm-dev.ctpm2-space.c
  • tpm1-cmd.ctpm2-cmd.c
  • tpm-sysfs.c
  • eventlog/

Transport:

  • TIS MMIO/SPI/I2C;
  • CR50、Atmel、Infineon、Nuvoton、ST33;
  • ACPI CRB;
  • IBM/Xen vTPM;
  • OP-TEE fTPM;
  • userspace vTPM proxy。

5. ipmi/

主要模块:

  • message handler;
  • device interface;
  • SI(KCS/SMIC/BT);
  • SSIF(SMBus);
  • watchdog;
  • poweroff;
  • DMI/ACPI/OF/platform discovery;
  • PCI/USB等特定接口。

IPMI是管理控制器协议,不属于Linux watchdog Core本身。

6. agp/

AGP Core及Intel/AMD/VIA/NVIDIA/ALI/SIS等GART bridge驱动。主要服务旧式PC图形内存aperture,ARM64 RK3588不使用。

7. pcmcia/

包含同步串口、smart card等PCMCIA function driver。依赖PCMCIA Core,RK3588板级通常没有。

8. xillybus/

  • xillybus_core.c:endpoint/channel和字符设备数据面;
  • xillybus_class.c:class/minor管理;
  • PCIe、OF和USB transport。

它可用于FPGA streaming,但需具体Xillybus endpoint,不是通用FPGA manager。

9. 其它子目录

  • xilinx_hwicap/:MicroBlaze/Xilinx ICAP重配置;
  • mwave/:旧IBM ThinkPad modem;
  • tpm/st33zp24/:ST TPM transport。

10. Kconfig边界

drivers/char/Kconfig还source drivers/tty/Kconfigdrivers/s390/char/Kconfig,这不表示对应源码位于本目录。

关键配置:

配置 产物/接口
DEVMEM /dev/mem
DEVPORT /dev/port
HW_RANDOM rng-core/dev/hwrng
TCG_TPM TPM Core
VIRTIO_CONSOLE virtio_console
PRINTER lp
PPDEV ppdev
XILLYBUS_* transport和class

11. 与其它目录边界

  • 通用cdev:fs/char_dev.c
  • TTY:drivers/tty
  • watchdog:drivers/watchdog
  • TEE:drivers/tee
  • crypto accelerator:drivers/crypto
  • FPGA manager:drivers/fpga
  • GPIO:drivers/gpio