6.s081 Lab:Allocator for xv6

Lab:Allocator for xv6

1.实验目的

我们用一个buddy allocator替换了xv6内核中的页面allocator。我们需要修改xv6以使用这个allocator来分配和释放文件结构,这样xv6可以拥有比现有系统范围的限制NFILE更多的打开文件描述符。此外,还要实现一个优化,以减少buddy对内存的使用。

2.实验内容

1)修改kernel/file.c以使用buddy分配器,使文件结构的数量受内存而不是NFILE的限制。
2)buddy allocator空间效率低。alloc数组对每个块的大小都有一个位。有一个巧妙的优化,可以将每对块的成本降低到一位。对于块B1和B2的伙伴对,这个单位是B1_is_free XOR B1_is_free。每次分配或释放块时,都要翻转位以反映更改。例如,如果分配了B1和B2,则位将为零,如果B1被释放,则位将变为1。如果位是1而B2被释放,那么我们知道B1和B2应该合并。当xv6使用buddy allocator处理xv6必须管理的大约128mbyte的空闲内存时,每个块节省1/2位很重要:这种优化可以节省大约1mb的内存。

3.实验步骤(要细化如何实现的思路或流程图)

1)首先先切换分支,进入alloc中。

图 1 切换分支

2)实验说得非常清楚,在本次实验中,我们只需要修改两个文件:kernel/buddy.c and kernel/file.c.
3)根据任务需要,我们先修改kernel/file.c,使其不再受限于NFILE的大小。

图 2 修改结构体,删除NFILE

4)然后根据提示,用bd_alloc修改filealloc,注意函数的注释说了,分配一个文件结构,所以只申请一个。同时,使用bd_free修改fileclose,释放内存。

图 3  修改分配内存部分函数
图 4  修改释放内存部分函数

5)关键部分的修改不在于file.c,而是buddy.c,首先我们要来理解一下buddy allocator管理的内存布局,通过观察bd_init()我们可以看到其初始化的内存空间是[base,end)的,不过从base到某一处是被标记为allocated的,这部分存储的是元数据(先后顺序是sz_info、alloc数组、split数组),实际上还有一点是unavailable,但内核提供内存区域的长度也很可能不是正好 2^k 次方的,故需要把这些区域标记为allocated。同时这些区域对应的 buddy 可能需要被加入free_list。

图 5  allocated

6)所谓不同size class就是对同一块内存按照不同的size进行划分,并且划分区域甚至可能覆盖到元数据部分,但是这样就出错了,所以我们要将元数据对应的块alloc元素全部标为1,就是不能被修改了。
7)搞清楚内存管理以后,根据题意我们要为每两个alloc才使用一个bit存储,所以将全部的set alloc的都改为flip alloc。

图 6  flip

8)同时还对应修改了一些其他函数。

图 7  bd_mark函数
图 8  bd_init函数

9)修改完毕后进行测试,与指导书相同,成功。

图 9  alloctest测试
图 10  usertests

4.实验结论与心得体会

通过本次实验,了解了一种节省存储空间的方式——buddy,这种数据结构的想法是我所想不到的,搜寻资料学习分析,实践代码的过程令我受益匪浅,也让我对Unix类型操作系统的理解更加深入了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值