lab 9:Fs(file system)

本文档详细介绍了对XV6操作系统的Fs(文件系统)进行扩展,实现二级间接数据块以支持更大文件的存储,并且添加了软链接功能。通过修改bmap和itrunc函数,实现了二级间接数据块,使文件大小可达65803字节。同时,实现了sys_symlink系统调用来创建和处理软链接。在测试中,所有相关测试均通过,得分满分100/100。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lab 9:Fs(file system)

实验准备

通读第八章以及观看教学视频,理解目录与文件的组织方式,思考与阅读源码的实现方式。总的来说,本次作业难度不大,主要是对文件系统抽象的理解。

Large files

题目大意

为xv6实现一个二级间接数据块,使得文件大小为65803(原来为256+12),为此需要修改bmap和itrunc。

题目解答

这里由于有一个一级间接数据块可以参考,这里需要注意的是,bread对应一个brelse。同时,读完一个数据块需要释放,不能嵌套读取数据块。具体实现比较简单,注意一下细节即可。

static uint
bmap(struct inode *ip, uint bn)
{
   
  uint addr, *a;
  struct buf *bp;
// begin of DIRECT BLOCKS
  if(bn < NDIRECT){
   
    if((addr = ip->addrs[bn]) == 0)
      ip->addrs[bn] = addr = balloc(ip->dev);
    return addr;
  }
  // end of DIRECT BLOCKS
  bn -= NDIRECT;

  if(bn < NINDIRECT){
   
    // Load indirect block, allocating if necessary.
    if((addr = ip->addrs[NDIRECT]) == 0)
      ip->addrs[NDIRECT] = addr = balloc(ip->dev);
    bp = bread(ip->dev, addr);
    a = (uint*)bp->data;
    if((addr = a[bn]) == 0){
   
      a[bn] = addr = balloc(ip->dev);
      log_write(bp);
    }
    brelse(bp);
    return addr;
  }
  //panic("cannot reach!");
  bn-=NINDIRECT;
  uint b = bn/NINDIRECT;
  bn = bn-b*NINDIRECT;
  if(b < NINDIRECT){
   
	if((addr = ip->addrs[NDIRECT+1]) == 0){
   
		ip->addrs[NDIRECT
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值