将结构复制到 Rust 中的特定内存位置
Copy a struct to a specific memory location in 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,ring 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
,因为内在函数永远不会稳定。
如果我有一个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
库就可以实现。
这当然不安全,但这不是问题。
编辑:澄清一下:我正在复制到未初始化的内存。
您会想看看 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
,因为内在函数永远不会稳定。