代码:https://github.com/RedemptionC/xv6-riscv-6s081/tree/alloc
本实验并不需要实现一个allocator 主要做这两件事:
1.从实验指导书中我们了解到 在一开始的时候 xv6打开文件数是有限制的 最多为NFILE 因为他没有使用动态内存分配,而是静态定义了数组,所以首先要我们做的就是,让xv6使用buddy allocator来动态分配文件相关的数据结构,这一部分我们要修改的文件是file.c
2.这一部分我们需要优化给出的buddy allocator,在原始版本中,为每个block准备了一个alloc bit,为0,表示没有分配,为1,表示分配了,因为buddy allocator的特点,我们为每一对block使用一个bit,等于b1_is_free_xor_b2_is_free,这样下来,最终大概能节约1mb的空间
首先是第一部分:
首先注释掉静态定义的数组
struct {
struct spinlock lock;
// struct file file[NFILE];
} ftable;
// Allocate a file structure.
struct file*
filealloc(void)
{
struct file *f;
acquire(&ftable.lock);
f=bd_malloc(sizeof(struct file));
if(f){
f->ref=1;
release(&ftable.lock);
return f;
}
// for(f = ftable.file; f < ftable.file + NFILE; f++){
// if(f->ref == 0){
// f->ref = 1;
// release(&ftable.lock);
// return f;
// }
// }
release(&ftable.lock);
return 0;
}
// Close file f. (Decrement ref count, close when reaches 0.)
void
fileclose(struct file *f)
{
struct file ff;
acquire(&ftable.lock);
if(f->ref < 1)
panic("fileclose");
if(--f->ref > 0){
release(&ftable.lock);
return;
}
ff = *f;
f->ref = 0;
f->type = FD_NONE;
bd_free(f);
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);
}
}
然后修改fileclose和filealloc,前者中只需要在release前bd_free掉file
后者只需要在filealloc中,注释掉原来静态定义时用来初始化file的循环,然后用bd_malloc为file申请内存,并且初始化(ref为1),然后release并返回即可