【问题标题】:Copy a struct to a specific memory location in Rust将结构复制到 Rust 中的特定内存位置
【发布时间】:2016-07-15 17:02:31
【问题描述】:

如果我有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 库来实现。

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

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

【问题讨论】:

  • 有一些关于编写自己的内核的很棒的教程,包括 Writing an OS in Rust in tiny steps by Julia EvansWriting an OS in Rust by Philipp Oppermann 以及至少两个更大的项目:IntermezzosRedox
  • @Shepmaster 是的,我都读过。我只是想知道这样做的“正确”方法是什么,因为教程并不总是正确,如果有一些我不知道的很棒的“技巧”。
  • 我认为当这些教程发布到 subreddit 或用户论坛,甚至是 Hacker News 时,社区会彻底阅读这些教程。我希望它们会得到很好的评价。
  • 作为一个迂腐的观点,我认为usize 可能比 u64 稍微好一点,如果它是持有一个指针。另一方面,您似乎正在为一个系统做一些非常具体的事情!
  • @ChrisEmerson 是的,它实际上是从 usize 转换而来的,只是因为在此之后实际上将指针用于它必须恰好是 64 位的东西。

标签: rust unsafe low-level memmove raw-pointer


【解决方案1】:

您会想看看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,因为内在函数永远不会稳定。

【讨论】:

  • 成功了 => 接受了!不得不使用ptr::write(dst_addr as *mut SomeData, *self);,因为我在SomeDatas 方法中这样做。
猜你喜欢
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 2011-03-16
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多