Чтобы процесс пользовательского пространства достиг прогресса, PTE должен в конечном итоге указывать на доступную для записи страницу.
Если вы не хотите, чтобы запись выполнялась в регионе MMIO вашего устройства, это означает, что вам необходимовыделите страницу обычной памяти для записи, чтобы перейти к ней, так же, как это делает обработчик ошибок для анонимного VMA.
В качестве альтернативы, вы можете позволить вашей задаче пространства пользователя принять SIGBUS
, когда происходит это событие отзыва, ипросто укажите, что задача, использующая это устройство, должна ожидать, что это произойдет, и должна установить обработчик SIGBUS
, который использует longjmp()
, чтобы отменить попытку записи на устройство.Недостатком этого подхода - помимо дополнительной сложности, которую он сбрасывает в пользовательское пространство - является то, что он затрудняет использование вашего устройства из библиотеки, поскольку обработчики сигналов находятся в глобальном состоянии процесса.