Никогда не держите ссылку на место, к которому обращаются через эти методы. 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!.