2

たとえば、がある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です。

もちろん、これは安全ではありませんが、問題ではありません。

編集:明確にする:初期化されていないメモリにコピーしています。

4

1 に答える 1

7

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組み込み関数は決して安定しないため、使用しないことをお勧めします。

于 2016-07-15T17:10:43.033 に答える