Я работал с большим количеством аппаратного обеспечения, и некоторые из них имеют регистры «только для чтения» или «только для записи» (или разные функции в зависимости от того, читаете или записываете в регистр, что делает забаву, когда кто-то решает сделать «reg | = 4;» вместо того, чтобы запомнить значение, которое оно должно иметь, установить бит 2 и записать новое значение, как и вы. Ничто не похоже на попытку отладки аппаратного обеспечения, которое имеет случайные биты, появляющиеся и исчезающие из регистров, t read!;) Я до сих пор не видел попыток блокировки чтения из регистра только для записи или записи в регистры только для чтения.
Кстати, я сказал, что наличие регистров, которые являются «только для записи», является ДЕЙСТВИТЕЛЬНО плохой идеей, потому что вы не можете прочитать, чтобы проверить, правильно ли установлено программное обеспечение, что делает отладочную работу очень трудной - и люди, пишущие драйверы, не любят отлаживать сложные проблемы, которые могут быть сделаны очень легко двумя строками кода VHDL или Verilog.
Если у вас есть некоторый контроль над макетом регистра, я бы предположил, что вы помещаете регистры «только для чтения» с адресом с выравниванием по 4 КБ, а регистры «writeonly» регистрируются в другом адресе с 4 КБ [более 4 КБ в порядке]. Затем вы можете запрограммировать контроллер памяти на оборудовании, чтобы предотвратить доступ.
Или позвольте аппаратуре производить прерывание, если считываются регистры, которые не должны быть прочитаны, или записываются регистры, которые не должны быть записаны. Я предполагаю, что аппаратные средства производят прерывания для других целей?
Другие предложения, сделанные с использованием различных решений на С ++, прекрасны, но на самом деле это не останавливает тех, кто намерен напрямую использовать регистры, поэтому, если это действительно проблема безопасности (а не «давайте сделаем это неудобно») тогда у вас должно быть оборудование для защиты от неправильного использования оборудования.
У вас также есть регистры чтения и записи, верно? –
Я серьезно сомневаюсь, что вы можете это сделать на C. В C++, с другой стороны, вы должны сделать это относительно легко. – dasblinkenlight
@dasblinkenlight В C и на C++ единственным решением является дисциплина. Запись '* p = ...' или '... = * p' всегда короче и соблазнительна, чем писать и использовать некоторые специальные макросы, функции или классы (возможно, классы шаблонов). –