当然,一般来说,用户模式分配背后的物理内存(例如malloc()返回的指针)可能很好地根据内核的判断移动到某个不同的物理地址(例如,如果内存交换到磁盘并且是后来召回到其他一段物理内存)。但是,用户模式代码不会受到影响,因为内核会更新页面表以指向新位置而不会更改用户正在使用的虚拟地址。
如果这个(可能是不连续的)物理内存是某个DMA的目标,那么有用户模式mlock()和munlock()调用来阻止这个内存被分页,你可以调用get_user_pages()等获取物理地址以提供给DMA硬件等。这一切都很好 - 但这不是我的情况。
相反,我已经完成了一些内核模式分配(使用__get_free_pages())来获取物理上连续的内存,因为我们的基于PCIe卡的DMA引擎不支持分散 - 聚集。所有这一切都运行良好一段时间 - 直到我遇到一个我看到硬崩溃的主板。
到目前为止,我还没有担心内核可能随时只移动这些范围的物理内存位置(导致我的DMA卡将数据写入错误的位置)。
但是这个主板上的新崩溃现在让我质疑这个假设。
用__get_free_pages()分配的内核内存是否也可以随时由内核移动到不同的物理地址范围?
如果有的话,是否有任何内核工具来防止这些移动?