如何从 Rust 调用原始地址?

2024-01-03

我正在用 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不允许(参见Rustonomicon 关于强制转换的章节 https://doc.rust-lang.org/nomicon/casts.html)。因此,据我所知,转换为函数指针类型的唯一方法是使用万能的武器mem::transmute() https://doc.rust-lang.org/stable/std/mem/fn.transmute.html.

但在我们可以使用之前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(); 

但是,对此有一些注意事项:

  • 如果您,未来的读者,想用它来做简单的 FFI 事情:请花点时间再考虑一下。很少需要自己计算函数指针。
  • Usually extern "C"函数具有类型unsafe extern "C" fn()。这意味着调用这些函数是不安全的。你可能应该添加unsafe到你的函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Rust 调用原始地址? 的相关文章

  • 在长模式下更改 GDT 并更新 CS

    我正在编写一个简单的自制 64 位操作系统 通过 UEFI 启动它 这意味着当我的代码开始执行时 它已经处于长模式 并且启用了分页 现在 退出 UEFI 引导服务后 我想用我自己的控制结构替换 UEFI 构建的所有控制结构 成功更改 CR3
  • 在 FFI 中使用 ptr::NonNull 是否有效?

    铁锈具有ptr NonNull https doc rust lang org beta std ptr struct NonNull html代表非的类型NULL指针 在 FFI 中使用这种类型安全吗 是否保证具有相同的二进制表示形式 忽
  • 如何迭代每隔一个数字

    阅读文档时 我注意到一句话 Rust 没有C stylefor 循环 所以 我想知道 如何制作一个相当于for i 0 i lt 10 i 2 我能想到的方法是这样的 for i in 0 10 if i 2 0 Do stuff Or e
  • 货运公司如何决定是否重建部门?

    我正在考虑跳过货物中的依赖关系构建步骤 我有一个简单的项目 使用 3 个板条箱作为依赖项 在Cargo toml 我使用一次构建项目cargo build release 现在我有另一个项目 它使用其中提到的相同依赖项Cargo toml文
  • 对于实现相同特征的结构,如何克服类型不兼容的匹配臂?

    我正在尝试写cat命令来学习 Rust 但我似乎无法将命令行参数转换为阅读器结构 use std env io use std fs File fn main for arg in env args skip 1 let reader ma
  • 如何区分缺少的反序列化字段和空字段?

    我想用Serde https serde rs 将一些 JSON 解析为 HTTP PATCH 请求的一部分 由于 PATCH 请求不传递整个对象 仅传递要更新的相关数据 因此我需要能够区分未传递的值和显式设置为的值null 以及存在的值
  • C 语言中这个奇怪的函数指针声明是什么意思? [复制]

    这个问题在这里已经有答案了 谁能解释一下什么int foo int int 在这呢 int fooptr int int foo int int Can t understand what this does int main fooptr
  • 是否存在具有单个强所有者和多个弱引用的共享指针?

    我正在寻找类似于的智能指针Arc Rc只不过它不允许共享所有权 我想要尽可能多的rc Weak我需要的参考资料 但我只想one强引用 又称所有者 我想通过类型系统来强制执行这一点 Arc Rc可以克隆 并且可以在多个地方拥有它们 滚动我自己
  • 类型提示中 _ 的正确术语是什么?

    在 Rust 的类型提示中 可以在注释中使用部分类型 如下所示 let myvec Vec lt gt vec 1 2 3 部分类型注释中下划线的正确术语是什么 我对 Rust 术语以及更多学术类型理论术语感兴趣 我找到了一个一份官方文件
  • 预期关闭,发现不同的关闭

    A是一个包含向量的结构B A实施add b方法添加了一个B实例到列表B B包含一个闭包属性f 如果我添加一个B到向量add b 没关系 如果我将两个向量相加add b 我收到一个错误 说两个闭包不同 这是一个最小的例子 A struct s
  • 如何创建静态字符串数组?

    Note这个问题包含 Rust 1 0 之前的语法 代码无效 但概念仍然相关 如何在 Rust 中创建全局静态字符串数组 对于整数 编译如下 static ONE u8 1 static TWO u8 2 static ONETWO sta
  • 无约束类型参数错误

    我正在尝试将 glium 与 cgmath 连接起来 下列的这个答案 https stackoverflow com a 40028032 5397009 我已经实现了ToArray要转换实例的特征cgmath Matrix4转换成 gli
  • 比较 std::functions 是否相等?

    如何比较两个 C 11std functions with operator 并返回true如果两者都说functions 引用同一个函数指针吗 你实际上可以让它工作 target template
  • 如何操作 Rust 数组的 2 个可变切片?

    我有一个函数需要对单个数组的两个部分进行操作 目的是能够建立一个 nostd 分配器 可以将更大数组的变量切片返回给调用者 并保留数组的其余部分以供将来分配 这是失败的示例代码 fn split lt a gt mut item a mut
  • 如何打印带有前导零的二进制整数?

    我正在做一些摆弄 我想打印我的 u16 中的所有位 let flags 0b0000000000101100u16 println flags b flags 这打印flags 0b101100 我如何让它打印flags 0b0000000
  • 无法覆盖 Rustup 工具链以自定义构建 iOS 工具链

    我正在用我的 Rust 版本创建我自己的工具链 我需要它与 iOS 架构进行交叉编译 当尝试设置默认工具链或覆盖当前目录的工具链时 我收到有关工具链名称的错误 以下是我创建这个新工具链所采取的步骤 创建 Rustup 工具链 rustup
  • 在 Rust 中使用结构体的生命周期的正确方法是什么?

    我想写这样的结构 struct A b B c C struct B c C struct C The B c应该借自A c A gt b B gt c C borrow from c C lt 这是我尝试过的 struct C struc
  • 您可以控制借用结构体还是借用字段吗?

    我正在开发一个涉及以下结构的程序 struct App data Vec
  • 实现特征时“预期类型参数,找到结构”

    我正在尝试为有向图结构创建一个特征并提供一个非常基本的实现 但遇到编译器错误 pub trait DiGraph lt a gt type N fn nodes
  • Rust 中为什么有 mod 关键字?

    看完之后this https doc rust lang org book crates and modules html 我想知道为什么有一个mod关键字和mod rs 我假设目录层次结构也可以描述模块 必须显式声明模块有几个原因 模块可

随机推荐

  • 检测处理器的数量

    如何检测 net 中物理处理器 核心的数量 System Environment ProcessorCount 返回逻辑处理器的数量 http msdn microsoft com en us library system environm
  • Linux内核中slab内存管理的缓存着色

    我最近读到有关slab系统的缓存着色的内容 但不明白 为什么为不同slab中的对象添加不同偏移量的缓存着色可以提高性能 我最初的猜测是 具有缓存偏移量的slab分配器 尝试将slab的第一个对象放在不同缓存颜色的内存中 如果客户端从这些sl
  • 如何覆盖已经有 !important 的 CSS 背景?

    我试图用时尚覆盖网站的背景 但它不起作用 网站的背景 css 也有一个 important 并且它是压倒性的 我的代码 body background image none important background black import
  • 有没有办法在 grpc 服务器端设置超时?

    无法从服务器端使 grpc 连接超时 客户端可能建立连接但保持保持 睡眠状态 从而导致 grpc 服务器连接挂起 服务器端有没有办法在一定时间后断开连接或设置超时 我们尝试从客户端断开连接 但无法从服务器端执行此操作 在这个链接中gRPC
  • 如何强制命令行使用 PHP 版本?

    我由 1and1 com 托管 并且我已将我的文件设置为使用 php5 进行解析 htaccess 但这仅适用于 apache 而不适用于命令行 命令行默认为服务器默认 php4 所以目前我无法设置计划任务以 php5 运行我的代码 有任何
  • .htaccess - 递归地将斜杠映射到下划线

    G day 正如标题所示 我正在尝试将网址格式设置为 this is mah page strucutre到文件this is mah page structure php 现在 我已经可以工作了 只是我不知道结构的深度 因此我需要进行一些
  • Julia 中 @sync @async 的并行性

    我有一些繁重的 csv 表 我想与 sync sync 宏并行导入 对此不太熟悉 我尝试了以下方法 import files sync async begin df1 CSV File libname df1 csv gt DataFram
  • Javascript 中基于区域设置的排序,以预定义的方式对重音字母和其他变体进行排序

    在芬兰语中 我们排序W after V 如英语 但是因为W不是芬兰本土字母 它被认为是一个变体V 它被排序为等于V 但在两个词之间唯一的区别是V is W then V 版本首先排序 一个例子说明了正确的顺序 Vatanen Watanen
  • OWIN创业班

    有人可以告诉我 OWIN 启动类的确切作用吗 基本上我正在寻找什么 它的目的是什么 何时调用 仅调用一次或每次请求 这是配置我的依赖注入库的好地方吗 Owin 被设计为可插拔设计 您可以从配置中更改 替换一组服务 例如在以下配置中 我有 启
  • 如何在iPhone的phonegap应用程序中的javascript中读取sqlite3的数据

    我正在 iPhone 的phonegap 中开发一个应用程序 其中我有一个sqlite3 数据库 其中包含纬度和经度值以及相应的区域名称 我已在应用程序中复制了 sqlite 数据文件 我需要从sqlite中获取数据并将表中的数据显示在视图
  • 重载运算符<<以接受模板函数

    我试图能够使用函数编写可扩展语法 但似乎找不到接受模板函数的正确语法 我使用的是 Visual C 2008 它将接受与模板函数相同类型的变量或类似的非模板函数 但不接受模板函数本身 错误 1 错误 C2679 二进制 class Gram
  • 所有运行的单元测试都以代码 0 (0x0) 退出,甚至没有命中断点

    我正在运行 Visual Studio 2017 15 9 程序已成功构建 但每次我右键单击 调试测试 时 编译器都会退出并显示以下消息 程序 xxxxx testhost x86 exe 已退出 代码为 0 0x0 调试输出屏幕和测试输出
  • 使用不连续索引进行 pyomo 优化

    我正在使用 pyomo 在 python 中进行优化 我计划使用 t start t end 范围内的索引 现在 这些 t start 和 t end 值是 EV 的函数 使得 m pyo ConcreteModel m EV pyo Ra
  • AMQP/RabbitMQ - 顺序处理消息

    我有一个direct交换 还有一个队列与该交换器绑定 该队列有两个消费者 消费者完成相应的处理后 将手动确认消息 消息按逻辑顺序 排序 并且应按该顺序进行处理 是否可以强制要求消费者 A 和消费者 B 按顺序接收和处理所有消息 换句话说 阻
  • WIX 中的指南语法?

    为 WIX 的 wxs 文件中的组件提供 guid 的正确语法是什么 在我发现的大多数样本中 Guid 00AD2D6E BF8A 4EA8 BE9A 57380DECD0E6 但在一些样本中我发现 Guid 00AD2D6E BF8A 4
  • 在Python中根据标签将一个大的xml文件分割成多个

    我有一个非常大的 xml 文件 我需要根据特定标签将其拆分为多个文件 XML 文件是这样的
  • php 的 glob 函数返回路径名的顺序是什么?

    The 文档 https www php net globfor glob 没有提到它返回路径名数组的顺序 如果有 但是 它确实提到了一个允许您禁用排序的标志 GLOB NO排序 返回目录中出现的文件 无 排序 数组是如何排序的glob当当
  • 如何在 Symfony 2 中验证依赖于另一个属性的属性

    是否可以验证依赖于同一类的另一个属性的模型类的属性 例如 我有这样的课程 class Conference startDate datetime protected startDate endDate datetime protected
  • 无法构造“FormData”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 当我在拖放区上传文件时 它不起作用 通常它工作得很好 但自 1 个月以来我遇到了这个 JS 错误 Uncaught TypeErr
  • 如何从 Rust 调用原始地址?

    我正在用 Rust 编写一个操作系统 需要直接调用我正在计算的虚拟地址 类型为u32 我预计这会相对简单 let code virtual address as extern C fn code 然而 这抱怨演员阵容不原始 它建议我使用Fr