【发布时间】:2019-08-12 19:04:56
【问题描述】:
我正在进行一项研究项目,该项目需要我从自定义硬件执行内存捕获。我正在使用 Zedboard SoC(带有 FPGA 结构的双核 ARM Cortex-A9)。我设计了一个设备驱动程序,允许我执行虚拟内存捕获和物理内存捕获(使用控制Xilinx AXI DMA IP 的 AXI4-Lite 外围设备)。
我的目标是捕获所有映射的页面,因此我检查 /proc/pid/maps 的映射区域,然后从 /proc/pid/pagemaps 获取 PFN,将物理地址传递给我的设备驱动程序,然后将它们传递给我的自定义硬件(它调用 Xilinx AXI DMA 从物理内存中获取内容)。
注意:我使用的是 Xilinx 的 PetaLinux 发行版,它基于 Linux 4.14 版构建。
我的设备驱动程序通过一系列 IOCTL 调用实现以下过程:
- 停止目标进程。
- 执行虚拟内存捕获(使用access_process_vm() 函数)。
- 刷新缓存(使用flush_user_range()函数)。
- 执行物理内存捕获。
- 恢复目标进程。
然而,我注意到的是,虚拟内存捕获和物理内存捕获在 [heap] 部分(这是扩展超过一页的第一部分)中不同。第一页匹配,但其他页面都没有接近。 [stack] 部分根本不匹配。我应该注意,对于前两个内存部分,.text 和 .rodata,捕获完全匹配。目前的结论是,在运行期间不改变的数据在虚拟和物理捕获之间匹配,而确实改变的数据 strong> 在运行时不匹配。
所以这让我想知道:我是否使用了正确的函数来确保缓存和 RAM 之间的一致性?如果不是,用于强制将缓存刷新到 RAM 的正确功能是什么?在目标进程停止时,RAM 中的数据必须是最新的,因为我无法从自定义硬件访问缓存。
编辑 1: 关于这个问题被标记为this question 的可能重复项,我正在使用已接受答案中的一个函数来启动缓存刷新。但是,从我的角度来看,它似乎无法正常工作,因为如果发生缓存刷新,物理内存与虚拟内存不匹配。
【问题讨论】:
-
听起来你想了解如何在 linux 中实现交换。
-
@Flavius 当我从 /proc/pid/pagemap 获取 PFN 时,我会检查每个页面的交换位以及当前位。我试图从物理内存中提取的每一页都声称存在并且没有交换。是否可以在我检查该位和启动物理内存传输之间交换内存?
标签: linux linux-device-driver xilinx zynq petalinux