首页 > 解决方案 > 将虚拟内存映射到 DRAM

问题描述

我正在尝试将 U-Space 分配的虚拟内存 (shm) 映射到特定的 DIMM。我成功地使用get_user_pages_remote检索 pfns作为指向 vmemory 的起始指针,然后使用 page_to_pfn 将每个页面结构转换为pfn (顺便说一句,这些 pfns 进一步用于为专有图像采集卡设备创建分散收集表并完美地完成工作)。但是,我没有找到一种方法来识别每个物理地址(pfn)来自哪个物理 DIMM(DRAM)。互联网搜索产生了一些 DRAM 地址映射方案,但所有这些方案都可以处理模块内部导航,即:行、列、组、通道和排名,所有前者都依赖于内存提供商架构,例如https://www.betriebssysteme.org/wp-content/uploads/2017/04/Hillenbrand.pdf。另一方面,深入研究 SMBIOS 规范https://www.dmtf.org/sites/default/files/standards/documents/DSP0134_2.7.1.pdf,可以从 /dev/mem 检索系统驻留 DIMM 属性(dmidecode - t 内存),但是我无法将这两个信息源链接在一起并最终映射页面。

任何建议将被认真考虑。

谢谢,

约尔。

标签: memory-managementlinux-kernelshared-memoryram

解决方案


您真正要问的是将物理地址映射到 DRAM。一般来说,没有单一的答案,在给定的系统上,可能没有特定的地址位。您需要了解内存几何结构以及内存控制器的配置方式。在 Linux 上,有decode-dimms将通过 SPD 协议查询 DRAM 芯片本身,它可能会告诉您有关内存几何的信息,但不会告诉您有关物理到 DRAM 地址映射或其配置的信息。您的内存控制器可能会打乱地址位以实现更高的并行性并避免 bank thrashing。你必须进入杂草。

TLB 隐藏了虚拟到物理映射的复杂性,而 DRAM 内存控制器隐藏了物理到 DRAM 映射的复杂性。(而且您可能认为物理意味着物理!)您需要了解更多关于物理到 DRAM 地址映射的一般信息,以及您的内存控制器以及 BIOS 如何配置它。关于物理到 DRAM 地址映射的好教程另一个使用特定的 Sandy Bridge 系统。 样品 Micron 数据表. 您需要查看系统的启动逻辑,因为它将设置内存控制器。我不知道是否有办法查询内存控制器的配置。操作系统可能不会触及该配置,而是相信 BIOS 做了正确的事情。可以凭经验确定这些事情。RowHammer 论文将是寻找它的好地方。


推荐阅读