⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fs.c

📁 用于汇编领域的,运用于OS的MAIN函数.基于硬件基础的源代码
💻 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 + -