Linux 伙伴分配器如何确定在释放块时插入哪个大小顺序列表?

How does Linux buddy allocator determine which size order list to insert into when freeing block?

Linux 中使用的二进制伙伴分配器使用位图,其中每个位对应于一对伙伴块的状态(取自 this article)。并且 void free_page(void *addr) 调用不占用要释放的已分配块的大小。

我不明白这个算法如何在不知道其大小的情况下确定将要释放的块插入到哪个顺序列表中。假设我们分配了所有可用内存,因此所有位图都归零。现在我们用一些地址调用 free_page(),并不清楚应该将块插入到哪个列表中。

当然 free_page(void *addr) 或等效的 __free_page(struct page *page) 不需要第二个参数:它们的目的是仅释放 one 页,并且大小单个页面是已知的。在这种情况下,order 总是 0

释放页面块是通过 __free_pages(struct page *page, unsigned int order) 完成的,它确实将 order 作为第二个参数。