📄 super.c
字号:
#include "../kernel.h"
#include "FileSystem.h"
//第0 块为引导扇区块
//第一块为超级块
//接下来是Inode位图
//再接下来是区段位图(一区段2个磁盘块)
//之后是Inode
//剩下就是Block
extern LPBuffer GetPhysicalBlock(int Block ,int Device);
extern void FreeBufferBlock(LPBuffer pFileBuffer);
#define HARD_DISK 0
Super glSuper;
PUBLIC LPSuper GetSuper()
{
return &glSuper;
}
PUBLIC LPSuper GetSuperFromDisk()
{
int i=0,j=0;
LPBuffer pBlock;
LPSuper pSuperBlock;
pBlock=GetPhysicalBlock(2 ,HARD_DISK);
pSuperBlock=(LPSuper)pBlock->Data;
glSuper.Magic=pSuperBlock->Magic;
glSuper.TotalInode=pSuperBlock->TotalInode;
glSuper.TotalFreeInode=pSuperBlock->TotalFreeInode;
glSuper.TotalBlock=pSuperBlock->TotalBlock;
glSuper.TotalFreeBlock=pSuperBlock->TotalFreeBlock;
glSuper.FirstFreeBlock=pSuperBlock->FirstFreeBlock;
glSuper.FirstFreeInode=pSuperBlock->FirstFreeInode;
}
PUBLIC void CreateFileSystem()
//建造文件系统,在磁盘上填写相关数据
{
LPBuffer pBlock;
LPSuper pSuperBlock;
int i=0,j=0;
pBlock=GetPhysicalBlock(2 ,HARD_DISK);
pSuperBlock=(LPSuper)pBlock->Data;
pSuperBlock->Magic=0x7654;
pSuperBlock->TotalInode=VIRTUAL_HD_SIZE/1024;
pSuperBlock->TotalFreeInode=VIRTUAL_HD_SIZE/1024;
pSuperBlock->TotalBlock=VIRTUAL_HD_SIZE/1024;
pSuperBlock->TotalFreeBlock=VIRTUAL_HD_SIZE/1024;
pSuperBlock->FirstFreeBlock=2+(VIRTUAL_HD_SIZE/1024/1024/8+1)*2+(VIRTUAL_HD_SIZE/1024/(1024/128));
pSuperBlock->FirstFreeInode=3;
//将剩余部分清零
for(j=SUPER_SIZE;j<1024;j++)
pBlock->Data[j]='j';
pBlock->Dirty=DIRTY;
FreeBufferBlock(pBlock);
pBlock=GetPhysicalBlock(1,HARD_DISK);
pSuperBlock=(LPSuper)pBlock->Data;
printk("%d\n",pSuperBlock->TotalInode);
//将Inode Bitmap,zone Bitmap,Inode本身清零
/* for(i=3;i<(VIRTUAL_HD_SIZE/1024/1024/8+1)*2+//Inode Bitmap+zone Bitmap
(VIRTUAL_HD_SIZE/1024/(1024/128));i++)
{
pBlock=GetPhysicalBlock(i ,HARD_DISK);
for(j=0;j<1024;j++)
pBlock->Data[j]=0;
pBlock->Dirty=DIRTY;
FreeBufferBlock(pBlock);
}
printk("Error!");
*/
}
PUBLIC void DumpFS_Super()
{LPSuper pSuper;
printk("**************DumpFS_Super*******************\n");
printk("TotalInode TotalBlock TotalFreeBlock TotalFreeInode Magic FirstFreeBlock\n");
printk("%-13x%-13x%-13x%-13x%-13x%-13x\n",
glSuper.TotalInode,glSuper.TotalBlock,glSuper.TotalFreeBlock,glSuper.TotalFreeInode,glSuper.Magic,glSuper.FirstFreeBlock);
pSuper=GetSuper();
printk("%x\n",pSuper->Magic);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -