Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424562
  • 博文数量: 205
  • 博客积分: 5630
  • 博客等级: 大校
  • 技术积分: 1945
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-06 20:28
文章分类

全部博文(205)

文章存档

2016年(1)

2015年(6)

2014年(9)

2013年(10)

2012年(53)

2011年(25)

2010年(87)

2009年(14)

分类: LINUX

2010-09-03 13:51:46

问题:比如我的有两个内存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。
阅读(546) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~