[OS] Bigger Files For Xv6

来源:互联网 发布:sql 优化方面的书籍 编辑:程序博客网 时间:2024/06/08 15:40

首先下载Xv6的源码

➜  ~ git clone git://github.com/mit-pdos/xv6-public.gitCloning into 'xv6-public'...remote: Counting objects: 13900, done.remote: Total 13900 (delta 0), reused 0 (delta 0), pack-reused 13900Receiving objects: 100% (13900/13900), 17.07 MiB | 1.38 MiB/s, done.Resolving deltas: 100% (9459/9459), done.

目录结构如下:

➜  xv6-public git:(master) tree.├── BUGS├── LICENSE├── Makefile├── Notes├── README├── TRICKS├── asm.h├── bio.c├── bootasm.S├── bootmain.c├── buf.h├── cat.c├── console.c├── cuth├── date.h├── defs.h├── dot-bochsrc├── echo.c├── elf.h├── entry.S├── entryother.S├── exec.c├── fcntl.h├── file.c├── file.h├── forktest.c├── fs.c├── fs.h├── gdbutil├── grep.c├── ide.c├── init.c├── initcode.S├── ioapic.c├── kalloc.c├── kbd.c├── kbd.h├── kernel.ld├── kill.c├── lapic.c├── ln.c├── log.c├── ls.c├── main.c├── memide.c├── memlayout.h├── mkdir.c├── mkfs.c├── mmu.h├── mp.c├── mp.h├── param.h├── picirq.c├── pipe.c├── pr.pl├── printf.c├── printpcs├── proc.c├── proc.h├── rm.c├── runoff├── runoff.list├── runoff.spec├── runoff1├── sh.c├── show1├── sign.pl├── sleep1.p├── sleeplock.c├── sleeplock.h├── spinlock.c├── spinlock.h├── spinp├── stat.h├── stressfs.c├── string.c├── swtch.S├── symlink.patch├── syscall.c├── syscall.h├── sysfile.c├── sysproc.c├── toc.ftr├── toc.hdr├── trap.c├── trapasm.S├── traps.h├── types.h├── uart.c├── ulib.c├── umalloc.c├── user.h├── usertests.c├── usys.S├── vectors.pl├── vm.c├── wc.c├── x86.h└── zombie.c0 directories, 99 files

在Ubuntu下运行Xv6

在Linux下运行Xv6,需要安装qemu,在qemu中运行。([qemu使用指南]( User environments))

yuchunyu@Ubuntu-yuchunyu:~/Xv6$ sudo apt-get install qemu

进入Xv6目录,编译

yuchunyu@Ubuntu-yuchunyu:~$ cd Xv6/yuchunyu@Ubuntu-yuchunyu:~/Xv6$ makegcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pic -O -nostdinc -I. -c bootmain.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pic -nostdinc -I. -c bootasm.Sld -m    elf_i386 -N -e start -Ttext 0x7C00 -o bootblock.o bootasm.o bootmain.oobjdump -S bootblock.o > bootblock.asmobjcopy -S -O binary -j .text bootblock.o bootblock./sign.pl bootblockboot block is 444 bytes (max 510)gcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o bio.o bio.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o console.o console.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o exec.o exec.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o file.o file.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o fs.o fs.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o ide.o ide.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o ioapic.o ioapic.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o kalloc.o kalloc.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o kbd.o kbd.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o lapic.o lapic.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o log.o log.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o main.o main.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o mp.o mp.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o picirq.o picirq.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o pipe.o pipe.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o proc.o proc.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o sleeplock.o sleeplock.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o spinlock.o spinlock.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o string.o string.cgcc -m32 -gdwarf-2 -Wa,-divide   -c -o swtch.o swtch.Sgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o syscall.o syscall.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o sysfile.o sysfile.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o sysproc.o sysproc.cgcc -m32 -gdwarf-2 -Wa,-divide   -c -o trapasm.o trapasm.Sgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o trap.o trap.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o uart.o uart.cperl vectors.pl > vectors.Sgcc -m32 -gdwarf-2 -Wa,-divide   -c -o vectors.o vectors.Sgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o vm.o vm.cgcc -m32 -gdwarf-2 -Wa,-divide   -c -o entry.o entry.Sgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -fno-pic -nostdinc -I. -c entryother.Sld -m    elf_i386 -N -e start -Ttext 0x7000 -o bootblockother.o entryother.oobjcopy -S -O binary -j .text bootblockother.o entryotherobjdump -S bootblockother.o > entryother.asmgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector -nostdinc -I. -c initcode.Sld -m    elf_i386 -N -e start -Ttext 0 -o initcode.out initcode.oobjcopy -S -O binary initcode.out initcodeobjdump -S initcode.o > initcode.asmld -m    elf_i386 -T kernel.ld -o kernel entry.o bio.o console.o exec.o file.o fs.o ide.o ioapic.o kalloc.o kbd.o lapic.o log.o main.o mp.o picirq.o pipe.o proc.o sleeplock.o spinlock.o string.o swtch.o syscall.o sysfile.o sysproc.o trapasm.o trap.o uart.o vectors.o vm.o  -b binary initcode entryotherobjdump -S kernel > kernel.asmobjdump -t kernel | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kernel.symgcc -Werror -Wall -o mkfs mkfs.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o ulib.o ulib.cgcc -m32 -gdwarf-2 -Wa,-divide   -c -o usys.o usys.Sgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o printf.o printf.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o umalloc.o umalloc.cgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o cat.o cat.cld -m    elf_i386 -N -e main -Ttext 0 -o _cat cat.o ulib.o usys.o printf.o umalloc.oobjdump -S _cat > cat.asmobjdump -t _cat | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > cat.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o echo.o echo.cld -m    elf_i386 -N -e main -Ttext 0 -o _echo echo.o ulib.o usys.o printf.o umalloc.oobjdump -S _echo > echo.asmobjdump -t _echo | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > echo.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o forktest.o forktest.c# forktest has less library code linked in - needs to be small# in order to be able to max out the proc table.ld -m    elf_i386 -N -e main -Ttext 0 -o _forktest forktest.o ulib.o usys.oobjdump -S _forktest > forktest.asmgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o grep.o grep.cld -m    elf_i386 -N -e main -Ttext 0 -o _grep grep.o ulib.o usys.o printf.o umalloc.oobjdump -S _grep > grep.asmobjdump -t _grep | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > grep.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o init.o init.cld -m    elf_i386 -N -e main -Ttext 0 -o _init init.o ulib.o usys.o printf.o umalloc.oobjdump -S _init > init.asmobjdump -t _init | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > init.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o kill.o kill.cld -m    elf_i386 -N -e main -Ttext 0 -o _kill kill.o ulib.o usys.o printf.o umalloc.oobjdump -S _kill > kill.asmobjdump -t _kill | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > kill.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o ln.o ln.cld -m    elf_i386 -N -e main -Ttext 0 -o _ln ln.o ulib.o usys.o printf.o umalloc.oobjdump -S _ln > ln.asmobjdump -t _ln | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > ln.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o ls.o ls.cld -m    elf_i386 -N -e main -Ttext 0 -o _ls ls.o ulib.o usys.o printf.o umalloc.oobjdump -S _ls > ls.asmobjdump -t _ls | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > ls.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o mkdir.o mkdir.cld -m    elf_i386 -N -e main -Ttext 0 -o _mkdir mkdir.o ulib.o usys.o printf.o umalloc.oobjdump -S _mkdir > mkdir.asmobjdump -t _mkdir | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > mkdir.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o rm.o rm.cld -m    elf_i386 -N -e main -Ttext 0 -o _rm rm.o ulib.o usys.o printf.o umalloc.oobjdump -S _rm > rm.asmobjdump -t _rm | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > rm.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o sh.o sh.cld -m    elf_i386 -N -e main -Ttext 0 -o _sh sh.o ulib.o usys.o printf.o umalloc.oobjdump -S _sh > sh.asmobjdump -t _sh | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > sh.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o stressfs.o stressfs.cld -m    elf_i386 -N -e main -Ttext 0 -o _stressfs stressfs.o ulib.o usys.o printf.o umalloc.oobjdump -S _stressfs > stressfs.asmobjdump -t _stressfs | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > stressfs.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o usertests.o usertests.cld -m    elf_i386 -N -e main -Ttext 0 -o _usertests usertests.o ulib.o usys.o printf.o umalloc.oobjdump -S _usertests > usertests.asmobjdump -t _usertests | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > usertests.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o wc.o wc.cld -m    elf_i386 -N -e main -Ttext 0 -o _wc wc.o ulib.o usys.o printf.o umalloc.oobjdump -S _wc > wc.asmobjdump -t _wc | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > wc.symgcc -fno-pic -static -fno-builtin -fno-strict-aliasing -O2 -Wall -MD -ggdb -m32 -Werror -fno-omit-frame-pointer -fno-stack-protector   -c -o zombie.o zombie.cld -m    elf_i386 -N -e main -Ttext 0 -o _zombie zombie.o ulib.o usys.o printf.o umalloc.oobjdump -S _zombie > zombie.asmobjdump -t _zombie | sed '1,/SYMBOL TABLE/d; s/ .* / /; /^$/d' > zombie.sym./mkfs fs.img README _cat _echo _forktest _grep _init _kill _ln _ls _mkdir _rm _sh _stressfs _usertests _wc _zombie nmeta 59 (boot, super, log blocks 30 inode blocks 26, bitmap blocks 1) blocks 941 total 1000balloc: first 567 blocks have been allocatedballoc: write bitmap block at sector 58dd if=/dev/zero of=xv6.img count=10000记录了10000+0 的读入记录了10000+0 的写出5120000 bytes (5.1 MB, 4.9 MiB) copied, 0.0263045 s, 195 MB/sdd if=bootblock of=xv6.img conv=notrunc记录了1+0 的读入记录了1+0 的写出512 bytes copied, 0.000304086 s, 1.7 MB/sdd if=kernel of=xv6.img seek=1 conv=notrunc记录了333+1 的读入记录了333+1 的写出170848 bytes (171 kB, 167 KiB) copied, 0.00172819 s, 98.9 MB/s

在qemu中运行

yuchunyu@Ubuntu-yuchunyu:~/Xv6$ qemu-system-i386 -serial mon:stdio -hdb fs.img xv6.img -smp 1 -m 512# 或者yuchunyu@Ubuntu-yuchunyu:~/Xv6$ qemu-system-x86_64 -smp 1 -parallel stdio -hdb fs.img xv6.img -m 512

没成功,报了个错误:

WARNING: Image format was not specified for 'fs.img' and probing guessed raw.         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.         Specify the 'raw' format explicitly to remove the restrictions.WARNING: Image format was not specified for 'xv6.img' and probing guessed raw.         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.         Specify the 'raw' format explicitly to remove the restrictions.Could not initialize SDL(No available video device) - exiting

可以看到最后一行,无法初始化SDL

因为我们是在命令行中运行的,无法使用qemu的可视化终端界面

所以,采用下面这条命令运行(如果在终端使用,可以不用make命令,直接使用下面这条命令编译并运行)

yuchunyu@Ubuntu-yuchunyu:~/Xv6$ make qemu-nox

运行成功,提示以下信息:

qemu-system-i386 -nographic -drive file=fs.img,index=1,media=disk,format=raw -drive file=xv6.img,index=0,media=disk,format=raw -smp 2 -m 512 xv6...cpu1: starting 1cpu0: starting 0sb: size 1000 nblocks 941 ninodes 200 nlog 30 logstart 2 inodestart 32 bmap start 58init: starting sh$

Target:bigger files for xv6

修改 Makefile

CPUS := 2修改为CPUS := 1

QEMUOPTS前添加QEMUEXTRA = -snapshot

os01

修改 param.h

#define FSSIZE 1000 // size of file system in blocks

修改为#define FSSIZE 20000 // size of file system in blocks

os02

添加 big.c
#include "types.h"#include "stat.h"#include "user.h"#include "fcntl.h"intmain(){  char buf[512];  int fd, i, sectors;  fd = open("big.file", O_CREATE | O_WRONLY);  if(fd < 0){    printf(2, "big: cannot open big.file for writing\n");    exit();  }  sectors = 0;  while(1){    *(int*)buf = sectors;    int cc = write(fd, buf, sizeof(buf));    if(cc <= 0)      break;    sectors++;    if (sectors % 100 == 0)        printf(2, ".");  }  printf(1, "\nwrote %d sectors\n", sectors);  close(fd);  fd = open("big.file", O_RDONLY);  if(fd < 0){    printf(2, "big: cannot re-open big.file for reading\n");    exit();  }  for(i = 0; i < sectors; i++){    int cc = read(fd, buf, sizeof(buf));    if(cc <= 0){      printf(2, "big: read error at sector %d\n", i);      exit();    }    if(*(int*)buf != i){      printf(2, "big: read the wrong data (%d) for sector %d\n",             *(int*)buf, i);      exit();    }  }  printf(1, "done; ok\n");   exit();}
修改 Makefile

UPROGS中添加一行_big\

os03

至此,可以在qemu中运行Xv6,然后输入命令big,会显示140个block。

$ big.wrote 140 sectorsdone; ok
inode 数据结构

在Xv6系统中,每一个文件都有一个对应的inode。inode数据结构的定义:

//-----fs.h-----// On-disk file system format.// Both the kernel and user programs use this header file.#define ROOTINO 1  // root i-number#define BSIZE 512  // block size...#define NDIRECT 12#define NINDIRECT (BSIZE / sizeof(uint))#define MAXFILE (NDIRECT + NINDIRECT)// On-disk inode structurestruct dinode {  short type;           // File type  short major;          // Major device number (T_DEV only)  short minor;          // Minor device number (T_DEV only)  short nlink;          // Number of links to inode in file system  uint size;            // Size of file (bytes)  uint addrs[NDIRECT+1];   // Data block addresses};
//-----fs.c-----// The content (data) associated with each inode is stored// in blocks on the disk. The first NDIRECT block numbers// are listed in ip->addrs[].  The next NINDIRECT blocks are// listed in block ip->addrs[NDIRECT]....  bn -= NDIRECT;  if(bn < NINDIRECT){    // Load indirect block, allocating if necessary.    if((addr = ip->addrs[NDIRECT]) == 0)...    bp = bread(ip->dev, ip->addrs[NDIRECT]);    a = (uint*)bp->data;    for(j = 0; j < NINDIRECT; j++){      if(a[j])        bfree(ip->dev, a[j]);

可以看出,一个inode有12个direct指针,它们指向磁盘中的数据块,还有一个indirect指针指向另一个indirect block,这个indirect有BSIZE / sizeof(uint) = 128个指针指向数据块。因此,一个inode可以指向12+128 = 140个数据块。也就是运行了big命令后输出的140 sectors

因此,接下来要做的就是:

修改 fs.c

修改bmap()函数

static uintbmap(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");}

os04
os05

修改 fs.h

#define NDIRECT 12

修改为#define NDIRECT 11

uint addrs[NDIRECT+1]; // Data block addresses

修改为uint addrs[NDIRECT+2]; // Data block addresses

#define MAXFILE (NDIRECT + NINDIRECT)

修改为#define MAXFILE (NDIRECT + NINDIRECT + NINDIRECT * NINDIRECT)

os06

重新编译运行 测试结果

编译好后,重新运行big命令

$ big..main-loop: WARNING: I/O thread spun for 1000 iterations...................................................................................................................................................................wrote 16523 sectorsdone; ok

可以看到block从140变成了16523,成功了。

PS:16523 = 128 ✖️ 128(doubly-indirectblocks) + 11(singly-indirect blocks) + 128(directblocks)

参考资料:

Homework: bigger files for xv6

操作系统学习笔记:Homework9: bigger files for xv6

xv6文件系统详解

原创粉丝点击