buddy system
分配
释放
- __find_buddy_pfn,去寻找page对应的buddy pfn;
- 寻找的逻辑是 异或 (1 << order); 也就是对 (1 << order) 这一个bit做取反操作(和1异或相当于是取反),其余的bit(和0异或保持原值) 不变化;
- 由于互为buddy的page,必定是连续的,所以加上 pfn之间的偏移 就可以找到buddy page;
- 判断page是否符合要求
- order是否想等;
- 对应的zone是否相同;
- 不符合要求,直接反汇;符合要求则继续;
- 现在符合要求:将buddy page从链表删除,
- 计算起始pfn,起始page,order++ 继续寻找;
- 合并完之后,走到done_merging 将page的lru插入对应order的free_list中;