📄 d-super-block.c
字号:
//fsstruct d_super_block{};char d_ibm[512]; // handle 511 inodeschar d_dbm[512]; // handle 512 blocks. 1 block=512 bytestruct d_inode { // each inode has 32 bytes. long blk[8]; // max 8 blocks per file};struct d_inode d_itable[16]; // 16 inodes in inode table // but we don't use inode 0,1struct dir_ent{ // directory entry. 16 bytes per entry long ino: // 4 bytes for inode number char fname[12]; // 12 bytes for file name};struct dir_block{ // max 32 entry per dir file struct dir_ent entries[32];};// functions for ibmvoid init_d_ibm(){ d_ibm[0]=1; // we reserve inode 0 d_ibm[1]=1; // we reserve inode 1 }int get_free_inode(){// find free inode int i; for(i=0;i<512;i++) // if (d_ibm[i]==0) { return i; } panic("no more inode");}void set_inode_in_ibm(int x){ d_ibm[x]=1;}// functions for dbmvoid init_d_dbm(){// block 0: boot code, blk 1: super block, blk 2: ibm, blk 3: dbm// blk 4: inode table, blk 5: root dir d_dbm[0]=d_dbm[1]=d_dbm[2]=d_dbm[3]=d_dbm[4]=d_dbm[5]=1;}int get_free_block(){// find free block int i; for(i=0;i<512;i++) if (d_dbm[i]==0) { return i; } panic("no more block");}void set_block_in_dbm(int x){ d_dbm[x]=1;}// functions for directoryint get_free_dir_ent(struct dir_block *d){// get free entry in directory block d int i; for(i=0;i<32;i++) if (empty_dir_ent(&(d->entries[i]))) return i; panic("no more entry in dir_ent");}int empty_dir_ent(struct dir_ent *dent){ if (dent->ino==0) return 1; else return 0;}// functions for inodestruct d_inode init_root_inode(){ struct d_inode r; // root dir has . and .. whose inode is 2 both. r.blk[0]=5; return r;}// functions for d_itablevoid init_ditable(){// inode 0,1 is reserved. inode 2 is for root dir d_itable[2]=init_root_inode();}// functions for directorystruct dir_block make_empty_dir_block(int me, int parent){// make empty dir block. me is this dir's inode; parent its parent inode struct dir_block blk; strcpy(blk->entries[0].fname, "."); blk->entries[0].ino=me; strcpy(blk->entries[1].fname, ".."); blk->entries[1].ino=parent; return blk;}// system functions void format_disk(){// format disk struct dir_block rdir; wait_for_disk_insertion(); init_d_ibm(); init_d_dbm(); init_d_itable(); rdir=make_empty_dir_block(2,2); WriteRelativeSector(2, d_ibm, d_ibm); WriteRelativeSector(3, d_dbm, d_dbm); WriteRelativeSector(4, (char *)d_itable, (char *)d_itable); WriteRelativeSector(5, (char *)&rdir, (char *)&rdir);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -