首页 > 其他分享 >xv6 lab9

xv6 lab9

时间:2024-12-09 20:20:35浏览次数:4  
标签:return addr ip ----------------- NINDIRECT dev xv6 lab9

比较简单的一项实验
大索引(bigfile):
xv6的单文件索引有13个,其中只有一个二级索引,文件最大块数目是256+12 = 268块。
现在要给文件索引改成一个二级带一个三级索引,最大块数目就是11+256+256*256 = 65803块,可以容纳下很大的文件了。
先在fs.h中进行相应的更改:

...

define FSMAGIC 0x10203040

define NDIRECT 11

define NDDIRECT 12

define NINDIRECT (BSIZE / sizeof(uint))

define NINDDIRECT NINDIRECT * NINDIRECT

define MAXFILE (NDIRECT + NINDIRECT + NINDDIRECT)

// On-disk inode structure
struct dinode {

...

再在bmap中进行修改,模仿bmap中原有的索引查找方式进行索引查询即可:

...
    brelse(bp);
    return addr;
  }
/*-----------------修改线-----------------*/
  bn -= NINDIRECT;
  if (bn < NINDDIRECT) {
    // doubly-indirect block
    if((addr = ip->addrs[NDDIRECT]) == 0)
      ip->addrs[NDDIRECT] = 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);
    }
    brelse(bp);
    cp = bread(ip->dev, addr);
    b = (uint*)cp->data;
    if((addr = b[bn % NINDIRECT]) == 0){
      b[bn % NINDIRECT] = addr = balloc(ip->dev);
      log_write(cp);
    }
    brelse(cp);
    return addr;
  }

/*-----------------修改线-----------------*/

  panic("bmap: out of range");
}
```cpp


这里因为bigfile太大了,make grade会超时但是单项测试是可以正常无阻塞通过的。

itrunc也类似

/-----------------修改线-----------------/
if(ip->addrs[NDDIRECT]){
bp = bread(ip->dev, ip->addrs[NDDIRECT]);
a = (uint)bp->data;
for(i = 0; i < NINDIRECT; i++){
// doubly-indirect block
if(a[i]) {
cp = bread(ip->dev, a[i]);
b = (uint
)cp->data;
for(j = 0; j < NINDIRECT; j++){
if(b[j])
bfree(ip->dev, b[j]);
}
brelse(cp);
bfree(ip->dev, a[i]);
}
}
brelse(bp);
bfree(ip->dev, ip->addrs[NDDIRECT]);
ip->addrs[NDDIRECT] = 0;
}

/-----------------修改线-----------------/
ip->size = 0;
iupdate(ip);


uint64
sys_symlink(void){
char target[MAXPATH], path[MAXPATH];
struct inode *ip;

if(argstr(0, target, MAXPATH) < 0 || argstr(1, path, MAXPATH) < 0)
return -1;

begin_op();
if((ip = create(path, T_SYMLINK, 0, 0)) == 0){
end_op();
return -1;
}
if(writei(ip, 0, (uint64)target, 0, strlen(target) + 1) <= 0)
panic("sys_symlink: writei");
iunlockput(ip);
end_op();
return 0;
}

symlink系统调用如上。

并在sys_open中进行相应的查询:

ilock(ip);

/-----------------修改线-----------------/
if (!(omode & O_NOFOLLOW)) {
int depth = 10;
for (; ip->type == T_SYMLINK && depth; depth--) {
if((ip->size > MAXPATH) || (readi(ip, 0, (uint64)path, 0, ip->size) != ip->size)){
iunlockput(ip);
end_op();
return -1;
}
iunlockput(ip);

    if((ip = namei(path)) == 0){
      end_op();
      return -1;
    }
    ilock(ip);
  }
  if(depth == 0) {
    iunlockput(ip);
    end_op();
    return -1;
  }
}

/-----------------修改线-----------------/
if (ip->type == T_DIR && omode != O_RDONLY){
iunlockput(ip);
end_op();
return -1;
}


运行OK。

标签:return,addr,ip,-----------------,NINDIRECT,dev,xv6,lab9
From: https://www.cnblogs.com/thaumaturge/p/18595976

相关文章

  • xv6 lab10: mmap
    实现两个功能:分别是mmap与munmap,将文件映射到内存当中,并为一个线程记录他管理的文件所在的页表目录。函数原型如下:char*mmap(char*addr,intlen,intprot,intflags,intfd,intoff);intmunmap(char*addr,intlen);其中mmap参数含义分别是映射地址(为0时由内核代......
  • 【xv6】xv6源码调试环境搭建
    1.xv6源代码下载gitclonehttps://github.com/ytcoode/xv6.git2.编译并在qemu中运行xv6镜像2.1安装qemusudoapt-getinstallqemu2.2编译并运行xv6将54行QEMU前面的#号注释掉然后直接在当前目录下执行makeqemu即可直接加载并运行xv6镜像手动运行:qemu-syste......
  • 操作系统入门系列-MIT6.828(操作系统工程)学习笔记(四)---- C语言与计算机架构(Programmin
    系列文章目录操作系统入门系列-MIT6.S081(操作系统)学习笔记(一)----操作系统介绍与接口示例操作系统入门系列-MIT6.828(操作系统工程)学习笔记(二)----课程实验环境搭建(wsl2+ubuntu+quem+xv6)操作系统入门系列-MIT6.828(操作系统工程)学习笔记(三)----xv6初探与实验一(Lab:Xv6and......
  • MIT6.S081 - Lab1: Xv6 and Unix utilities
    Part1:sleep实验要求与提示可以参考user/echo.c,user/grep.c和user/rm.c文件如果用户忘记传递参数,sleep应该打印一条错误消息命令行参数传递时为字符串,可以使用atoi函数将字符串转为数字使用系统调用sleep,有关实现sleep系统调用的内核代码参考kernel/sysproc.c(......
  • xv6代码执行流
    xv6代码执行流xv6executionflowCreated:2024-01-08T19:56+08:00Publish:2024-04-16T10:10+08:00Categories:OperatingSystem基于git://g.csail.mit.edu/xv6-labs-2020代码前置知识:编译原理,计算机组成poe.com:一个gpt网站一个方便的在线查看汇编网站:CompilerExpl......
  • [os]xv6系列学习计划
    选了个劳什子OS课,想着弥补一下本科的时候没写成uCore的遗憾,结果感觉是给自己纯纯找事情做了。开课的时候说是读xv6源码,结果后来发现是上课讲专题,作业读源码,然后写lab(结果还是judge),后来又多了看ostep的作业。只能说每周跟着把ostep重温一遍,同时把xv6的lab写了,然后写点笔记加强记忆......
  • Lab1:Xv6 and Unix utilities
    Sleep功能通过接受时间参数,调用system_call指令sleep实现该功能#include"kernel/types.h"#include"kernel/stat.h"#include"user/user.h"intmain(intargc,char*argv[]){ //sleeptime if(argc<2) { printf("error:notime\n"......
  • Book-Riscv-XV6-Chap1
    操作系统接口–阅读xv6-riscv-bookXv6的时钟周期:定时器芯片两次中断之间的时间xv6作为一个简单的操作系统,利用一个“内核kernel”向其他运行中的程序提供服务的特殊程序,这个内核相当于连接了硬件和运行程序。每一个正在运行的程序可以称为进程,都拥有子集的包含指令、数据、......
  • 【XV6】 mmap
    代码:https://github.com/JasenChao/xv6-labs.git文件映射到进程地址题目要求实现两个系统调用:mmap和munmap。主要功能就是将文件映射到进程的内存中。题目给出了mmap和munmap的声明:void*mmap(void*addr,size_tlen,intprot,intflags,intfd,off_toffset)......
  • 【XV6】 Xv6 and Unix utilities
    代码:https://github.com/JasenChao/xv6-labs.git运行xv6实验环境使用的是Ubuntu20.04,需要安装一些工具:sudoapt-getinstallgitbuild-essentialgdb-multiarchqemu-system-miscgcc-riscv64-linux-gnubinutils-riscv64-linux-gnu安装完成后验证qemu是否安装成功,成功的话......