如何在中断处理程序期间访问物理地址 linux

How to access physical address during interrupt handler linux

我在linux中写了一个中断处理程序。 我需要访问物理地址的处理程序逻辑的一部分。 我使用了 iormap 函数,但后来我在处理程序时间陷入了 KDB。 我开始调试它,我看到下面的代码最终被 ioremap 调用

我该怎么办?有没有其他方法可以代替之前映射区域? 如果我需要在这之前映射它,这意味着我可能需要映射和缓存大量未使用的区域。 顺便说一句,ioremap 的限制是什么?

设置新的内存映射是一项昂贵的操作,通常需要调用潜在的阻塞函数(例如,获取锁)。所以你的策略有两个问题:

  1. 在您的上下文中调用阻塞函数是不可能的(没有与您的中断处理程序关联的内核线程,因此如果必须将其置于内核中,则内核无法恢复它睡觉)。

  2. 为每个 IRQ 设置 up/tearing 映射将是一个坏主意 performance-wise(即使我们忽略了它无法完成的事实)。

通常,您会在驱动程序的 probe() 函数中设置您需要的任何映射(或者在模块的 init() 中,如果它更像是一个单例)。这个映射然后保存在一些私有设备数据结构中,作为最后一个参数传递给request_irq()的某个变体,这样内核然后将它作为第二个参数传递回IRQ处理程序。

不确定“需要映射和缓存大量未使用区域”是什么意思。

根据您的特定系统,您最终可能会使用 CPU 的 MMU 中的一个条目,或者您可能只是 re-use 由编写 BSP 的人设置的更广泛的映射。这只是在虚拟内存系统上做生意的成本。

通常不会在 I/O 内存上启用缓存,因为读取和写入次数很多 side-effects。对于需要它的奇怪情况,您必须使用 ioremap_cached().