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); //将位图每一位置
-------------------------------------------------------
阅读(2062) | 评论(0) | 转发(0) |