一般大家都比较了解内存分配的伙伴系统,但是你知道吗,当内核刚启动的时候,伙伴系统还没有准备好,是不能使用的。这个时候就有另一个简单的内存分配器–memblock。
看一眼历史
memblock也不是内核的原配,在memblock之前还有其他的初期内存分配器,比如bootmem。memblock是在2010年Yinghai提出的。有兴趣的可以看一下当时的邮件列表中的讨论。
而在代码中,应该是这个commit引入了memblock。
95f72d1ed41a66f1c1c29c24d479de81a0bea36f
可以看到,memblock以前叫lmb,而这个补丁只是改了下名字。
再具体的历史信息我也不是很清楚了,如果有更多好玩的信息,欢迎告诉我~
整体架构
memblock管理了两段区域:memblock.memory和memblock.reserved。
所有物理上可用的内存区域都会被添加到memblock.memory。而被分配或者被系统占用的区域则会添加到memblock.reserved。
注意: 被分配的内存空间并不会从memblock.memory区域中移除。
让我借用一张图来解释一下,这张图的原版在这个系列,也是我非常喜欢的一个内核探索的系列。
+---------------------------+ +---------------------------+
| memblock | | Array of the |
| _______________________ | | memblock_region |
| | memory | | | |
| | memblock_type |-|-->| [start1, end1) |
| |_______________________| | | |
| | | [start2, end2) |