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

aba*_*abo 14 osdev rust

我的实验代码在裸机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)
        }
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

也许你有建议这个案子有什么问题.谢谢.

ben*_*org 1

引用自 Rust 项目的RELEASES.md

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

这是版本 1.9.0 (2016-05-26)发行说明的一部分,因此如果您使用此版本,它可能是 std 库中的错误,如果您使用 <1.9,您可能应该尝试复制代码进入游戏围栏并让它生成程序集,这样您就可以看到地址的实际来源。