rust - 将结构复制到 Rust 中的特定内存位置

标签 rust unsafe low-level memmove raw-pointer

如果我有一个struct,例如:

#[derive(Clone, Copy)]
#[repr(C, packed)]
pub struct SomeData {
    a: u16,
    b: u64,
    c: u32,
    d: u16,
}

如何将其复制到内存中的特定位置,例如有效地到内存中的 0x1000 点?这样的东西行得通吗?

let dst_addr: u64 = 0x1000;
let src = SomeData {a: 1, b: 2, c: 3, d: 4};
unsafe {
    let tmp: &[u8; 10] = transmute(src);
    copy(dst_addr as *mut _, tmp);
}

请注意,这里实际上需要 repr(C, packed) 部分。

该软件在裸机 x86_64 上运行,ring 0,没有操作系统或其他限制。另外,我在没有标准库的情况下编程,所以这应该只用核心库就可以实现。

当然,这是不安全的,但这不是问题。

编辑:澄清一下:我正在复制到未初始化的内存。

最佳答案

你会想看看 core::ptr模块。

它的 write函数完全按照您的意愿行事:

pub unsafe fn write<T>(dst: *mut T, src: T)
core::ptr::write(dst_addr as *mut_, src);

如前所述,它不会降低 dst_addr 的当前值(您可以使用 read 来这样做)。

我建议不要使用 intrinsics::copy_nonoverlapping因为内在函数永远不会稳定。

关于rust - 将结构复制到 Rust 中的特定内存位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38401592/

相关文章:

rust - 线程上对象的借用和所有权

assembly - 在哪里可以了解我的计算机的低级工作原理?

rust - 静态链接使用 regex_macros 的二进制文件

rust - 如何解决 Rust 中缺少抽象类的问题?

c# - PInvoke 样式传递带有成员动态指针数组的结构

rust - transmute::<*mut c_void, Option<unsafe extern "C"fn() -> ()>> 是什么意思?

c# - 删除 C# 不安全指针

c++ - 编译器编程 : What are the most fundamental ingredients?

c - STM32:无法退出UART中断的中断处理程序

rust - 有没有办法让 Rust 将指针视为非别名,以便它可以将它们标记为 `noalias` 用于 LLVM 的优化器?