📄 fs.c
字号:
#include "fs.h"struct BitVect d_ibm; // disk inode bit map struct BitVect d_dbm; // disk datablock bit map struct DITable d_itable; // disk inode tablestruct BitVect ibm; // on-mem inode bit map struct BitVect dbm; // on-mem datablock bit map struct ITable itable; // on-mem inode tablestruct FBTable fbtable; // file block tablestruct FPTable fptable; // file ptr tablevoid init_d_ibm(){ // inode 0,1 are reserved BitVect_init(&d_ibm); // make all bits free first BitVect_set_bit(&d_ibm,0); // inode 0 is reserved BitVect_set_bit(&d_ibm,1); // inode 1 is reserved BitVect_set_bit(&d_ibm,2); // inode 2 is for root dir file }void init_d_dbm(){ BitVect_init(&d_dbm); // make all bits free first BitVect_set_bit(&d_dbm,0); // blk 0 for bootcode BitVect_set_bit(&d_dbm,1); // blk 1 for superblock BitVect_set_bit(&d_dbm,2); // blk 2 for ibm BitVect_set_bit(&d_dbm,3); // blk 3 for dbm BitVect_set_bit(&d_dbm,4); // blk 4 for inode table BitVect_set_bit(&d_dbm,5); // blk 5 for root dir }// functions for d_itablevoid init_d_itable(){// inode 0,1 is reserved. inode 2 is for root dir DITable_make_inode(2,5);}void test_fs(){ int x,y; char buf[20], buf1[20]; //x=do_creat("/f1"); //printk("aft do_creat /f1\n"); //for(;;); //do_write(x, "hello", 5); //printk("aft do_write\n"); //for(;;); y=do_open("/f1"); printk("aft do_open"); //for(;;); do_read(y,buf,5); printk("aft do_read"); //for(;;); buf[5]=0; printk("f1 is %s\n", buf); //for(;;); // x=do_mkdir("/d1"); // y=do_creat("/d1/f2"); // now test executable printk("now creating /p1\n"); x = do_creat("/p1"); // mov $0x4, %eax; write buf[0]=0xb8; buf[1]=0x04; buf[2]=0x0; buf[3]=0x0; buf[4]=0x0; // int $0x80 buf[5]=0xcd; buf[6]=0x80; // mov $0x1, %eax ; exit buf[7]=0xb8; buf[8]=0x01; buf[9]=0x0; buf[10]=0x0; buf[11]=0x0; // int $0x80 buf[12]=0xcd; buf[13]=0x80; buf[14]=0x0; // end of data do_write(x, buf, 15); // confirm y=do_open("/p1"); do_read(y,buf1,14); printk("/p1 is: "); for(x=0;x<14;x++) printk("%x ",buf1[x]);}// system functionsvoid init_fs(){ FPTable_init(); FBTable_init(); //printk("bef format_disk"); //for(;;); //format_disk(); //printk("aft format_disk\n"); //for(;;); mount_root_fs(); // test fs printk("aft mount_root\n"); //for(;;); test_fs();}void format_disk(){// format disk struct DirBlock rdir; printk("formatting...to start hit anykey\n"); wait_for_anykey(); init_d_ibm(); init_d_dbm(); init_d_itable(); DirBlk_set_empty(&rdir,2,2);//make an empty directory file block WriteRelativeSector(2, (char *)&d_ibm, (char *)&d_ibm); WriteRelativeSector(3, (char *)&d_dbm, (char *)&d_dbm); WriteRelativeSector(4, (char *)&d_itable, (char *)&d_itable); WriteRelativeSector(5, (char *)&rdir, (char *)&rdir); printk("aft writing. rdir is\n"); FB_dump((char *)&rdir);}void mount_root_fs(){// load ibm, dbm, itable from the disk char buf[512]; printk("insert root disk and hit any key\n"); wait_for_anykey(); ReadRelativeSector(2, (char *)&d_ibm, (char *)&d_ibm); ReadRelativeSector(3, (char *)&d_dbm, (char *)&d_dbm); ReadRelativeSector(4, (char *)&itable, (char *)&itable); ReadRelativeSector(5, (char *)buf, (char *)buf); FB_dump(buf); FBTable_retrieve_block_from_disk(5); printk("aft retrieval\n"); FBTable_dump_blk(5);}void flush_to_disk(){// write ibm, dbm, itable, and all file blocks back to disk. //for now call this whenever there is// a change in ibm,dbm,itable, or file blocks. printk("writing back to disk\n"); WriteRelativeSector(2, (char *)&d_ibm, (char *)&d_ibm); WriteRelativeSector(3, (char *)&d_dbm, (char *)&d_dbm); WriteRelativeSector(4, (char *)&itable, (char *)&itable); FBTable_flush_file_blocks();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -