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

📄 disk.c

📁 操作系统课程设计
💻 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 + -