关闭

[知其然不知其所以然-9] linux e820/efi memory map是如何初始化的

2136人阅读 评论(0) 收藏 举报

作为内核的内存布局来源,BIOS提供了两套内存布局信息,第一个是legacy启动时提供的e820 memory map,另一个是

efi启动时提供的efi memory map。

在继续之前,我们需要知道,x86启动的顺序是,BIOS,grub,real mode,protect mode

其中,real mode是进入内核前的最后一步,在这个模式下,会根据系统是legacy还是efi启动,

获取到不同的memory map信息。


首先对于legacy模式,有可能是grub,也可能是real mode代码,根据BIOS提供的接口,获取

到内存信息,保存到boot_params结构体。(见Zero-page.txt)

real mode获取内存布局的代码在:

arch\x86\boot/memory.c的detect_memory_e820函数,用BIOS提供的int service,循环执行

intcall(0x15, &ireg, &oreg);,获取所有的e820 map信息,保存到boot_params.e820_map。


对于efi启动方式,realmode下,则可能是arch/x86/boot/compressed/eboot.c里,

exit_boot时,调用efi提供的system table->get_memory_map,获取到内存布局信息,

再赋值给boot_params.efi_info。


进入protect模式后,

void __init setup_arch(char **cmdline_p)
{
        setup_memory_map();
	if (efi_enabled(EFI_BOOT))
		efi_init();

}


有了boot_params后,相关的内存布局初始化setup_memory_map:

该函数通过default_machine_specific_memory_setup,

先在sanitize_e820_map函数里,把boot_params.e820_map去重排序,再通过

append_e820_map加到全局变量数据e820_map里。接着e820_print_map

会打印这个e820 map的内存布局,也就是我们看到的:

[    0.000000] e820: BIOS-provided physical RAM map:
[    0.000000] BIOS-e820: [mem 0x0000000000000000-0x0000000000057fff] usable
[    0.000000] BIOS-e820: [mem 0x0000000000058000-0x0000000000058fff] reserved
[    0.000000] BIOS-e820: [mem 0x0000000000059000-0x000000000009dfff] usable

注意,以上只对legacy有效,因为他检查的是e820_map,对于efi模式,e820_map是空指针。

再看efi内存布局初始化,还是在setup_arch里:

	if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
		     EFI32_LOADER_SIGNATURE, 4)) {
		set_bit(EFI_BOOT, &efi.flags);
	} else if (!strncmp((char *)&boot_params.efi_info.efi_loader_signature,
		     EFI64_LOADER_SIGNATURE, 4)) {
		set_bit(EFI_BOOT, &efi.flags);
		set_bit(EFI_64BIT, &efi.flags);
	}

	if (efi_enabled(EFI_BOOT))
		efi_memblock_x86_reserve_range();

	if (efi_enabled(EFI_BOOT))
		efi_init();
如果boot_params里有efi标志,那么就根据boot_params.efi_memmap获取efi的分区信息,

最后,还是通过e820_add_region加入到e820 table里去。具体流程是:

efi_init -> efi_memmap_init -> do_add_efi_memmap -> e820_add_region


To be more specific, I found a hibernation error which complains of:



A very good summary of efi linux at:

https://lwn.net/Articles/632528/

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:168124次
    • 积分:2776
    • 等级:
    • 排名:第13492名
    • 原创:101篇
    • 转载:15篇
    • 译文:1篇
    • 评论:38条
    最新评论