我正在用 Rust 编写一个 x86_64 操作系统并在 qemu 电脑上测试它。我已经实现了 ELF 文件加载,并且我 100% 确定文件已正确加载和映射,因为我已经手动检查了内存。
我的问题是,当我尝试在
println!
中使用 rust 格式时,程序会跳转到第 0 页中的随机地址,该地址应该是只读段的一部分。之后,一些数据被解释为指令,结果我要么得到 page fault
要么得到 invalid opcode fault
。打印没有格式的字符串工作正常,但是当我尝试打印中间带有格式化整数的字符串时,我就会遇到这个问题。 ELF 可执行文件是使用 x86_64-unknown-none
目标编译的。
这是我的项目的 github 存储库:https://github.com/gillo04/alba/tree/main/kernel/src
在
user1/
目录中,您可以找到我正在尝试执行的程序的源代码。在 kernel/src/main.rs
文件中,在主函数的底部,您可以找到我用来加载可执行文件并跳转到它的代码。感谢您的帮助!
显然生成的 ELF 需要进行一些重定位才能正常工作。将
rusflags=["-C", "relocation-model=static"]
添加到我的 .cargo/config.toml
文件修复了问题,删除了重定位