📄 ul_filesys.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 + -