【问题标题】:Write::write_fmt causes page fault on a bare metalWrite::write_fmt 在裸机上导致页面错误
【发布时间】:2015-10-30 00:57:06
【问题描述】:

我的实验代码在裸 x86_64-metal 上运行时崩溃(IDT 尚未设置时出现页面错误),但在 aarch64 上运行良好。

通过仔细追踪,我发现这个页面错误的原因包括作为参数传递给core::fmt::ArgumentV1::new() 函数:

#[doc(hidden)]
#[unstable(feature = "fmt_internals", reason = "internal to format_args!")]
pub fn new<'b, T>(x: &'b T,
                  f: fn(&T, &mut Formatter) -> Result) -> ArgumentV1<'b> {
    unsafe {
        ArgumentV1 {
            formatter: mem::transmute(f),
            value: mem::transmute(x)
        }
    }
} 

AFAIK 这个值是由 rustc 编译器硬编码的,是 format_args 编译时处理的结果!可变参数。

也许您对这个案例有什么问题有建议。谢谢。

【问题讨论】:

标签: rust osdev


【解决方案1】:

引用自 Rust 项目的RELEASES.md:

fn 项目类型大小为零,每个fn 命名一个唯一类型。这将破坏转换 fns 的代码,因此在 fn 类型上调用 transmute 将生成几个周期的警告,然后将转换为错误。

这是版本 1.9.0 (2016-05-26) 的发行说明的一部分,因此如果您使用此版本,它可能是 std 库中的错误,如果您在playpen 并让它生成程序集,以便您查看地址实际来自哪里。

【讨论】:

    猜你喜欢
    • 2011-10-03
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多