最近我在深入研究Linux的内存管理,因为我想为自己的玩具内核实现类似的功能,所以我希望熟悉细节的人能帮助我理解一件事情。显然,物理内存管理器是一个伙伴算法,进一步专门化为返回特定顺序(0到9,其中0只是一个单独的页面)的页面块。对于每个顺序,块都存储为链接列表。例如,如果请求顺序5的块但未在顺序5的块列表中找到,则算法会在顺序6中搜索块,将其分成两半,给出请求的一半并将另一半移动到更低的顺序(因为它的大小减半了)。
我不明白的是内核如何存储这些结构,或者内核如何为它们分配空间。因为对于顺序0的页面,您需要1M个条目(每个条目是4KiB的页面),这是否意味着内核分配了1MiB * sizeof(struct page)的空间?那么顺序1及以上的块呢?内核是否通过将它们标记为更高的顺序来重用已分配的块,并在需要将其分成两半时返回块并获取未使用的块?