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


 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值