lab 9:Fs(file system)

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

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+1
### MIT xv6操作系统实验中Lab9文件系统的文档和指南 在MIT的xv6操作系统课程中,Lab 9专注于实现一个简单的日志结构化文件系统(log-structured file system, LFS)。这个实验室的目标是让学生理解并实践如何设计和实现一种高效的文件系统,这种文件系统通过将所有的写操作顺序记录在一个日志中来提高性能。 #### 实验目标 学生需要修改`fs.c`中的函数以支持LFS的功能。这涉及到重写磁盘分配逻辑以及引入新的机制来处理垃圾回收等问题[^1]。 #### 关键概念 - **Log Structured File System (LFS)**: 日志结构化的文件系统不覆盖已有的数据而是追加新版本到日志末端。 - **Segment**: 文件系统被划分为多个段(segment),每个段包含若干个连续的数据。 - **Checkpointing**: 定期保存当前状态的一个快照以便于恢复。 - **Garbage Collection**: 清理不再使用的旧版本数据以释放空间给未来的写入操作。 #### 主要任务 为了完成此实验,参与者通常会经历以下几个方面的工作: - 修改`balloc()` 和 `bread()` 函数使得它们能够管理基于日志的空间而不是传统的位图(bitmap)方式。 - 更新`iwrite()` 来确保每次更改都先记入日志再提交至最终位置。 - 设计并实施有效的垃圾收集算法用于清理过时的日志条目。 ```c // Example of modifying balloc to support log-based allocation. struct superblock { int size; // Number of blocks. int nblocks; // Total number of data blocks. int ninodes; // Number of inodes. }; int lfs_balloc(struct superblock *sb){ static uint next_block = 0; if(next_block >= sb->nblocks) panic("out of blocks"); struct buf* bp = bread(sb->size + next_block); next_block++; return bp->blockno; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值