You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// Kani's bundled toolchain predates these methods being added to `Step`.// Exclude them there so the crate still compiles under `cargo kani`.// This can be removed once Kani upgrades its bundled toolchain to nightly-2026-07-10 or later.#[cfg(not(kani))]#[inline]
……
}
b. 修补 gen_wrapper.rs:添加 page_table_entry patch 和 raw_trap_handle
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
Uh oh!
There was an error while loading. Please reload this page.
async-os 复现文档
note:记录遇到的问题以及成功复现步骤。
1. 环境
2. 目录结构
四个仓库需要放在同级目录下:
2. 复现步骤
1. Clone 仓库
2. 配 Rust 镜像
直连 Rust 服务器太慢,用字节的镜像:
3. 安装 Rust 工具链
rustup install nightly-2026-05-26 rustup target add riscv64gc-unknown-none-elf x86_64-unknown-none \ aarch64-unknown-none aarch64-unknown-none-softfloat \ --toolchain nightly-2026-05-26 rustup component add rust-src llvm-tools rustfmt clippy \ --toolchain nightly-2026-05-26 # 安装 cargo-binutils(提供 rust-objcopy 等命令) cargo +nightly-2026-05-26 install cargo-binutils4. 修补源码(核心步骤)
以下四个修补是由于 async-os 原本的缺陷导致编译失败所采取的解决办法。
a. 修补
x86_64crate 以兼容 nightly-2026-05-26x86_64v0.15.5 实现了Steptrait 的forward_overflowing/backward_overflowing方法,这两个方法在 nightly-2026-05-26 中已从 trait 中移除,导致编译失败。用编辑器打开以下三个文件,找到残留的
cfg(not(kani))块(每个文件各 2 处,共 6 处),整块删除:每个文件中搜索
Kani,找到并删除如下形式的代码块:b. 修补
gen_wrapper.rs:添加page_table_entrypatch 和raw_trap_handle文件:
~/data/vdso_crate_template/build_vdso/src/gen_wrapper.rs修改一:
page_table_entryv0.5.7 无条件依赖x86_64,需要 patch 到本地修改版(v0.6.1 已将 x86_64 设为 cfg 条件依赖,但版本号不兼容 0.5.x)。在[features]块之后添加[patch.crates-io]:找到
format!宏中的:改为:
修改二:
vsched2/src/arch/riscv.rs的汇编代码中有beq a0, a1, raw_trap_handle指令,但raw_trap_handle的实现在 完整内核中提供,单独编译成的共享库中没有。需要提供一个桩函数。在
lib_rs_content函数的panic_loop()定义之后添加:c. 修补
lib.rs:添加-Bsymbolic链接选项文件:
~/data/vdso_crate_template/build_vdso/src/lib.rsvsched2/src/arch/riscv.rs 文件中使用了一个跳转的汇编代码,并且它跳转的对象是一个向外部公开的符号,这类符号通常意味着能够被外部程序提供的同名符号替换掉,链接器会选择运行时确定跳转的地址,但是使用的这个跳转汇编代码不允许运行时确定,所以编译就报错了,解决办法就是添加
-Bsymbolic让链接器优先绑定库内符号。找到约第 204 行的
linker_cmd.args([,在"-shared",后添加"-Bsymbolic",:d. 修补本地
page_table_multiarch版本号(和b的修改一相关)我们从 GitHub 拉的是 v0.6.1 的代码,但
vsched_hal依赖的是"0.5.7",按 Rust 语义化版本规则,0.6.x与0.5.x不兼容。cargo 拒绝用不兼容的版本来[patch]。解决办法是修改版本号为 0.5.8,骗过 cargo 的版本兼容性检查。
5. 创建 prebuild_vdso 项目
async-os 的整个复现过程是先编译 vsched2,再编译 async-os。我在编译过程中,前者编译好后,在编译后者的过程中遇到了下面这个问题:
async-os的编译:cargo build涉及两个步骤。
解决方案:创建一个独立的 Rust 项目,单独调用
build_vdso生成vdso_output/。6. 预编译 vsched2(生成 vdso_output)
7. 编译 async-os
All reactions