Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3843176
  • 博文数量: 146
  • 博客积分: 3918
  • 博客等级: 少校
  • 技术积分: 8584
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-17 13:52
个人简介

个人微薄: weibo.com/manuscola

文章分类

全部博文(146)

文章存档

2016年(3)

2015年(2)

2014年(5)

2013年(42)

2012年(31)

2011年(58)

2010年(5)

分类: LINUX

2011-05-09 22:58:14

   typedef struct bootmem_data {
      unsigned long node_boot_start;
      unsigned long node_low_pfn;
      void *node_bootmem_map;
      unsigned long last_offset;
      unsigned long last_pos;
  } bootmem_data_t;


min_low_pfn      :   计算系统可用的最小页帧号 PFN

max_low_pfn      :  低端内存区域 ZONE_NORMAL的最高页帧号

highstart_pfn    :  高端内存区域的起始页帧号

highend_pfn      :高端内存区的最后一个页帧号

max_pfn          : 系统的最后一个页帧号

------------------------------------------------------------
 
函数   find_max_low_pfn

MAXMEM_PFN  PFN_DOWN(MAXMEM)

其中MAXMEM是 896M  =1G- 128M 

所以MAXMEM_PFN = 896M/4K  - 224K 

 I  内存大于896M

如果可用的内存大于 896M
highmem_pages =  max_pfn - MAXMEM_PFN 。即从224K页---最高页属于 高端内存

II内存小于896M

highmem_pages = 0,没有高端内存页
max_low_pfn = max_pfn  

------------------------------------------------------------

 
highend_pfn = max_pfn   //
如果存在高端内存,即总内存数大于896M
highstart_pfn = max_low_pfn;

-----------------------------------init_bootmem-------------



PFN_PHYS(min_low_pfn) ---->将最低页帧 转化成 物理地址  ,等效于  min_low_pfn*4K

phys_to_virt----->再将物理地址转换成虚拟地址,       + PAGE_OFFSET  即物理地址 加3G
 
bdata->node_bootmem_map = 上两步 转化出的地址

bdata->node_boot_start  = 0 

bdata->node_low_pfn = max_low_pfn    低端内存的最高页帧



 start_pfn = 0;
 end_pfn = max_low_pfn  

mapsize = ((end - start) + 7) / 8;
最后把 mapsize 调整成sizeof(long) 的整数倍

memset(bdata->node_bootmem_map, 0xff, mapsize); //将位图每一位置
 
-------------------------------------------------------



阅读(1974) | 评论(0) | 转发(0) |
0

上一篇:二项堆

下一篇:启动时内存管理之API函数

给主人留下些什么吧!~~