这是因为如果把1号页面和2号页面当成伙伴关系, 那么0号页面就没有伙伴从而变成孤岛了.
那么给定一个 i 号内存页, 怎么找到他的伙伴内存页呢?...所以对于给定一个页面号为 i 的内存页, 他的伙伴内存页号可以使用以下的代码获得:
if (i & 1) {
buddy = i - 1
} else {
buddy = i + 1
}...也就是说在内核中, 最大能够申请到一个 29 个页面的内存块....个元素, 每个元素都是一个类型为 free_area_t 的结构体, free_area_t 结构的 free_list 字段用于连接有相同页面个数的内存块. map 字段是一个位图, 用于记录伙伴内存块的使用情况...说明一下, 这里计算位图的大小时为每个内存块申请了一个位, 但事实上每个位记录的是一对伙伴内存块的关系, 所以需要除以2, 而现在明显浪费了一半的内存. 在后面的Linux版本中改进了这个问题.