buddy系统 初级问题,大家指教

unbutun 2010-05-10 08:21:52
buddy 算法分为2^0 * 4k ~ 2^10 * 4k 11种页框链表,每个块的第一个页框的物理地址是该大小的整数倍。


以上是我从一个地方看到的,关于这个物理地址还有疑问,既然是大小的整数倍,如2^0*4k的地址是多少,而且2^0*4k的整数倍和2^1*4k的整数倍之间的内存还能用吗,要是用了不就把页框给我给覆盖了吗?要是不能用那么2^10*4k的整数倍那也太大了,内存里都是这个页框了,不用干别的了?



这个是他说错了,还是我理解错了,哪位高人来谈谈,谢谢了
...全文
94 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Linconglc 2010-05-22
  • 打赏
  • 举报
回复
在2.6.11版本及之前版本,有伙伴状态位图,可以通过1,0来判断这对伙伴是否都可用,可用则进行分配,所以每个物理页框的结构体要么在11个队列的其中一队列上,要么不在队列上,2^0*4k指的是块为1页框的队列,对应于free_area结构体,里面的list_head结构体用来串联页框指针区里空闲页框。
帅得不敢出门 2010-05-16
  • 打赏
  • 举报
回复
内存管理是这样的
节点pg_data_t 分成 几个管理区zone
管理区分成页框page

zone结构中成员 struct free_area free_area[MAX_ORDER]; 存放的是
好像是 各空闲页链表头(链表某结点为NULL 就结束了) 当从buddy申请时,就从这里查找符合的页框,然后从链表上删除,并反回首个申请的页框地址 这样就可以使用这个页框了,回收时按反着来,重新放上链表中就是了。
unbutun 2010-05-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zmlovelx 的回复:]
2^10*4K 可被分成2^n*4K(n<10)使用 而小的又空闲的也可以合并成一个大的
这些都是动态的 list可以随时变化,来满足不同的page需求
[/Quote]

如果把2^10*4K 可被分成2^n*4K(n<10)使用 或 小的又空闲的也可以合并成一个大的

是不是页框链表的位置不动,只是把那部分内存标记成2^n的分配,挂在链表上,这个标记是不是在页表的那个数据结构里有定义的。

以上我理解的对吗?


还有页框的链表是在2^10*4K 位置,那到哪结束呢,我如何知道这块内存不是页框了,我可以用了?
帅得不敢出门 2010-05-12
  • 打赏
  • 举报
回复
2^10*4K 可被分成2^n*4K(n<10)使用 而小的又空闲的也可以合并成一个大的
这些都是动态的 list可以随时变化,来满足不同的page需求
unbutun 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zmlovelx 的回复:]
buddy
这是为了尽量让申请的N个page是连续的
效率更高 管理起来也方便

不同2的次方分在不同的list中,就是说一个list中挂的都是相同大小的page组
2^0*4k(4k)的地址是 n*4K 这是算法决定的
2^0*4k的整数倍和2^1*4k的整数倍之间的内存还能用吗 可以用2^1*4k不就是8k么
那么前面2个4k分给2^0*4k,这样后面就可以分给2^0*4k,……
[/Quote]


要是不能用那么2^10*4k的整数倍那也太大了,内存里都是这个页框了,不用干别的了?
帅得不敢出门 2010-05-11
  • 打赏
  • 举报
回复
buddy
这是为了尽量让申请的N个page是连续的
效率更高 管理起来也方便

不同2的次方分在不同的list中,就是说一个list中挂的都是相同大小的page组
2^0*4k(4k)的地址是 n*4K 这是算法决定的
2^0*4k的整数倍和2^1*4k的整数倍之间的内存还能用吗 可以用2^1*4k不就是8k么
那么前面2个4k分给2^0*4k,这样后面就可以分给2^0*4k,而它的起始地址为8k,就是说2^m与2^n之间(m>n)可以分配给2^x(x<=n) 这样地址就满足了

unbutun 2010-05-11
  • 打赏
  • 举报
回复
自己顶
steptodream 2010-05-10
  • 打赏
  • 举报
回复
楼主问的问题都是高难度的

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧