Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux kernel DMA和内核模式内存分配的可移动性_Linux Kernel_Dma - Fatal编程技术网

Linux kernel DMA和内核模式内存分配的可移动性

Linux kernel DMA和内核模式内存分配的可移动性,linux-kernel,dma,Linux Kernel,Dma,当然,在一般情况下,用户模式分配背后的物理内存(例如malloc()返回的指针)很可能会根据内核的判断移动到不同的物理地址(例如,如果内存被交换到磁盘,然后被调用到其他物理内存段)。但是,用户模式代码不会受到影响,因为在这些情况下,内核将更新页表以指向新位置,而不会更改用户使用的虚拟地址 如果这个(可能是不连续的)物理内存是一些DMA的目标,那么就有用户模式mlock()和munlock()调用来防止这个内存被调出,并且您可以调用get_user_pages()等来获取要馈送到DMA硬件的物理地

当然,在一般情况下,用户模式分配背后的物理内存(例如malloc()返回的指针)很可能会根据内核的判断移动到不同的物理地址(例如,如果内存被交换到磁盘,然后被调用到其他物理内存段)。但是,用户模式代码不会受到影响,因为在这些情况下,内核将更新页表以指向新位置,而不会更改用户使用的虚拟地址

如果这个(可能是不连续的)物理内存是一些DMA的目标,那么就有用户模式mlock()和munlock()调用来防止这个内存被调出,并且您可以调用get_user_pages()等来获取要馈送到DMA硬件的物理地址,等等。这一切都很好,但这不是我的情况

相反,我做了一些内核模式分配(使用uu get_free_pages())来获得物理上连续的内存,因为我们基于PCIe卡的DMA引擎不支持分散-聚集。所有这一切都正常工作了一段时间-直到我遇到一个主板,我看到硬崩溃

到目前为止,我并不担心内核可能在任何时候只是移动这些范围的物理内存位置(导致我的DMA卡将数据写入错误的位置)

但随着主板上新的崩溃,我开始质疑这个假设

内核是否可以随时将分配有uu get_free_pages()的内核内存移动到不同的物理地址范围


如果是这样的话,是否有任何内核功能可以阻止这些移动?

这怎么可能?您已经分配了具体的页面,它们与物理RAM的具体区域相关。这个页面一直是这个页面。崩溃有不同的原因。