静默丢弃对mmap区域的写入

时间:2019-04-05 00:05:30

标签: linux-kernel linux-device-driver mmap

我有一个Linux设备驱动程序,它允许用户空间进程mmap()写入设备MMIO空间的某些区域。设备可能会在某个时候决定撤消对该区域的访问,并在发生这种情况时通知驾驶员。驱动程序(异步)通知用户空间进程停止使用该区域。

我希望驱动程序立即更改此映射的PTE,以便可以将它们返回到设备控制,但是,用户空间进程可能仍在完成写操作。我只想丢弃这些写操作。用户不需要知道哪些写入设备了,哪些写入被丢弃了。在压缩可以无损丢弃对该区域的写入的PTE之后,驱动程序的故障处理程序可以做什么?

1 个答案:

答案 0 :(得分:0)

要使用户空间进程取得进展,PTE必须最终指向可写页面。

如果您不希望它写入设备的MMIO区域,则意味着您需要为要写入的内容分配一页普通内存,就像故障处理程序对匿名VMA所做的一样。

或者,您可以让您的用户空间任务在发生此撤消事件时采用SIGBUS,而只需指定使用此设备的任务应预期会发生这种情况,并且必须安装一个{ SIGBUS取消其写入设备的尝试。这种方法的缺点-除了它会倾倒到用户空间上而带来的额外复杂性之外-因为信号处理程序是进程全局状态,因此使您很难从库中使用设备。