copy_e820_map() 函数

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);


 


你可能感兴趣的:(图形)