问题:比如我的有两个内存bank0(物理地址范围2G-3G),bank1(物理地址范围3G-4G).现在在bank0上挂128M内存,bank2上挂128M内存,内核运行起来之后,在内核空间的,物理直接映射区是如何映射的?
回答:
这种情况需要在给你的硬件添加特殊的初始化代码,一般在
arch/xxx/mm/init.c
里面。修改page_init函数的初始化过程,使用CONFIG定义来控制初始化流程,比如,你的硬件叫做ABC123,你可以这么做
#if defined(CONFIG_DISCONTIGMEM) && \
(defined(CONFIG_ABC_123))
[snip]
zone_size[ZONE_DMA] = PFN_DONW(size_of_dma);
zone_size[ZONE_NORMAL] = PFN_DOWN(size_of_normal);
zone_size[ZONE_HIGHMEM] = PFN_DOWN(size_of_himem);
[snip]
以上代码是用来定义一个node里面各个zone的大小和分布,接着,给系统添加node,
free_area_init_node(0, NODE_DATA(0), zone_size, 0, 0);
这是添加第一个node,也就是你的第一个bank0,最后,用同样的方法为bank1定义
一个新的zone_size,采用free_area_init_node函数将bank1对应的node1也添加进
系统之中。比如
free_area_inti_node(1, NODE_DATA(1), zone_size,
PFN_DOWN(UPPER_RAM_BASE), 0);
对了,不要忘记
node_set_online(0);
node_set_online(1);
这样才能启用这两个node。
阅读(577) | 评论(0) | 转发(0) |