ax-handler-table
路径:
components/handler_table类型:库 crate 分层:组件层 / 处理器表基础件 版本:0.3.2文档依据:Cargo.toml、README.md、src/lib.rs
ax-handler-table 是一个固定大小、无锁、仅存函数指针的处理 器表。它用 AtomicUsize 数组保存 fn() 处理函数,支持按槽位注册、注销和调用。它是非常典型的叶子基础件:不是中断控制器、不是事件总线、也不是通用回调注册中心。
架构设计
设计定位
这个 crate 解决的是“如何在极低开销下按编号存放一组处理函数”:
- 事件编号天然是整数索引。
- 处理器要求是极简的
fn(),没有捕获环境、没有参数、没有返回值。 - 注册/注销/查询要尽量避免引入锁。
在当前仓库里,它最真实的使用场景是 ax_plat::irq 及各平台的 IRQ_HANDLER_TABLE。
1.2 核心类型
Handler = fn():处理函数类型,刻意限制为普通函数指针。HandlerTable<const N: usize>:内部持有[AtomicUsize; N]的表结构。
1.3 实现主线
它的实现非常直接:
几个关键点需要文档里明确:
- 注册只允 许空槽位写入,已存在处理器时返回
false。 - 注销返回原来的函数指针,便于调用方做恢复或复用。
handle()只做一次 load 并立即调用,没有额外同步。
1.4 能力边界
- 它不支持捕获闭包,因为底层存的就是裸
fn()指针。 - 它不支持处理器链、优先级或共享状态。
- 它也不保证“注销后绝不会再跑一次处理器”:如果
handle()已经 load 到指针,再unregister(),那次调用仍可能继续发生。
核心功能
功能概览
- 以 O(1) 索引方式注册或注销处理器。
- 以无锁 load 的方式调用对应槽位的函数。
- 为空槽位和越界索引返回显式失败结果。
使用场景
HandlerTable::new():各平台 IRQ 子系统用它声明静态处理器表。register_handler()/unregister_handler():被platforms/ax-plat/src/irq.rs的平台实现间接消费。handle():由平台 IRQ 处理路径在拿到实际 IRQ 号后调用。
边界说明
ax-handler-table不负责从硬件拿 IRQ 号,也不负责 EOI/ACK。ax-handler-table不区分设备中断、IPI 或软中断类型;它只管“编号 -> 函数”的映射。ax-handler-table也不是通用事件系统,过于复杂的回调模型不适合塞进来。
依赖关系
直接依赖
这个 crate 本体没有本地 crate 依赖,保持了非常小的体量。
主要消费者
ax_plat::irq:把HandlerTable作为平台 IRQ 管理接口的一部分导出。- 各平台 IRQ 实现:如
ax-plat-x86-pc、ax-plat-riscv64-qemu-virt等,都直接声明静态IRQ_HANDLER_TABLE。