- 论坛徽章:
- 0
|
本帖最后由 s200661524 于 2011-09-27 10:42 编辑
回复 4# unbutun
呵呵,谢谢你,图片上就是我的问题,某次释放的obj属于2^order个page页面中间的某一个page,现在释放这个obj,所以要找到它所对应的页面,准确的说是这2^order个page的第一个页面,因为需要修改该页面中的inuse参数,每释放一个obj,就要将其减1,而在这个数减到0之前该frampage是不会归还给buddy的,假如是第一次释放该framepage中的obj,显然不会有对buddy的操作,所以我问的问题应该还是跟buddy没有关系的,而且就算是该framepage中所有的obj释放玩了也不一定会归还到buddy吧,可能会挂在kmem_cache的kmem_cache_node的partial链表中缓存起来,以共下次分配,而且搜索算法中也提到过先看kmem_cache_cpu的freelist是否为空,如果不为空就在这个结构上分配,如果是就会去kmem_cache_node的partial链表上去找。再没有才会去buddy分配2^order个page物理页面。
另外你说的是对的,内存管理模块不会允许释放某一次申请的2^order个页面中单独的一个页面,但是我的问题也没有涉及到释放一个page(4K)大小的页面,只是释放一个obj(比如32byte)到它所属的framepage里面去并挂接到对应page结构的freelist链表上这个过程中有点疑惑。
在这里又有点疑惑了,假如有一次申请到了4个页面,编号为0,1,2,3,4。0号页面是这个framepage的第一个页面,采用0号页面的page结构来管理这次分配的4个页面。假如根据某次释放的obj地址算出该obj属于编号2的页面,那么这个obj是挂接到编号2的page结构的freelist上,还是通过编号2的page结构的firstpage成员找到编号0页面的page结构,然后挂接到0号page结构的freelist上呢?按照我的理解应该是挂接到0号page结构的freelist链表上,因为inuse成员(也就是该framepage总的obj个数,可以指示该framepage的所有obj是否释放完)只会在0号page结构中初始化,所以必须挂接到0号page上然后对inuse减1,不知道我的理解是不是对的。
谢谢你的回复! |
|