找出mem_map [] array

时间:2015-11-07 14:35:08

标签: linux memory-management kernel

最近,我正在研究ARM Linux内核,我需要将HighMem区域拆分为两部分。所以我在内核中添加了一个新区域,让我们说#B; NewMem"。因此,我的系统中有三个区域,分别是Normal,NewMem和HighMem。 NewMem区域的大小为512MB(总共131072页)。我的建议是我想以自己的方式管理NewMem区域中的所有页面框架,目前我使用双向链表来分配/解除分配页面。请注意,NewMem区域的伙伴系统仍然存在,但我不使用它。为达到这个。我修改了页面分配例程,以确保内核无法从我的区域分配任何页面框架。

我担心的是我可以使用该区域中的所有页面框架,因为建议每个区域都与mem_map []数组的子集有关。我发现在NewMem区域中只有131084页是免费的。因此,我的区域中的某些页面框架可能用于存储mem_map [],将数据写入这些页面可能会导致不可预测的错误。那么有没有办法找出哪个页面框架用于存储mem_map [],这样我就可以避免重写它。

1 个答案:

答案 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(是否存在) 请提供您的反馈意见。