最近,我正在研究ARM Linux内核,我需要将HighMem区域拆分为两部分。所以我在内核中添加了一个新区域,让我们说#B; NewMem"。因此,我的系统中有三个区域,分别是Normal,NewMem和HighMem。 NewMem区域的大小为512MB(总共131072页)。我的建议是我想以自己的方式管理NewMem区域中的所有页面框架,目前我使用双向链表来分配/解除分配页面。请注意,NewMem区域的伙伴系统仍然存在,但我不使用它。为达到这个。我修改了页面分配例程,以确保内核无法从我的区域分配任何页面框架。
我担心的是我可以使用该区域中的所有页面框架,因为建议每个区域都与mem_map []数组的子集有关。我发现在NewMem区域中只有131084页是免费的。因此,我的区域中的某些页面框架可能用于存储mem_map [],将数据写入这些页面可能会导致不可预测的错误。那么有没有办法找出哪个页面框架用于存储mem_map [],这样我就可以避免重写它。
答案 0 :(得分:0)
您必须检查物理和虚拟内存的分解。通常b
存储在虚拟内存的第一个 mappable 地址中。在Unix中,通常为8MB的内核映像存储在使用虚拟地址mem_map
访问的 1MiB 的物理地址处。 8MiB 在虚拟内存中保留用于内核映像。然后是PAGE_OFFSET + 0x00100000
的 16 MiB 。因此,内核可用于映射的第一个地址是zone_dma
。哪个应该包含0xC1000000
数组。
我不熟悉ARM内存崩溃,但从你的帖子中可以看出,至少在你的情况下没有mem_map
。所以,最好的办法是地址zone_dma
存储0xC0800000
。我假设内核映像 8MB 。
如上所述,通常第一个 mappable 虚拟地址存储mem_map
。您可以使用内核映像的大小和位置计算该地址,并mem_map
(是否存在)
请提供您的反馈意见。