【问题标题】:Silently discard writes to mmap region静默丢弃对 mmap 区域的写入
【发布时间】:2019-08-26 20:02:21
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我认为这种做法没有达到目标——您假设了一定程度的确定性,这可能是传统的,但实际上并不是提问者所寻求的。实际上,我认为他们正在寻找一种“谎言并说你写了,即使你没有写”类型的无声的失败——这种事情对硬件人员来说很有意义,但在软件传统中则不然。
    • 这就是将 PTE 替换为指向普通内存页面的 PTE 背后的想法 - 写入“失败”,因为它没有进入设备,但不会错了。
    • 谢谢。我应该提到我想避免SIGBUS用户,因为你说的原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2022-08-06
    • 2017-07-03
    相关资源
    最近更新 更多