Write :: write_fmt导致裸机上的页面错误

时间:2015-08-06 18:25:35

标签: rust osdev

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

通过仔细跟踪,我发现这个页面错误的原因包括功能错误的地址(远高于0x200_000,而只有前2M页面被映射为1:1)的功能" f"作为参数传递给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编译时处理的结果!可变参数。

也许你有建议这个案例有什么不对。感谢。

1 个答案:

答案 0 :(得分:1)

引用Rust项目的RELEASES.md

  

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

这是版本1.9.0 (2016-05-26)的发行说明的一部分,所以如果您使用的是此版本,则可能是std库中的错误,如果您正在使用&lt; 1.9您应该尝试将代码复制到playpen并让它生成程序集,以便查看地址的实际来源。