#include"myEXT2.h"
//写超级块
static void update_super_block() {
if(fp==NULL){
fopen_s(&fp, "./Ext2", "rb+");
}
//其功能是使用给定的模式 mode 打开 filename 所指向的文件。文件顺利打开后,指向该流的文件指针就会被返回
//因为返回的是指针,所以要赋值到fp上
/*
filename: 要打开的文件名字符串
mode: 访问文件的模式, 它包括:
模式 描述 文件可否存在
"r" 打开文件仅供读取 必须存在
"w" 创建新文件仅供写入 若存在,则清空后再写入
"a" 打开文件附加写入 若不存在,则创建新文件写入
"r+" 打开文件供读取并写入 必须存在
"w+" 创建新文件供读取并写入 若存在,则清空后再写入
"a" 打开文件读取并附加写入 若不存在,则创建新文件写入
r:打开只读文件,该文件必须存在。
r+:打开可读写的文件,该文件必须存在。
rb+:读写打开一个二进制文件,只允许读写数据。
rt+:读写打开一个文本文件,允许读和写。
w:打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+:打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a:以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
a+:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
wb:只写打开或新建一个二进制文件;只允许写数据。
wb+:读写打开或建立一个二进制文件,允许读和写。
wt+:读写打开或着建立一个文本文件;允许读写。
at+:读写打开一个文本文件,允许读或在文本末追加数据。
ab+:读写打开一个二进制文件,允许读或在文件末追加数据。
*/
fseek(fp, DISK_START,SEEK_SET); //如果执行成功,stream将指向以origin为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。如果执行失败(比如offset取值大于等于2 * 1024 * 1024 * 1024,即long的正数范围2G),则不改变stream指向的位置,函数返回一个非0值。
fwrite(sb_block,SB_SIZE,1,fp);
/*
功能是向指定的文件中写入若干数据块,如成功执行则返回实际写入的数据块数目。
buffer-- 这是指向要被写入的元素数组的指针。(要获取数据的地址)
size-- 这是要被写入的每个元素的大小,以字节为单位。
nmemb-- 这是元素的个数,每个元素的大小为 size 字节。
stream-- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
*/
fflush(fp);//_Stream是输入输出流
}
//读超级块
static void reload_super_block() {
fseek(fp, DISK_START, SEEK_SET);
fread(sb_block, SB_SIZE, 1,fp );//读取若干字节到缓冲区
/*将_Stream内的内容读取到_Buffer中,一个结构的大小是_ElementSize,数量是_ElementCount*/
};
//写组描述符
static void update_group_desc() {
if (fp == NULL) {
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, GDT_START, SEEK_SET);
fwrite(gdt, GD_SIZE, 1, fp);
fflush(fp);
}
//读组描述符
static void reload_group_desc() {
fseek(fp, GDT_START, SEEK_SET);
fread(gdt, GD_SIZE, 1, fp);
}
//写第i个inode
static void update_inode_entry(unsigned short i) {
if(fp==NULL){
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, INODE_TABLE + (i - 1) * INODE_SIZE, SEEK_SET);
fwrite(inode_area, INODE_SIZE, 1, fp);
fflush(fp);
}
//读第i个inode
static void reload_inode_entry(unsigned short i) {
fseek(fp, INODE_TABLE + (i - 1) * INODE_SIZE, SEEK_SET);
fread(inode_area, INODE_SIZE, 1, fp);
}
//写第i个块
static void update_dir(unsigned short i) {
if (fp == NULL) {
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, DATA_BLOCK + (i-1) * BLOCK_SIZE, SEEK_SET);
fwrite(dir, BLOCK_SIZE, 1, fp);
fflush(fp);
}
//读第i个数据块
static void reload_dir(unsigned short i) {
fseek(fp, DATA_BLOCK + (i-1) * BLOCK_SIZE, SEEK_SET);
fread(dir, BLOCK_SIZE, 1, fp);
}
//写block位图
static void update_block_bitmap() {
if (fp == NULL) {
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, BLOCK_BITMAP, SEEK_SET);
fwrite(bitbuf, BLOCK_SIZE, 1, fp);
fflush(fp);
}
//读block位图
static void reload_block_bitmap() {
fseek(fp, BLOCK_BITMAP, SEEK_SET);
fread(bitbuf, BLOCK_SIZE, 1, fp);
}
// 写 inode 位图
static void update_inode_bitmap() {
if (fp == NULL) {
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, INODE_BITMAP, SEEK_SET);
fwrite(ibuf, BLOCK_SIZE, 1, fp);
fflush(fp);
}
// 读 inode 位图
static void reload_inode_bitmap() {
fseek(fp, INODE_BITMAP, SEEK_SET);
fread(ibuf, BLOCK_SIZE, 1, fp);
}
// 写第 i 个数据块
static void update_block(unsigned short i) {
if (fp == NULL) {
fopen_s(&fp, "./Ext2", "rb+");
}
fseek(fp, DATA_BLOCK + i * BLOCK_SIZE, SEEK_SET);
//fseek(fp,0,SEEK_SET);
fwrite(Buffer, BLOCK_SIZE, 1, fp);
fflush(fp);
}
// 读第 i 个数据块
static void reload_block(unsigned short i) {
fseek(fp, DATA_BLOCK + i * BLOCK_SIZE, SEEK_SET);
fread(Buffer, BLOCK_SIZE, 1, fp);
}
//分配函数
//分配一个数据块,返回块号
static int alloc_block(){
//bitbuf一共512字节,表示4096个数据块,根据last_alloc_block/8计算它在bitbuf中哪个字节(最后一个)
unsigned short cur = last_alloc_block;
unsigned char con = 128;//这个unsigned char就是按二进制数的增顺序排列的数,128就是10000000
int flag = 0;//在每一个字节中处于的位置,他这个是从左到右存储的(从高位到低位)
if (gdt[0].bg_free_blocks_count == 0) {
printf("没有可分配的块了\n");
return(0);
}
reload_block_bitmap();
cur /= 8;
while (bitbuf[cur] == 255) {//当这个字节已经满了,要跳到下一个字节,未满,还在这个字节中分配,并终止循环
if (cur == 511) {//最后一个字节也满了,需要从头开始寻找了
cur = 0;
}
else cur++;
}
while (bitbuf[cur] & con) {//它这是在用与操作在当前字节中找具体的哪个bit
con /= 2;
flag++;
}
bitbuf[cur] = bitbuf[cur] + con;
last_alloc_block = cur * 8 + flag;
update_block_bitmap();//fp在这个函数中出现的reload函数中已经定位
gdt[0].bg_free_blocks_count--;//分配了就要减少
update_group_desc();
return last_alloc_block;
}
//分配一个inode
static int get_inode() {
unsigned short cur = last_alloc_inode;
unsigned char con = 128;
int flag = 0;
//先进行判断再操作
if (gdt[0].bg_free_inodes_count == 0) {//因为是组内的索引节点所以是组描述符内的索引节点数
printf("没有可分配的索引节点了\n");
return(0);
}
reload_inode_bitmap();//得要先进行读取然后才能开始操作
cur = (cur - 1) / 8;//第一个标号事1,但寻出是从0开始的
while (ibuf[cur] == 255) {
if (cur == 511) {
cur = 0;
}
else cur++;
}
while (ibuf[cur] & con) {
con /= 2;
flag++;
}
//更新当前字节的数据分配
ibuf[cur] = ibuf[cur] + con;
last_alloc_inode = cur * 8 + flag + 1;
update_inode_bitmap();
gdt[0].bg_free_inodes_count--;
update_group_desc;
return last_alloc_inode;
}
//查找当前目录中名为tmp的文件目录,并得到该文件的inode号,它在上级目录中的数据块号以及数据块中目录的项号
static unsigned short research_file(char tmp[100], int file_type, unsigned short* inode_num,
unsigned short* block_num, unsigned short* dir_num) {
unsigned short j, k;
reload_inode_entry(current_dir);//进入当前目录
j = 0;
//这个实际上是一个单循环,i_block是块,里边有位,位顺着走,走完这个块换到下一个块中
while (j < inode_area[0].i_blocks) {
reload_dir(inode_area[0].i_block[j]);
k = 0;
while (k < 32)/*32是dir缓冲区的大小*/ {//检测的是目录项缓冲区(reload_dir放入的)里边的内容
//检查对应目录项与当前文件是否匹配,若匹配则选定,不匹配目录项换到下一项
//它这个本质是在,在每一个块的目录中寻找(每个块都有一个目录),并将目录号,,目录中的节点号进行一个传递
if (!dir[k].inode || dir[k].file_type != file_type || strcmp(dir[k].name, tmp)) {
k++;
}
else {
*inode_num = dir[k].inode;
*block_num = j;//块号
*dir_num = k;//目录号
return 1;//找到就返回了
}
}
j++;
}
return 0;
}
//因为文件系统的第一步肯定是准备目录,所以不必担心它的位置被分散
// 为新增目录或文件分配 dir_entry
// 对于新增文件,只需分配一个 inode 号
// 对于新增目录,除了 inode 号外,还需要分配数据区存储.和..两个目录项
static void dir_prepare(unsigned short tmp, unsigned short len, int type) {
reload_inode_entry(tmp);//tmp是索引节点号(将所指位置放到索引缓冲中)
if (type == 2) {//
没有合适的资源?快使用搜索试试~ 我知道了~
西安交通大学操作系统第三次实验(文件系统)
![preview](https://csdnimg.cn/release/downloadcmsfe/public/img/white-bg.ca8570fa.png)
共40个文件
tlog:6个
ipch:6个
vsidx:4个
![preview-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/scale.ab9e0183.png)
需积分: 4 6 下载量 108 浏览量
2022-12-04
00:26:47
上传
评论
收藏 14.07MB ZIP 举报
温馨提示
西安交通大学操作系统第三次实验(文件系统)
资源推荐
资源详情
资源评论
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![txt](https://img-home.csdnimg.cn/images/20210720083642.png)
![none](https://img-home.csdnimg.cn/images/20210720083646.png)
![thumb](https://img-home.csdnimg.cn/images/20210720083646.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![none](https://img-home.csdnimg.cn/images/20210720083646.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
收起资源包目录
![package](https://csdnimg.cn/release/downloadcmsfe/public/img/package.f3fc750b.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/EXE.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![folder](https://csdnimg.cn/release/downloadcmsfe/public/img/folder.005fa2e5.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
![file-type](https://csdnimg.cn/release/download/static_files/pc/images/minetype/UNKNOWN.png)
共 40 条
- 1
资源评论
![avatar-default](https://csdnimg.cn/release/downloadcmsfe/public/img/lazyLogo2.1882d7f4.png)
![avatar](https://profile-avatar.csdnimg.cn/9692749b59fb41aab1962ab8aceddad8_galaxyoverriver.jpg!1)
![avatar-vip](https://csdnimg.cn/release/downloadcmsfe/public/img/user-vip.1c89f3c5.png)
Galaxy_che
- 粉丝: 11
- 资源: 2
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)