copy_e820_map() 函数
函数原型为:
static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
其主要操作为:
·如果物理内存区间小于 2 ,那肯定出错。因为 BIOS 至少和 RAM 属于不同的物理区间。
if (nr_map < 2)
return -1;
·从 BIOS 构成图中读出一项
do {
unsigned long long start = biosmap->addr;
unsigned long long size = biosmap->size;
unsigned long long end = start + size;
unsigned long type = biosmap->type;
·进行检查
/* Overflow in 64 bits? Ignore the memory map. */
if (start > end)
return -1;
· 一些 BIOS 把 640K ~ 1MB 之间的区间作为 RAM 来用,这是不符合常规的。因为从 0xA0000 开始的空间用于图形卡,因此,在内存构成图中要进行修正。如果一个区的起点在 0xA0000 以下,而终点在 1MB 之上,就要将这个区间拆开成两个区间,中间跳过从 0xA0000 到 1MB 边界之间的那一部分。
/*
* Some BIOSes claim RAM in the 640k - 1M region.
* Not right. Fix it up.
*/
if (type == E820_RAM) {
if (start < 0x100000ULL && end > 0xA0000ULL) {
//s1,s2 e1,e2 满足
if(start<0xA0000ULL)
add_memory_region(start,0xA0000ULL-start,type) //s1
if (end <= 0x100000ULL)//e1
continue;
start = 0x100000ULL;// e2
size = end - start;
}
}
add_memory_region(start, size, type);
} while (biosmap++,--nr_map);