gpt4 book ai didi

rust - 我如何从 Rust 调用原始地址?

转载 作者:行者123 更新时间:2023-11-29 07:50:09 25 4
gpt4 key购买 nike

我正在用 Rust 编写操作系统,需要直接调用我正在计算的虚拟地址(u32 类型)。我希望这会相对简单:

let code = virtual_address as (extern "C" fn ());
(code)();

但是,这会提示类型转换是非原始的。它建议我使用 From 特性,但我看不出这有什么帮助(尽管我对 Rust 比较陌生,所以可能会遗漏一些东西)。

error[E0605]: non-primitive cast: `u32` as `extern "C" fn()`
--> src/main.rs:3:16
|
3 | let code = virtual_address as (extern "C" fn ());
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= note: an `as` expression can only be used to convert between primitive types. Consider using the `From` trait

我拥有 libcore 中的所有内容,但没有移植 std,所以不能依赖任何不是 no_std 的内容

最佳答案

_ as f-ptr 类型的转换是不允许的(参见 the Rustonomicon chapter on casts )。因此,据我所知,转换为函数指针类型的唯一方法是使用万能的武器 mem::transmute() .

但在我们可以使用transmute() 之前,我们必须将我们的输入放入正确的内存布局中。我们通过转换为 *const ()(一个空指针)来做到这一点。之后我们可以使用 transmute() 得到我们想要的:

let ptr = virtual_address as *const ();
let code: extern "C" fn() = unsafe { std::mem::transmute(ptr) };
(code)();

如果您发现自己经常这样做,各种宏都可以删除样板文件。一种可能:

macro_rules! example {
($address:expr, $t:ty) => {
std::mem::transmute::<*const (), $t>($address as _)
};
}
let f = unsafe { example!(virtual_address, extern "C" fn()) };
f();

不过,有几点要注意:

  • 如果你, future 的读者,想用它来做简单的 FFI 事情:请花点时间再考虑一下。很少需要自己计算函数指针。
  • 通常 extern "C" 函数的类型是 unsafe extern "C"fn()。这意味着调用这些函数是不安全的。您可能应该将 unsafe 添加到您的函数中。

关于rust - 我如何从 Rust 调用原始地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com