操作系统原理作业(八):bigger files for xv6

实验步骤

修改Makefile文件:将CPUS的值设为1,,并添加如下语句。目的是加快xv6创建大文件时的qemu的运行速度:

修改param.h文件,将文件系统的最大数据块数设置为20000:

下载big.c文件放入xv6的目录下,并在Makefile文件中的UPROGS列表中增加对big命令的引用:

启动xv6,输入big命令,显示“wrote 140 sectors”,说明所有的准备工作已完成:

修改fs.c中的bmap()函数如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
static uint
bmap(struct inode *ip, uint bn)
{
uint addr, *a, *indirect, *double_indirect,indirect_idx, double_indirect_idx;
struct buf *bp, *bp2;
if(bn < NDIRECT){
if((addr = ip->addrs[bn]) == 0)
ip->addrs[bn] = addr =balloc(ip->dev);
return addr;
}
bn -= NDIRECT;
if(bn < NINDIRECT){
// Load indirect block, allocating ifnecessary.
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 < NINDIRECT*NINDIRECT) {
// Load first indirect block, allocating ifnecessary.
if((addr = ip->addrs[NDIRECT + 1]) == 0)
ip->addrs[NDIRECT + 1] = addr =balloc(ip->dev);
bp = bread(ip->dev, addr);
indirect = (uint *) bp->data;
indirect_idx = bn / NINDIRECT;
if ((addr = indirect[indirect_idx]) == 0) {
addr = indirect[indirect_idx] =balloc(ip->dev);
log_write(bp);
}
bp2 = bread(ip->dev, addr);
double_indirect = (uint *) bp2->data;
double_indirect_idx = bn % NINDIRECT;
if((addr = double_indirect[double_indirect_idx]) == 0) {
addr =double_indirect[double_indirect_idx] = balloc(ip->dev);
log_write(bp2);
}
brelse(bp2);
brelse(bp);
return addr;
}
panic("bmap: out of range");
}

打开fs.h文件,将NDIRECT的值改为11,对应的架构数据块地址的索引由加1变为加2,最后将MAXFILE修改成如下值:

保存后重新启动xv6,输入big命令,得到如下运行结果说明实验成功:

其中,16523 = 128*128(doubly-indirectblocks) + 11(singly-indirect blocks) + 128(directblocks)

坚持原创技术分享,您的支持将鼓励我继续创作!

热评文章