最近看了一下 xv6 的源码,它是用空闲链表来管理物理内存的,如果内核需要内存直接从这个链表上分。
然后去看了下 linux 的管理方式,是用 buddy system 来管理的,数组第 i 项存的是指向连续的 2^i 页(4K)的指针。然后在一个问题上卡住了:
buddy system 的设计和提出是为解决碎片问题的,可是什么情况下需要分配 i>=1(即连续2页或以上)的物理页呢?因为页表的存在,所以虚拟地址空间连续,物理地址完全可以是碎片啊,好像应用程序没有需要 n 个连续物理页的需求。
那为什么还需要 buddy system ?直接用链表管理好像没有额外的 overhead 吧?
现在想到的一个可能的应用场景是大页( HugePage ),需要分配连续的物理内存。
然后去看了下 linux 的管理方式,是用 buddy system 来管理的,数组第 i 项存的是指向连续的 2^i 页(4K)的指针。然后在一个问题上卡住了:
buddy system 的设计和提出是为解决碎片问题的,可是什么情况下需要分配 i>=1(即连续2页或以上)的物理页呢?因为页表的存在,所以虚拟地址空间连续,物理地址完全可以是碎片啊,好像应用程序没有需要 n 个连续物理页的需求。
那为什么还需要 buddy system ?直接用链表管理好像没有额外的 overhead 吧?
现在想到的一个可能的应用场景是大页( HugePage ),需要分配连续的物理内存。