我正在尝试将U-Space分配的虚拟内存(shm)映射到特定的DIMM。 我成功地使用 get_user_pages_remote 作为指向vmemory的开始指针检索了pfns,然后使用 page_to_pfn 将每个 page 结构转换为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(dmidecode -t内存)中检索系统驻留的DIMM属性,但是我无法将这两个信息源链接在一起并最终映射了页面。
任何建议将不胜感激。
谢谢
Y。
答案 0 :(得分:1)
您真正要问的是将物理地址映射到DRAM。通常,没有单个答案,并且在给定的系统上,可能没有特定的地址位。您将需要了解内存的几何形状以及内存控制器的配置方式。在Linux上,有decode-dimms可以通过SPD协议查询DRAM芯片本身,并且可以告诉您一些有关存储器几何结构的信息,而不是有关物理到DRAM地址映射或其配置的信息。您的内存控制器可能会加扰地址位,以实现更多的并行度并避免存储区抖动。你必须进入杂草。
TLB隐藏了虚拟到物理映射的复杂性,而DRAM内存控制器隐藏了物理到DRAM映射的复杂性。 (而且您可能认为物理就是物理!)您需要了解有关物理到DRAM地址映射以及内存控制器的详细信息,尤其是BIOS如何对其进行配置。 A good tutorial on physical to DRAM address mapping。 Another using a particular Sandy Bridge system. A sample Micron data sheet。您需要查看系统的启动逻辑,因为它将设置内存控制器。我不知道是否有一种方法可以查询内存控制器的配置。操作系统可能不会修改该配置,而是会相信BIOS做正确的事。有可能凭经验确定这些事情。 RowHammer论文将是一个不错的选择。