📄 disk.c
字号:
/* disk.c */
#include "disk.h"
//开始时除了boot,super和inodes剩下的都是空闲块,把它们链起来
int fs_toggle_free_block(FILE *fp)
{
//跳过引导块,超级块和i-node表
fseek( fp, sizeof(struct fs_boot), SEEK_SET); //跳过引导块
struct fs_super super;
fread( &super, sizeof(super), 1, fp);
fseek( fp, BLOCK_SIZE*(INODE_TABLE_BLOCKS + 1), SEEK_SET);
//采用磁盘块链表,每个块中包含尽可能多的空闲磁盘块号
int r, i, blk_stack[STACK_MAX+1]; /* toggle the free blocks here */
for( r=0, i=0; r<super.free_block_count; r++){
if(r%STACK_MAX==0 && r>0){
blk_stack[0] = STACK_MAX;
//每一次栈滿就写入“磁盘”,然后开启下一个栈记录接下来的空闲块
fwrite( &blk_stack, sizeof(blk_stack), 1, fp);
fseek( fp, BLOCK_SIZE*(INODE_TABLE_BLOCKS + 1 + STACK_MAX*i++), SEEK_SET);
}
/* jump to next group */
blk_stack[(r%STACK_MAX) + 1] = r; //记录磁盘块号
}
/* record the rest in the last */
blk_stack[0] = super.free_block_count - ftell(fp)/BLOCK_SIZE;
fwrite( &blk_stack, sizeof(blk_stack), 1, fp);
return 0;
}
//格式化文件系统
int fs_format(FILE *fp)
{
int i;
rewind(fp);
struct fs_boot boot; //驱动块
fwrite( &boot, sizeof(boot), 1, fp);//从boot的地址开始写1块大小为sizeof(boot)的数据块到文件中
struct fs_super super; //初始化超级块
super.total_block_count = DISK_SIZE/BLOCK_SIZE;
super.free_block_count = super.total_block_count - (INODE_TABLE_BLOCKS + 1);//计算空闲块
for( i=0; i<STACK_MAX; i++){
super.free_block_stack[i+1] = i; /* from index 1 建立空闲块索引*/
super.free_inode_stack[i+1] = i; /* from index 1 建立空闲结点索引*/
}
super.free_block_stack[0] = STACK_MAX;//当前空闲块初始化为最后一块空闲块
super.free_inode_stack[0] = STACK_MAX;//当前空闲结点初始化为最后一个结点
super.free_inode_count = INODE_TABLE_BLOCKS*BLOCK_SIZE/sizeof(struct fs_inode);//分配INODE_TABLE_BLOCKS块空间用于存i-node,计算i-node总数
super.remembered_inode = STACK_MAX;//记录当前已分配的最大inode号
fwrite( &super, sizeof(super), 1, fp);//写超级块
for( i=0; ftell(fp)<BLOCK_SIZE; i++) //写滿一块磁盘块,即第一块磁盘块用于存boot和super
fwrite( &i, sizeof(i), 1, fp);
//写入i-nodes
struct fs_inode inode; /* write inode_talbe */
inode.type = 'i'; /* mark as free inode, see disk.h */
for( i=0; i<INODE_TABLE_BLOCKS*BLOCK_SIZE/sizeof(inode); i++)
fwrite( &inode, sizeof(inode), 1, fp);
//写入数据块
struct fs_block block; /* write the data block, just fill */
for( i=0; i<super.free_block_count; i++)
fwrite( &block, sizeof(block), 1, fp);
fs_toggle_free_block(fp); /* toggle the free blocks */
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -