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

原创 2015年11月17日 21:15:48

作为内核的内存布局来源,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/

从硬件获得内存布局--e820

内核如何通过e820获得内存布局

【我所認知的BIOS】—>實模式&保護模式

【我所認知的BIOS】—>實模式&保護模式LightSeed      2009-6-17      回顧一下blog里的第一篇文章【我所認知的BIOS】—>ADU.EXE,http://blog.c...

TIME_WAIT是什么?

 在TCP断开的过程中会有四个状态变化过程,如下图所示:在连接撤销过程中,有如下过程:                                           1.HOST1上的应用程序关...

谁偷走了你的服务器性能——Strace & Ltrace篇

刚刚入行那会,看到有人在Linux下面用strace,看到满屏翻滚的屏幕打印,除了崇拜还是崇拜,现在如果你遇到性能问题求助别人,十有八九会建议你用 strace 挂上去看看,但是看到的依然是翻滚的屏幕...

[知其然不知其所以然-8] linux cpufreq的sysfs文件详细解释

cpufreq sysfs文件分析

[知其然不知其所以然-40] Why pm_parepare_console takes more than 200ms - swicth vt during suspend

using ftrace to optimize suspend/resume

[知其然不知其所以然-30] smp wakeup nonboot CPUs

how APs are wokenup in SMP.

[知其然不知其所以然-36] wakeup by pci devices

Sometimes we'd like to use pci device as our wakeup source, for example, it is very common to press ...

[知其然不知其所以然-4] 为什么我的Surface 3触摸屏不工作

其实不是我的触摸屏,是bugzilla上有人在问,为什么他Surface 3上的触摸屏不工作。然后根据dmesg看到启动时的一堆可疑告警信息: Sep 05 14:14:04 localhost k...

非常赞的文章!告诉你一个你知其然却不知其所以然的硅谷

本文分别从三个历史角度描述了硅谷所以能成为硅谷的科技、文化、金融方面的原因,以及硅谷所以得以可持续发展的深层原因,最后阐述了硅谷面临的挑战和机遇,以及为什么我们不应该也不能够复制出一个硅谷出来......
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[知其然不知其所以然-9] linux e820/efi memory map是如何初始化的
举报原因:
原因补充:

(最多只允许输入30个字)