Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Энергозависимый (volatile) доступ к памяти для MMIO

  • Используйте pointer::read_volatile и pointer::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);
}
  • Энергозависимый доступ: операции чтения или записи могут иметь побочные эффекты, поэтому компилятор или аппаратура не должны переупорядочивать, дублировать или исключать их.
    • Если вы записываете, а затем читаете, например через изменяемую ссылку, компилятор может предположить, что прочитанное значение совпадает с только что записанным, и не станет на самом деле читать память.
  • Некоторые существующие крейты для энергозависимого доступа к аппаратуре хранят ссылки, но это некорректно (unsound). Всякий раз, когда существует ссылка, компилятор может решить её разыменовать.
  • Используйте &raw, чтобы получить указатели на поля структуры из указателя на структуру.
  • Для совместимости со старыми версиями Rust можно использовать макрос addr_of!.