MIT6.828_HW10_Bigger file for xv6

2024-01-11 02:18
文章标签 file xv6 bigger mit6.828 hw10

本文主要是介绍MIT6.828_HW10_Bigger file for xv6,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MIT6.828_HW10_Bigger file for xv6

当前 xv6 文件大小限制在 140 个扇区。直接索引节点 12 个, 以及一个一级索引节点,其指向一个 sector,可包含 512/4 = 128个扇区。即总和为12+128 = 140个扇区。我们需要为xv6的文件节点添加一个二级索引节点,其包含128个一级索引节点的地址,每个一级索引节点又包含了128数据扇区。最终一个文件大小将增加到 16523 个扇区,大约8.5M。

The format of an on-disk inode is defined by struct dinode in fs.h. You’re particularly interested in NDIRECT, NINDIRECT, MAXFILE, and the addrs[] element of struct dinode. xv6 标准 inode 如下图所示。
inode 结构
在读写文件时,会调用 bmap()(in fs.c)。在写时,bmap 分配存储文件所需的 blocks并且如果需要存储块地址,还会分配一个 indirect block。

bmap() 处理两种页号. The bn argument is a “logical block” – a block number relative to the start of the file. The block numbers in ip->addrs[], and the argument to bread(), are disk block numbers. You can view bmap() as mapping a file’s logical block numbers into disk block numbers.

实现过程

修改 param.h 文件, 将 #define FSSIZE 1000改为

#define FSSIZE       20000

Download big.c into your xv6 directory, add it to the UPROGS list, start up xv6, and run big. It creates as big a file as xv6 will let it, and reports the resulting size. It should say 140 sectors.
做完预处理工作后运行big,应该有以下输出。

$ big
.
wrote 140 sectors
done; ok

You’ll have to have only 11 direct blocks, rather than 12, to make room for your new doubly-indirect block。 之所以这么 arrange, 可以避免我们修改 Inode 结点 addr数组的个数,索引结点总数依然是NDIRECT + 1。不过后来发现,修改NDIRECT,程序会更加清晰。即相应需要修改两处

// 1
#define NDIRECT 11
#define NINDIRECT (BSIZE / sizeof(uint))
// DOUBLE INDIRECT
#define NDINDIRECT (NINDIRECT * NINDIRECT)
#define MAXFILE (NDIRECT + NINDIRECT + NDINDIRECT)// 2
// in-memory copy of an inode
struct inode {...uint addrs[NDIRECT+ 2];
};// 3
// On-disk inode structure
struct dinode {short type;           // File type...          // Size of file (bytes)uint addrs[NDIRECT + 2];   // Data block addresses
};

buf 结构体。

struct buf {int flags;uint dev;uint blockno;struct sleeplock lock;uint refcnt;struct buf *prev; // LRU cache liststruct buf *next;struct buf *qnext; // disk queueuchar data[BSIZE];
};

最终实现代码并不难写出,仿照一级索引结点写法使用相应的函数调用。[Note]需要注意 brelse(bp)的时机。详细过程可以查看注释。

static uint
bmap(struct inode *ip, uint bn)
{uint addr, *a;struct buf *bp;struct buf *bp2;// 直接索引结点数目 bn= 0~10if(bn < NDIRECT){// 创建直接索引if((addr = ip->addrs[bn]) == 0)ip->addrs[bn] = addr = balloc(ip->dev);return addr;}bn -= NDIRECT;// #define NINDIRECT (BSIZE / sizeof(uint))  BSIZE = 512if(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;}bn -= NINDIRECT;// 二级索引if (bn < NDINDIRECT) {// 根结点if((addr = ip->addrs[NDIRECT+1]) == 0)ip->addrs[NDIRECT+1] = addr = balloc(ip->dev);bp = bread(ip->dev, addr);// 指向一级索引a = (uint *)bp->data;if ((addr = a[bn/NINDIRECT]) == 0) {a[bn/NINDIRECT] = addr = balloc(ip->dev);log_write(bp);}bp2 = bread(ip->dev, addr);// 二级页表a = (uint *)bp2->data;if ((addr = a[bn%NINDIRECT]) == 0) {a[bn%NINDIRECT] = addr = balloc(ip->dev);log_write(bp2);}brelse(bp2);brelse(bp);return addr;}panic("bmap: out of range");
}

这篇关于MIT6.828_HW10_Bigger file for xv6的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/592825

相关文章

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

解决Maven项目idea找不到本地仓库jar包问题以及使用mvn install:install-file

《解决Maven项目idea找不到本地仓库jar包问题以及使用mvninstall:install-file》:本文主要介绍解决Maven项目idea找不到本地仓库jar包问题以及使用mvnin... 目录Maven项目idea找不到本地仓库jar包以及使用mvn install:install-file基

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

解决JavaWeb-file.isDirectory()遇到的坑问题

《解决JavaWeb-file.isDirectory()遇到的坑问题》JavaWeb开发中,使用`file.isDirectory()`判断路径是否为文件夹时,需要特别注意:该方法只能判断已存在的文... 目录Jahttp://www.chinasem.cnvaWeb-file.isDirectory()遇

VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virtual disk”问题

《VMWare报错“指定的文件不是虚拟磁盘“或“Thefilespecifiedisnotavirtualdisk”问题》文章描述了如何修复VMware虚拟机中出现的“指定的文件不是虚拟... 目录VMWare报错“指定的文件不是虚拟磁盘“或“The file specified is not a virt

提示:Decompiled.class file,bytecode version如何解决

《提示:Decompiled.classfile,bytecodeversion如何解决》在处理Decompiled.classfile和bytecodeversion问题时,通过修改Maven配... 目录问题原因总结问题1、提示:Decompiled .class file,China编程 bytecode

Open a folder or workspace... (File -> Open Folder)

问题:vscode Open with Live Server 时 显示Open a folder or workspace... (File -> Open Folder)报错 解决:不可以单独打开文件1.html ; 需要在文件夹里打开 像这样

android java.io.IOException: open failed: ENOENT (No such file or directory)-api23+权限受权

问题描述 在安卓上,清单明明已经受权了读写文件权限,但偏偏就是创建不了目录和文件 调用mkdirs()总是返回false. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.READ_E

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu