xv6的文件限制为268个块,原因为一个inode中有一个addr[13]数组,其中前12个元素指向直接块,而最后一个数组指向一个一级间接块,这个一级间接块存储了256个块地址,所以一个文件最大大小为256+12块。
实验中要求实现二级间接块,也存储在addr[13]中,用于存储256个一级存储块的地址,这样一个文件的最大大小就增加到11+256+256*256块。
- bmap流程,根据访问的块号bn,小于11则为直接块,直接读取addr[bn],地址为0则先申请一个块;大于11则减去11,之后若小于256,则块位于一级间接块中,读取addr[12]的块到一个buf中,然后读取buf->data[bn],即所需的块地址,地址为0则先申请再返回;若大于256则减去256,通过块号是否小于256*256判断块是否位于二级间接块中,若小于则去二级间接块中寻找相应的一级间接块(bn/256),再在一级间接块中找到想要的块(bn%256),同样需要在块未申请的时候申请;
- itrunc释放块,遍历所有的块并释放,遍历方式参考bmap中查找块的方式。在使用每一个struct buf后要使用brelse释放。