看了一天的东西,记录一下。
B2 = B1 ^ (1 << O)
P = B & ~(1 << O)
公式一:通过在order(O)的页B1找到同在一个order的伙伴页。
公式二:通过页B(在O)找到在O+1的父亲。
例如在order 0,0页1页互为伙伴页。其父亲为order 1的0页。一次类推。
伙伴系统在分配的时候,如果该order空闲列表为空,通过将大块一分为二进行分配,左子加入空闲列表,右子继续划分或直接使用。
回收过程中,通过index = page_idx >> (order + 1)找到order+1级的父节点,利用其为1则向上合并。
上述描述中area对应map数组,对应两个块的位图。与下图中order一致。下图中order并不是实际代码中order。