操作码与 opdef 分派机制与实现详解
源码路径:
rk3588/kernel-6.1/io_uring/opdef.c、opdef.h、各*.c处理器
文档目录:linuxDoc/io_uring/
目录
一、原理
所有 IORING_OP_* 在 io_op_defs[] 中注册元数据与函数指针;io_issue_sqe 仅通过 req->opcode 索引,实现 表驱动分派,新增 opcode 主要改 opdef.c 与对应 *.c。
io_uring_optable_init()(initcall)校验表长等于 IORING_OP_LAST 且每项有 prep/issue。
二、io_op_def 结构
1 | struct io_op_def { |
issue_flags 常见位:IO_URING_F_NONBLOCK、IO_URING_F_UNLOCKED、IO_URING_F_MULTISHOT、IO_URING_F_COMPLETE_DEFER。
三、操作码分类
| 类别 | 操作码示例 | 源文件 |
|---|---|---|
| 基础 | NOP |
nop.c |
| 读写 | READV、WRITEV、READ、WRITE、READ_FIXED、WRITE_FIXED、READV_FIXED、WRITEV_FIXED |
rw.c |
| 向量扩展 | READ_MULTISHOT、WRITE_MULTISHOT 等(若 6.1 已启用) |
rw.c |
| 同步元数据 | FSYNC、SYNC_FILE_RANGE |
sync.c |
| 结构 | STATX、OPENAT、CLOSE、RENAMEAT、MKDIRAT… |
statx.c、openclose.c、fs.c |
| 管道/切分 | SPLICE、TEE |
splice.c |
| 建议 | FADVISE、MADVISE |
advise.c |
| 扩展属性 | GETXATTR、SETXATTR… |
xattr.c |
| 网络 | SEND、RECV、ACCEPT、CONNECT、SENDMSG、RECVMSG、SEND_ZC… |
net.c(CONFIG_NET) |
| 轮询 | POLL_ADD、POLL_REMOVE |
poll.c |
| 超时 | TIMEOUT、TIMEOUT_REMOVE、LINK_TIMEOUT |
timeout.c |
| epoll | EPOLL_CTL |
epoll.c |
| 取消 | ASYNC_CANCEL |
cancel.c |
| 环间 | MSG_RING |
msg_ring.c |
| 驱动命令 | URING_CMD |
uring_cmd.c |
| 不支持 | not_supported 或 io_eopnotsupp_prep |
— |
IORING_REGISTER_PROBE:遍历 io_op_defs 填 IO_URING_OP_SUPPORTED。
四、实现文件映射
读写路径 rw.c:
- 使用内嵌
struct io_rw(含kiocb) - 支持 fixed buffer、buffer select、nowait、ioprio
- 块文件可走
io_read/io_write→call_read_iter/ 直 IO
五、RK3588
- 编解码场景常用:文件 READ/WRITE(码流落盘)、SOCKET(RTSP/私有协议)、URING_CMD(若存储栈支持)
- 裁剪内核时关闭
CONFIG_NET将导致网络 opcode 在 probe 中不可用
附录
| API | 作用 |
|---|---|
io_uring_get_opcode |
根据 opcode 返回名称字符串 |
io_prep_rw |
通用读写 prep |
相关:06 URING_CMD
正在加载留言…