filesystem.h

来自「参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发」· C头文件 代码 · 共 101 行

H
101
字号
//#include "../kernel.h"
#define ERROR -1
#define OK 1
#define CLEAR 0
#define DIRTY -1

#define NO_BLOCK -1
#define NO_DEVICE -1
#define NULL 0
#define VIRTUAL_HD_SIZE 1024*1024*1024  //1G
#define BUFFER_SIZE 1024
#define NR_FILE_BUFFER 2*1024//2M
#define NR_HASH_BUFFER 256
#define MASK(a) a&0xFF //哈希函数
//目录的哈希函数
#define DIR_MASK(FatherInodeNumber,Name,Index) int c=0; int f=0;while(Name[c]!='\0'){ f+=Name[c];c++;} Index=(f+FatherInodeNumber)&0xFF;
typedef struct Buffer{
	int Count;//该块被引用的次数
	char Dirty;//该块是否被修改过
	t_8 *Data;//数据缓冲区
	int Block;//该块所在的块号
	int Device;//该块所在的设备号
	struct Buffer	*NextFree;//指向下一个空闲块
    struct Buffer	*PrevFree;//指向前一个空闲块
	struct Buffer	*Hash;//哈希链指针	
	struct Buffer	*DirtyLink;//修改链指针
}Buffer,*LPBuffer;

typedef struct s_Super{//超级块
	t_32 TotalInode;//Inodes总数
	t_32 TotalBlock;//块总数
	t_32 TotalFreeBlock;//空闲块总数
	t_32 TotalFreeInode;//空闲Inode总数
	t_16 Magic;//魔数
	t_32 FirstFreeBlock;//第一个可用于预分配的空闲块位置
	t_32 FirstFreeInode;
}Super,*LPSuper;

#define ZONE_NUMBERS 14
typedef struct s_Inode{
	t_16 Mode;//文件类型和访问权限
	t_16 UserId;//用户Id
	t_16 GroupId;//组Id
	t_32 FileSize;//以字节计算的文件大小
	t_16 LastAccessTime;//最后一次访问时间
	t_16 CreateTime;//创建时间
	t_16 StateModefyTime;//状态修改时间
	t_32 Blocks;//文件占用的总块数
	t_32 Block[ZONE_NUMBERS];//指向数据块的指针数组
	t_32 LastBlock;//文件所对应块的最后一块,用作文件扩展分配
    t_32 FutuerBlocks;//预分配的文件块大小
	t_32 None[11];//暂时用作填充位,为扩展留下空间 
}Inode,*LPInode;
/*InodeSize 128bytes*/

#define NR_INODE_BUFFER 1000
#define NR_HASH_INODE 256
#define MASK(a) a&0xFF //哈希函数

//Inode缓冲区
typedef struct InodeBuffer{	
	t_32 InodeNumber;//Inode号
	Inode *FileInode;//文件Inode
	int Count;//引用次数
	int Dirty;//是否被修改过
	struct InodeBuffer	*NextFree;//指向下一个空闲块
	struct InodeBuffer  *PrevFree;//指向前一个空闲块
	struct InodeBuffer	*Hash;//哈希链指针
}InodeBuffer,*LPInodeBuffer;




#define FILE_NAME_SIZE 28

//目录
typedef struct Directory{
	char Name[FILE_NAME_SIZE];//目录名
	t_32 InodeNumber;//该目录对应的Inode号
}Directory,*LPDirectory;

//目录缓冲区
typedef struct DirectoryBuffer{
	Directory Dir;
	t_32 FatherInodeNumber;//父目录的Inode号
	struct DirectoryBuffer	*Next;//指向下一块
}DirectoryBuffer,*LPDirectoryBuffer;

extern Super glSuper;
extern LPSuper GetSuper(); 
//#define VIRTUAL_HD_SIZE 100*1024*1024//虚拟磁盘空间定为100M
#define INODE_SIZE sizeof(Inode)//当前为128字节
#define SUPER_SIZE sizeof(Super)


void InitFileBuffer();	
void InitInodeBuffer();
void InitDirectoryBuffer();	
PUBLIC void initFS();
LPBuffer GetPhysicalBlock(int Block ,int Device);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?