静静地丢弃对 mmap 区域的写入

Silently discard writes to mmap region

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

我希望驱动程序立即关闭此映射的 PTE,以便它们可以返回到设备控制,但是,用户space 进程可能仍在完成写入。我想简单地丢弃这些写入。用户不需要知道哪些写入已写入设备,哪些写入已被丢弃。在关闭可以无害地丢弃对该区域的写入的 PTE 之后,驱动程序的故障处理程序可以做什么?

为了让用户空间进程取得进展,PTE 需要最终指向一个可写页面。

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

或者,您可以让您的用户空间任务在发生此撤销事件时执行 SIGBUS,并且只需指定使用此设备的任务应该预期会发生这种情况并且必须安装 SIGBUS 处理程序使用 longjmp() 取消其写入设备的尝试。这种方法的缺点 - 除了它转储到用户空间的额外复杂性 - 是它使得从库中使用你的设备变得困难,因为信​​号处理程序是进程全局状态。