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

Han*_*ila 2 unsafe low-level rust memmove raw-pointer

如果我有struct,例如:

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

如何将其复制到内存中的特定位置,例如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);
}
Run Code Online (Sandbox Code Playgroud)

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

该软件在裸x86_64,ring 0上运行,没有操作系统或其他限制.另外,我在没有标准库的情况下进行编程,因此只有core库才能实现这一点.

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

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

Mat*_* M. 6

您将需要查看该core::ptr模块.

它的write功能完全符合您的要求:

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

如上所述,它不会降低当前值dst_addr(您可以read这样做).

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