如果我有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
库才能实现这一点。
这当然是不安全的,但这不是问题。
修改:简单说明:我正在复制到未初始化的内存。
答案 0 :(得分:6)
您需要查看core::ptr
模块。
它的write
函数正是您所希望的:
setup.py
pub unsafe fn write<T>(dst: *mut T, src: T)
如上所述,它不会降低core::ptr::write(dst_addr as *mut_, src);
处的当前值(您可以使用dst_addr
来执行此操作)。
我建议不要使用intrinsics::copy_nonoverlapping
因为内在函数永远不会稳定。