我有一个Linux设备驱动程序,它允许用户空间进程mmap()
写入设备MMIO空间的某些区域。设备可能会在某个时候决定撤消对该区域的访问,并在发生这种情况时通知驾驶员。驱动程序(异步)通知用户空间进程停止使用该区域。
我希望驱动程序立即更改此映射的PTE,以便可以将它们返回到设备控制,但是,用户空间进程可能仍在完成写操作。我只想丢弃这些写操作。用户不需要知道哪些写入设备了,哪些写入被丢弃了。在压缩可以无损丢弃对该区域的写入的PTE之后,驱动程序的故障处理程序可以做什么?
答案 0 :(得分:0)
要使用户空间进程取得进展,PTE必须最终指向可写页面。
如果您不希望它写入设备的MMIO区域,则意味着您需要为要写入的内容分配一页普通内存,就像故障处理程序对匿名VMA所做的一样。
或者,您可以让您的用户空间任务在发生此撤消事件时采用SIGBUS
,而只需指定使用此设备的任务应预期会发生这种情况,并且必须安装一个{ SIGBUS
取消其写入设备的尝试。这种方法的缺点-除了它会倾倒到用户空间上而带来的额外复杂性之外-因为信号处理程序是进程全局状态,因此使您很难从库中使用设备。