我一直在研究操作系统的概念,并决定看看这些东西实际上是如何在Linux中实现的。但是,在启动page_allocator之前,我无法理解与启动过程中的内存管理相关的一些事情,更准确地说,是如何bootmem工作的。我不需要它的确切工作原理,只需要了解一些事情是如何解决的。
显然,bootmem不能使用动态内存,这意味着在运行前必须知道其大小,因此可以采取适当的步骤,即必须事先知道其位图的最大大小。据我所知,这很可能是通过在内核初始化期间简单地映射足够的内存来解决的,如果体系结构发生变化,只需更改映射内存的大小。很明显,可能还有很多事情要做,但我想我知道了吗?然而,真正对我没有意义的是努玛建筑。无论我读到哪里,它都会告诉我为每个内存节点创建pg_data_t。这个pg_data被放入一个列表中(它如何知道列表的大小?或者是特定拱门的固定尺寸?)为每个节点分配位图。所以,基本上,听起来它可以创建未定义数量的pg_data,每个bootmem都有其任意大小的内存位图。怎样?我错过了什么?
编辑:很抱歉没有包含参考。这里是mm/bootmem.c代码,也可以在中找到:http://lxr.free-electrons.com/source/mm/bootmem.c

最佳答案

它依赖于体系结构。在x86体系结构中,在启动过程的早期,内核会发出一个BIOS调用,即中断向量trap的0xe820函数。这将返回一个内存映射,内核可以使用它来构建它的内存表,包括用于非内存(PCI或ISA)设备的孔等。引导加载程序(在内核之前)也会这样做。
见:Detecting Memory

07-27 14:04