MMIO 向けの volatile メモリアクセス

  • pointer::read_volatilepointer::write_volatile を使用してください。
  • これらのメソッドでアクセスしている場所への参照は決して保持しないでください。Rust は参照をいつでも読み取る(&mut の場合は書き込む)ことがあります。
  • 中間参照を作成せずに構造体のフィールドへのポインタを得るには &raw を使用 してください。
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

const SOME_DEVICE_REGISTER: *mut u64 = 0x800_0000 as _;
// SAFETY: このアドレスには何らかのデバイスがマップされています。
unsafe {
    SOME_DEVICE_REGISTER.write_volatile(0xff);
    SOME_DEVICE_REGISTER.write_volatile(0x80);
    assert_eq!(SOME_DEVICE_REGISTER.read_volatile(), 0xaa);
}
  • volatile アクセス: 読み書き操作には副作用があり得るため、コンパイラやハード ウェアがそれらを並べ替えたり、重複させたり、取り除いたりするのを防ぎます。
    • たとえば可変参照経由で書き込みの後に読み取りを行うと、コンパイラは読み取 った値が直前に書き込んだ値と同じだと仮定し、実際にはメモリを読まないことがあります。
  • ハードウェアへの volatile アクセス用の既存のクレートの中には参照を保持する ものもありますが、これは非健全です。参照があると、コンパイラはそれを デリファレンスする可能性があります。
  • 構造体へのポインタからフィールドへのポインタを取得するには &raw を使用してください。
  • 古いバージョンの Rust との互換性のために、代わりに addr_of! マクロを使 用できます。