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

📄 ul_filesys.cpp

📁 类似Linux操作系统0.11版文件系统的文件系统设计和Windows下的操作程序
💻 CPP
字号:
#include "stdafx.h"
#include "UL_FileSys.h"
#include "UL_Buffer.h"
#include "UL_Super.h"
#include "UL_Inode.h"
#include "UL_NameI.h"
#include "BlkDev.h"

struct m_inode* current_pwd;	// 当前工作目录
struct m_inode* current_root;	// 当前根目录

// bitnr 是比特位偏移值,addr 是测试比特位操作的起始地址
int test_bit(unsigned short bitnr, char *addr)
{
	if ((addr[bitnr/8]>>(7-(bitnr%8)))&1 ) 
		return 1;
	return 0;
}

int set_bit(unsigned short bitnr, char *addr)
{
	int bytes, nr, i;
	bytes = bitnr/8;
	nr = bitnr%8;
	i = (addr[bytes]>>(7-nr))&1; 
	addr[bytes]|=(1<<(7-nr));
	return i;
}

int clear_bit(unsigned short bitnr, char *addr)
{
	int bytes, nr, i;
	bytes = bitnr/8;
	nr = bitnr%8;
	i = (addr[bytes]>>(7-nr))&1; 
	addr[bytes]&=~(char)(1<<(7-nr));
	return i;
}

int find_first_zero(char *addr)
{
	int i=0;
	for (; i<8192; i++) 
	{
		if ( !test_bit(i, addr) )
			break;
	}
	return i;
}

// 临时的块缓冲
char blk_buf[1024];
int blk_write (int dev, unsigned long pos, char *buf, int count)
{
	// 由pos 地址换算成开始读写块的块序号block
	int block = pos >> BLOCK_SIZE_BITS;
	// 需读第1字节在该块中的偏移位置offset
	int offset = pos & (BLOCK_SIZE - 1);
	int chars;
	int written = 0;

	register char *p;

	// 针对要写入的字节数count,循环执行以下操作,直到全部写入。
	while (count > 0)
	{
		// 计算在该块中可写入的字节数,如果需要写入的字节数填不满一块,则只需写count 字节。
		chars = BLOCK_SIZE - offset;
		if (chars > count)
			chars = count;

		// 如果正好写一块数据,则直接将数据写入设备
		// 否则只有先读入一块到临时缓冲,改写后再写入设备
		if (chars != BLOCK_SIZE)
		{
			wr_request[0].dev = dev;
			wr_request[0].cmd = READ;
			wr_request[0].sector = block * 2;
			wr_request[0].nr_sectors = 2;
			wr_request[0].buffer = blk_buf;
			blk_dev[MAJOR(dev)].cur_request = &wr_request[0];
			blk_dev[MAJOR(dev)].request_fn();
		}

		// p 指向读出数据块中开始写的位置。若最后写入的数据不足一块,则需从块开始填写(修改)所需
		// 的字节,因此这里需置offset 为零
		p = offset + blk_buf;
		offset = 0;
		// 将文件中偏移指针前移已写字节数。累加已写字节数chars。传送计数值减去此次已传送字节数。
		written += chars;
		count -= chars;
		// 从用户缓冲区复制chars 字节到p 指向的缓冲区中开始写入的位置。
		while (chars-- > 0)
			*(p++) = *(buf++);
		wr_request[0].dev = dev;
		wr_request[0].cmd = WRITE;
		wr_request[0].sector = block * 2;
		wr_request[0].nr_sectors = 2;
		wr_request[0].buffer = blk_buf;
		blk_dev[MAJOR(dev)].cur_request = &wr_request[0];
		blk_dev[MAJOR(dev)].request_fn();
		block++;
	}
	return written;		// 返回已写入的字节数,正常退出。
}


// 函数名: 创建文件系统
void fs_create()
{
	int i;
	char Buf[1024];
	unsigned long Pos = 0;
	memset(Buf, 0, 1024);
	// 第一个块为引导块(清空)
	blk_write(0x301, Pos, Buf, 1024);
	// 超级块
	struct d_super_block superb;
	superb.s_ninodes = 1024;		// 节点总数
	superb.s_nzones = 16*1024;		// 逻辑块总数16M
	superb.s_imap_blocks = 1;		// i 节点位图所占用的数据块数
	superb.s_zmap_blocks = 2;		// 逻辑块位图所占用的数据块数
	superb.s_firstdatazone = 5+32;	// 第一个数据逻辑块
	superb.s_log_zone_size = 0;		// log(数据块数/逻辑块)(以2 为底)
	superb.s_max_size = 1024*1024;	// 文件最大长度
	superb.s_magic = SUPER_MAGIC;	// 文件系统魔数
	Pos += 1024;
	memset(Buf, 'S', 1024);
	blk_write(0x301, Pos, Buf, 1024);
    blk_write(0x301, Pos, (char*)&superb, sizeof(struct d_super_block));
	// i节点位图 块位图
	char* bitmap = (char*)malloc(superb.s_imap_blocks*1024);
	memset(bitmap, 0, superb.s_imap_blocks*1024);
	set_bit(0, bitmap);
	set_bit(1, bitmap);
	memset(Buf, 0, 1024);
	Pos += 1024;
	blk_write(0x301, Pos, Buf, 1024);
	blk_write(0x301, Pos, bitmap, 1024);
	free(bitmap);

	//
	bitmap = (char*)malloc(superb.s_zmap_blocks*1024);
	memset(bitmap, 0, superb.s_zmap_blocks*1024);
	for (i=0; i<5+32+1; i++)
		set_bit(i, bitmap);

	memset(Buf, 0, 1024);
	Pos += 1024;
	blk_write(0x301, Pos, Buf, 1024);
	blk_write(0x301, Pos, bitmap, 1024);
	Pos += 1024;
	blk_write(0x301, Pos, Buf, 1024);
	free(bitmap);

	// inode表
	for(i=0; i<32; i++)
	{
		Pos += 1024;
		blk_write(0x301, Pos, Buf, 1024);
	}
	// 建立root inode
	d_inode inode;
	memset(&inode, 0, sizeof(d_inode));
	inode.i_gid = 0;
	inode.i_mode = S_IFDIR;
	inode.i_nlinks = 1;
	inode.i_size = sizeof(struct dir_entry)*2;
	inode.i_time = time(0);
	inode.i_uid = 0;
	inode.i_zone[0] = 5+32;
	Pos = 5*1024;
	blk_write(0x301, Pos, (char*)&inode, sizeof(d_inode));
	//
	struct dir_entry *de = (struct dir_entry *)Buf;
	de->inode = ROOT_INO;
	strcpy (de->name, ".");
	de++;
	de->inode = ROOT_INO;
	strcpy (de->name, "..");
	Pos = (5+32)*1024;
	blk_write(0x301, Pos, Buf, sizeof(struct dir_entry)*2);
}

⌨️ 快捷键说明

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