axvisor_api_proc
路径:
virtualization/axvisor_api_proc类型:过程宏库 分层:组件层 / 编译期 API 生成辅助 版本:0.1.0文档依据:当前仓库源码、Cargo.toml、README.md、src/lib.rs、src/items.rs、virtualization/axvisor_api/src/lib.rs、virtualization/axvisor_api/src/test.rs
axvisor_api_proc 不是运行时 API 库,而是 axvisor_api 背后的过程宏辅助 crate。它的职责是把一组带 extern fn 语法标记的模块,展开成可调用的 API 包装函数和对应的 crate_interface trait/impl 胶水代码。因此它属于“编译期 glue”,而不是 Hypervisor 子系统本体。
架构设计
设计定位
这个 crate 解决的是 Axvisor API 组织方式问题:
- 如何让“定义 API 的模块”写起来像普通 Rust 模块
- 如何让“实现这些 API 的模块”在另一个位置编写
- 如何在编译期自动生成跨模块绑定代码
其公开入口只有两个属性宏:
#[api_mod]#[api_mod_impl(path)]
这说明它的本质是一套模块级 API DSL,而不是运行时组件。
1.2 语法模型
src/items.rs 定义了宏要解析的核心语法节点:
| 类型 | 作用 |
|---|---|
ItemApiFn<T> | 表示一个 API 函数;定义态用 ;,实现态用 Block |
ApiModItem<T> | 模块中的条目,区分普通 item 和 API 函数 |
ItemApiMod<T> | 带有 API 语义的模块定义 |
ItemApiModDef | #[api_mod] 使用的定义态模块 |
ItemApiModImpl | #[api_mod_impl] 使用的实现态模块 |
这里最关键的设计是:
- API 函数用
extern fn ...;或extern fn ... { ... }作为标记 - 普通 item 则原样保留
这样宏就能在一个模块里同时容纳:
- 类型别名
use/pub use- 普通辅助函数
- 真正需要跨组件绑定的 API 函数
1.3 api_mod 的展开思路
#[api_mod] 处理的是“定义 API”的模块。其关键步骤是:
- 解析输入模块
- 把模块内容分成普通条目和 API 函数
- 生成一个隐藏 trait,名字形如
Axvisor{Module}ApiTrait - 给每个 API 函数生成一个同名包装函数
- 包装函数内部用
crate_interface::call_interface!转调
这些隐藏 trait 不是直接引用 crate_interface 路径,而是通过:
axvisor_api::__priv::crate_interface
来拿到 def_interface / call_interface,从而避免调用方必须手工了解底层依赖布局。