L1nxy's Blog

This is a simple blog about tech and life

0%

MIT 6.828 Lab3

MIT 6.828 Lab3

前言

本Lab比较简单,重在理解代码,并且作业描述中都给出了解决方式,只要理解了代码,按着描述中的思路去解决即可。

解决

第一部分

第一部分主要是把buddy malloc应用到files.c里面去,很简单,把filealloc函数里的代码换成bd_malloc的实现即可,注意把bd_free里面要把各种使用的资源释放掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
// Allocate a file structure.
struct file *filealloc(void) {
acquire(&ftable.lock);
struct file *f = bd_malloc(sizeof(struct file));
if (f){
memset(f,0,sizeof(struct file));
f->ref = 1;
release(&ftable.lock);
return f;
}
release(&ftable.lock);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Close file f.  (Decrement ref count, close when reaches 0.)
void fileclose(struct file *f) {
acquire(&ftable.lock);
if (f->ref < 1)
panic("fileclose");
if (--f->ref > 0) {
release(&ftable.lock);
return;
}
struct file ff = *f;
f->ref = 0;
f->type = FD_NONE;
release(&ftable.lock);

if (ff.type == FD_PIPE) {
pipeclose(ff.pipe, ff.writable);
} else if (ff.type == FD_INODE || ff.type == FD_DEVICE) {
begin_op(ff.ip->dev);
iput(ff.ip);
end_op(ff.ip->dev);
}

bd_free(f);
}

第二部分

这部分主要是说把伙伴内存分配器给优化一下,按hint说的是每两个block的分配状态来共享同一个记录位,用异或来做状态转换。这里我们只要把有bit_setbit_isset换成我们自己写的bit_xorbit_get就行了。

特别要注意的是要在xv6有记录meta信息在内存中,然后我们要把除低位与高位之外的没有分配过的block加到free list里去。

实现:

具体实现