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



如果我有一个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上运行,环 0,没有操作系统或其他限制。另外,我在没有标准库的情况下编程,所以这应该只能用core库来实现。

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

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

您需要查看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因为内在永远不会稳定。

最新更新