Skip to content

9DemonFox/FILE_OS_Design

Repository files navigation

知识笔记

** 1 尝试使用enum{ name_1; name_2; name_3; } 来对程序中的一些层次进行比较。

笔记

用面向对象的方法解释

main()

** fs_init() 初始化文件设备到文件系统的 类 *** 类的方法包括 文件系统所实现的通用接口 *** 类的属性包括 文件系统的类别 用enum列出,检测 ** FIXME 通过预处理把FULFS和文件系统接合

** 创建虚拟磁盘 main()//命令解析

- create()//输出错误信息
–ft_create()/系统调用

** 格式化虚拟磁盘 main()//命令解析

- format()//检验基本信息(文件系统名字,分配块大小)
- fs_format()//检查文件系统是否在支持的文件系统类别中
- fulfs_format()
- dev_inode_ctrl_init()
- inode_dump()
- data_blocks_init(&data_block_free_stack)//文件管理中超级块,即栈
-group()//成组链接分配方法
-group_dump()//写入缓冲区
-block_write()//块操作
-DEVICE_IO()//磁盘IO,只处理IO
- superblock_create(&sb)//创建sb
- base_file_create(sb)//写入sb

-| ** 文件系统层 main()//命令解析

|-enter()//解析配置文件,将设备挂载到盘符 ** FIXME 暂时挂载盘符A
-shell_main()//进入文件系统shell层

shell_main()//命令解析成 命令参数个数 命令参数

-cmd_dispatch()//命令查询
-ls 显示当前目录项

** ls

-cmd_ls()//
-fs_opendir(path)
-fulfs_opendir()
-base_file_open()//文件夹也是文件
-mem_inode_get()//inode缓存数组

** mkdir

-cmd_mkdir()//简单参数校验
-fs_mkdir()//获取绝对路径
-fulfs_mkdir();
-path_basename(&name);//获取文件名字
-path_dirname(&dir_path);//文件夹的路径
-dir_roottree_locate(&exist,&dir_no);
-dir_tree_locate(&exist,&dir_no);
-base_file_open(&base_file,&fs->sb,dir);
-dir_locate(dir_no,&exist,&file_no)//返回i节点编号
-base_file_open(&base_file);
-base_file_create(MODE_DIR,&file_no);创建一个空闲文件
-修改inode的信息,变为占用
-修改超级块已经使用的inode数目
-superblock_dump(device, sb);
-inode_dump();写入i节点
-inode_no_to_block_no_and_offset(dev_inode_ctrl, no, &block_no, &offset);
-block_read(&buff);//读出整块
-把inode添加到buff
-block_write(buff)//写入整块
-dir_add();
-base_file_close();
-superblock_dump();
-base_file_open(&base_file);
-mem_inode_get(&dev_inode_ctrl,inode_no,&(base_file->mem_node))//获取inode所存放的信息

系统层次即方法

反复调用的函数

** fs_stat(name,&fs_stat))

-根据name获取绝对路径
-fulfs_stat(device,fs_ctrl,path_remain(abspath),&fs_stat)
-dir_roottree_locate(device,fs,path,&exit,i_node_type &no)
-去除根目录 ‘/’
-superblock_root_dir_inode(&fs->sb)//定位到根目录的i节点
-dir_tree_locate(device, fs, inode(0), relative_path, &p_exist, &p_no);//在根目录寻找
-获取下一级目录名 如test0/test1/则 name=test0
-dir_locate(device,fs,dir,char* name,&p_exist, inode_no_t &p)//获取目录项
-base_file_open(&base_file,device,inode_no_t dir)//获取文件信息
-获取basefile中的信息

base_file_open(&base_file,device,&sb,inode_no_t i);

-dev_inode_ctrl_init_from_superblock(&dev_inode_ctrl, device, sb);
-dev_inode_ctrl_init()//
-存i节点的开始
-存i节点的block数目
-mem_inode_get(&dev_inode_ctrl, inode_no, &(base_file->mem_inode))
-在存放inode的 mem_inodes数组中找到所有i节点
-mem_inode_read(dev_inode_ctrl, inode_no)
-inode_load(dev_inode_ctrl,no, inode_t* inode)
-inode_no_to_block_no_and_offset(dev_inode_ctrl, no, &block_no, &offset);
-获取i节点的块数目 block_no
-块内偏移 offset
-block_read(device, 每块扇区数, block_no, &buf);//读出块到buf
-device_read(device, no * sectors_per_block, sectors_per_block, buf));//设备层
-系统调用
-计算获取inode的地址
-完善文件基本信息当前块偏移为0,位置偏移为0

dir_locate

base_file_open();
读出所有数据,按照每个目录项大小循环,直到读完目录项
若存在,返回存在标志位,则读出目录项
不存在,则返回不存在

mkdir

/dir0/dir1/dir2 ** 读出根目录 *** 查找dir0项 ** 读出dir0项查找dir1 ** 读出dir1项查找dir2

文件的创建

** 目录项的建立即包括文件名字和i节点 ** 通过根逐步找到目录项

About

课程设计_2018年07月07日06:10:27

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published