Linux 查找mem_map[]数组使用的页面

Linux 查找mem_map[]数组使用的页面,linux,memory-management,kernel,Linux,Memory Management,Kernel,最近,我正在研究ARM Linux内核,我需要将HighMem区域分为两部分。所以我在内核中添加了一个新区域,比如NewMem。因此,我的系统中有三个区域,它们是Normal、NewMem和HighMem。NewMem区域的大小为512MB,共131072页。我的建议是,我希望以自己的方式管理NewMem zone中的所有页面框架,目前我使用双链接列表来分配/取消分配页面。请注意,newmemzone的好友系统仍然存在,但我不使用它。为了实现这一点。我修改了页面分配例程,以确保内核不能从我的区域

最近,我正在研究ARM Linux内核,我需要将HighMem区域分为两部分。所以我在内核中添加了一个新区域,比如NewMem。因此,我的系统中有三个区域,它们是Normal、NewMem和HighMem。NewMem区域的大小为512MB,共131072页。我的建议是,我希望以自己的方式管理NewMem zone中的所有页面框架,目前我使用双链接列表来分配/取消分配页面。请注意,newmemzone的好友系统仍然存在,但我不使用它。为了实现这一点。我修改了页面分配例程,以确保内核不能从我的区域分配任何页面帧


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

您必须检查物理内存和虚拟内存的故障。通常,mem_映射存储在虚拟内存的第一个可映射地址上。在Unix中,通常8MB的内核映像存储在1MiB的物理地址,通过虚拟地址页_OFFSET+0x00100000访问。在虚拟内存中为内核映像保留8MiB。然后是zone_dma的16 MiB。所以内核可以用来映射的第一个地址是0xC1000000。它应该包含mem_map数组。 我不熟悉ARM内存故障,但从您的帖子中可以明显看出,至少在您的情况下,没有区域dma。所以您最好的选择是地址0xC0800000存储mem_map。我假设内核映像是8MB。 如上所述,通常第一个可映射的虚拟地址存储mem_map。您可以根据内核映像的大小和位置以及分区是否存在来计算该地址。 请带上你的反馈

有全局内存映射数组,所以它不会占用您的内存区域。