操作系统学习笔记:Homework9: bigger files for xv6
来源:互联网 发布:申请网络试听许可证 编辑:程序博客网 时间:2024/05/18 00:43
操作系统作业9:bigger files forxv6
1.首先,根据题目要求,将
CPUS := 1
QEMUEXTRA = -snapshot
这两行代码分别加入Makefile文件中的相应位置。
2.然后打开param.h,将
#define FSSIZE 1000
改为: #define FSSIZE 20000
3.然后下载big.c文件并放入xv6的文件夹,然后在makefile文件中的
UPROGS list中的最后加入对big的引用:
保存后运行xv6,输入big回车,显示140个blocks则至此,所有的准备工作完成。
4.首先了解inode
一个inode有12个direct指针,这个指针是直接指向硬盘中的文件块的,还有一个inderict指针,这个指针指向另外一个indirect block, 这个indirect block有128的新的指针,分别指向一个文件块。这样,一个inode就可以指向:12+128=140个文件块,这也解释了为什么运行big函数后显示140个block
在xv6,inode的定义是这样的:
接下来更改fs.c文件:(将其中的bmap函数改写)
bmap(structinode *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
相应的更改:
如果这个时候运行big,会显示138个block,原因出在:更改前的MAXFILE太小了,我们需要把它扩大:
保存后运行big,显示出来
注:16523 = 128*128(doubly-indirectblocks) + 11(singly-indirect blocks) + 128(directblocks)
- 操作系统学习笔记:Homework9: bigger files for xv6
- [OS] Bigger Files For Xv6
- 操作系统学习笔记:xv6 Barriers
- Unity3DGame学习笔记:粒子系统(homework9)
- XV6操作系统 学习笔记(源代码共9100行)
- ubuntu安装qemu+xv6进行操作系统学习
- 【xv6学习之第0章】操作系统接口
- xv6操作系统接口
- Xv6,MIT教学性操作系统
- 安装xv6笔记
- Xv6学习之kinit1
- 麻省理工大学XV6操作系统赏析(序言)
- XV6操作系统的安装与使用
- 操作系统页面管理机制的启动流程-xv6
- Java homework9
- 操作系统学习笔记:操作系统类型
- 操作系统学习笔记--操作系统基本概念
- 【xv6学习之HW1】shell
- Tomcat通过文件路径URL下载自动重命名文件
- STRUTS2标签中符号#,$,%的用法示例
- AngularJS不同版本下载途径
- java如何制作图片一样形状的按钮
- path sum iii-leetcode
- 操作系统学习笔记:Homework9: bigger files for xv6
- Java 网络编程(二) 两类传输协议:TCP UDP
- 第三十二讲项目6-输出星号棱形(6)
- 编译go源代码报import cycle not allowed
- fluentd结合kibana、elasticsearch实时搜索分析hadoop集群日志
- SVG 边框(stroke)
- shell 常用指令整理 RedHat配置文件 - linux
- WebService简单使用
- 【android开发】输入法弹出参数(windowSoftInputMode)分析