原理:
bios探测到的内存段信息可能是以下的情况,内核需要重新整理内存段信息:
* Sample memory map (w/overlaps):
* ____22__________________
* ______________________4_
* ____1111________________
* _44_____________________
* 11111111________________
* ____________________33__
* ___________44___________
* __________33333_________
* ______________22________
* ___________________2222_
* _________111111111______
* _____________________11_
* _________________4______
*
整理后的内存段信息应该如下:
* Sanitized equivalent (no overlap):
* 1_______________________
* _44_____________________
* ___1____________________
* ____22__________________
* ______11________________
* _________1______________
* __________3_____________
* ___________44___________
* _____________33_________
* _______________2________
* ________________1_______
* _________________4______
* ___________________2____
* ____________________33__
* ______________________4_
所以sanitize_e820_map的主要功能还是内存段排序,还有就是对于重叠的内存段的处理如下:
111111---内存段类型1
333 ---内存段类型3
由于333的内存类型为3 大于内存类型1,所以覆盖后内存如下:
133311
//下面的函数只介绍核心的几个处理过程:
假设Bios探测到的内存信息如下:
333
1111111111111
22222222
int __init sanitize_e820_map(struct e820entry *biosmap, int max_nr_map,
u32 *pnr_map)
{
//记录内存段的改变点:即每个内存段的(开始地址:结束地址)
chgidx = 0;
for (i = 0; i < old_nr; i++) {
if (biosmap.size != 0) {
//开始地址
change_point[chgidx]->addr = biosmap.addr;