【0】README

0.1) source code are from orange’s implemention of a os , and for complete code , please visit https://github.com/pacosonTang/Orange-s-OS/tree/master/fs_create_file_p366 ;
0.2)本文总结的内容是干货, 而且 创建文件所涉及的代码调用太复杂,整理了出来,生怕它含在嘴里化了,所以发表上来;
0.3) 本创建文件的代码or steps 仅仅针对 orange‘s diy 的文件系统,如何建立diy的文件系统, refering to http://blog.csdn.net/pacosonswjtu/article/details/48919489


【1】引入文件描述符(file descriptor)



1)每当一个进程打开一个文件——无论是打开一个已存在 的还是创建一个新的,该进程的进程表的filp 数组中就会分配一个位置, 用于存放 打开文件的fd指针;
2)文件描述符fd 的真正含义:它其实是一个数组的下标,循着这个下标,系统可以找到用以描述文件的inode 数据结构;


【2】 open()函数——创建一个文件

2.1)我们先看看创建文件的代码大致调用流程:

2.2) 创建文件的主要过程,其中最核心的函数是 do_open()函数调用的 create_file() 函数,我们看一下它们的调用过程;

函数性能Analysis)

  • A0)int do_open():打开一个文件,返回文件描述符,文件名由 用户进程(如TestA)通过消息传递过来;
  • A1)int search_file(char *path):查找该路径path 所标识的文件,并返回其对应的inode编号;
  • A2)struct inode * create_file(char * path, int flags):转换带路径的文件名path 为纯文件名,并以纯文件名创建文件,并返回该文件的inode 指针(数据结构);
    • A2.1)int strip_path(char * filename, const char * pathname, struct inode ppinode):**返回带路径的文件名pathname 对应的纯文件名filename, 以及该文件所在文件夹的inode编号;
    • A2.2)int alloc_imap_bit(int dev):在dev标识分区的inode-map 中为 即将被分配的inode 置为使用中(bit位=1), 返回该inode 编号;
    • A2.3)int alloc_smap_bit(int dev, int nr_sects_to_alloc):在dev标识分区的sector-map 中为 即将被分配的sector 置为使用中(bit位=1),返回该sector编号;
    • A2.4)struct inode * new_inode(int dev, int inode_nr, int start_sect):在dev标识分区中找到编号为inode_nr 的inode数据结构,并吧start_sect 写入该inode数据结构中, 最后返回找出的inode数据结构 (指针);(因为,每个分区都有一个文件系统,他们所有的扇区都是以各自分区的第一个扇区为起始扇区,都是从0开始起算,故需要传入dev设备号以示选中具体的分区)
      • A2.4.1)struct inode * get_inode(int dev, int num):参见 A4);
      • A2.4.2)void sync_inode(struct inode * p):一旦内存中的inode 数据结构发生改变, 则立即写入磁盘(同步更新到磁盘)。这一项工作就是通过 sync_inode() 将inode 数据结构 p 写入 硬盘的相应扇区来实现的;
    • A2.5)void new_dir_entry(struct inode *dir_inode,int inode_nr,char *filename):创建以inode_nr、filename 为根目录文件项的inode数据结构、文件名称, 最后还要把 根目录inode的数据结构 dir_inode 同步更新到硬盘上;
  • A3)int strip_path(char * filename, const char * pathname, struct inode ppinode):**返回带路径的文件名pathname 对应的纯文件名filename, 以及该文件所在文件夹的inode编号;
  • A4)struct inode * get_inode(int dev, int num):从设备号dev 所标识的硬盘分区中,查找出编号为num 的inode数据结构(指针);

【3】向 init_fs()添加新内容

函数性能Analysis):

  • A0)init_fs():初始化文件系统;
  • A1)void read_super_block(int dev):将dev标识的硬盘分区中的超级块读入内存缓冲区fsbuf , 然后再copy到 super_block 数组;
  • A2)struct super_block * get_super_block(int dev):返回dev标识的硬盘分区中的超级块指针(数据结构);

【4】还有两个读写数据的宏(WR_SECT + RD_SECT),你可能需要了解:


Analysis):

  • A1)WR_SECT(ROOT_DEV, sb.n_1st_sect) :调用 WR_SECT宏,传入参数并接着调用 rw_sector(int io_type, int dev, u64 pos, int bytes, int proc_nr,
    void* buf) 后,该宏表达的意思是(是文件系统进程 fs 向 驱动程序hd 发送消息,消息类型是读取扇区内容到 内容缓冲区fsbuf 中):从硬盘or驱动器(ROOT_DEV的主设备号对应的驱动器) 的 分区中(ROOT_DEV的次设备号对应的分区)的第 sb.n_1st_sect扇区中读取 SECTOR_SIZE (==一个扇区的字节大小)字节到 内存缓冲区fsbuf中;
  • A2)#define MAJOR(x) ((x >> MAJOR_SHIFT) & 0xFF) 和 #define MINOR(x) (x & 0xFF) : 分别表示计算 x 的主设备号 和 次设备号, 前者选择驱动程序(如选择硬盘驱动还是软盘驱动), 后者表示选择某个硬盘(软盘)的分区;

Conclusion):

  • C1) 你可以看到,创建一个文件, 首先是用户进程如Test_A 发送消息DEV_OPEN, 交给进程调度程序send_recv 处理; 然后进程调度程序调用 文件系统进程task_fs; 然后文件系统进程task_fs在读写硬盘数据的时候,该读写工作 是 文件系统进程task_fs 通过进程调度程序send_recv 调用 硬盘驱动程序task_hd 来实现的;然后 硬盘驱动程序task_hd 读写完数据后,返回相应消息, 以表示工作完成;(读写文件类似)
  • C2) 从上述创建文件的过程叙述可知, 该过程涉及到 进程间通信IPC, 进程调度;

在diy的文件系统上创建文件的流程相关推荐

  1. 在服务器上创建文件夹,在服务器上创建文件夹

    在服务器上创建文件夹 内容精选 换一换 在迁移之前必须先创建输入文件夹和输出文件夹,并将待迁移的所有SQL脚本复制到输入文件夹中.Linux系统操作如下:由于DSC批量无序地读取输出文件夹,因此,建议 ...

  2. java在FTP服务器创建文件夹,java在ftp服务器上创建文件夹

    java在ftp服务器上创建文件夹 内容精选 换一换 启动目的端时失败,错误码:SMS.3103,提示迁移失败原因"对目的服务器重新建立引导失败".启动目的端后,系统会重新安装目的 ...

  3. echo添加换行 linux_在 Linux 上创建文件的 10 个方法

    我下面将会介绍多个在 Linux 上创建文件的方法.我建议你选择几个简单高效的来辅助你的工作. -- Vinoth Kumar 我们都知道,在 Linux 上,包括设备在内的一切都是文件.Linux ...

  4. 在被管理节点上创建文件或目录

    被管理节点上创建文件或目录 一.修改文件并将其复制到主机 1.描述文件的模块 2.files模块的自动化示例 2.1 确保受管主机上存在文件 2.2 修改文件属性 2.3 使SELinux文件上下文更 ...

  5. Android---在SD卡上创建文件或目录总结

    每个程序在手机上运行时,或多或少会需要使用一些手机的存储空间去存储一些用户数据或临时缓存数据等等,通常在存储设备上创建文件或目录,都会成功.但也会有失败的时候,下面会列举一些创建文件或目录失败,常见和 ...

  6. 服务器共享目标文件夹访问被拒绝,访问被拒绝尝试在服务器上创建文件夹

    客户端注册系统的每个新项目都会创建一个文件夹来存储位于"\ Images \ Projects {ProjectID}"中的图像,其中{ProjectID}是ID项目.访问被拒绝尝 ...

  7. 在被管理主机上创建文件或目录

    文章目录 在被管理主机上创建文件或目录 修改文件并将其复制到主机 files模块的自动化示例 确保受管主机上存在文件 修改文件属性 使SELinux文件上下文更具持久性 在受管主机上复制和编辑文件 从 ...

  8. linux文件移动到hdfs,解决从linux本地文件系统上传文件到HDFS时的权限问题

    当使用 hadoop fs -put localfile /user/xxx 时提示: put: Permission denied: user=root, access=WRITE, inode=& ...

  9. 在受控主机上创建文件或目录

    修改文件并将其复制到主机 描述文件模块 Files模块库包含的模块允许用户完成与Linux文件管理相关的大多数任务,如创建.复制.编辑和修改文件的权限和其他属性.下表提供了常用文件管理模块的列表: 常 ...

最新文章

  1. 古代password
  2. 什么是HADOOP、产生背景、在大数据、云计算中的位置和关系、国内外HADOOP应用案例介绍、就业方向、生态圈以及各组成部分的简介(学习资料中的文档材料)
  3. SQL Server查询正在执行的存储过程并停止
  4. 【已解决】图灵机模型(模拟二进制非负整数加1)
  5. 黑马程序员——java语言基础——组合,关联,聚合的区别
  6. javafx阴影_JavaFX技巧来节省内存! 属性和可观察对象的阴影场
  7. javascript基本函数
  8. 怎么在html的img src=src的值这里调用js方法或变量获取图片地址
  9. 特征工程系列之自动化特征提取器
  10. Java语法基础,课后实践
  11. GPS学习之二:AGPS,GPS,DGPS 认识
  12. 前端开发工程师,CSS盒子模型居中方法
  13. service暴露端口的方式与代理的方式
  14. ad16中如何改变栅格颜色
  15. 数据链路层的子层MAC层(图文详解)
  16. vue项目将px转为rem实践
  17. 苹果手机滑动光标怎么设置_iPhone手机三种方便又准确的移动光标方式
  18. Ubuntu 16.04下NVIDIA GTX 960M显卡驱动的安装
  19. 使用Exchange获取邮件内容
  20. 20155214曾士轩 2016-2017-2 《Java程序设计》第1周学习总结

热门文章

  1. [HAOI2008]玩具取名
  2. 周期长度和(KMP)
  3. CF573D-Bear and Cavalry【动态dp】
  4. P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】
  5. P2150-[NOI2015]寿司晚宴【dp】
  6. P3168-[CQOI2015]任务查询系统【主席树】
  7. YbtOJ#20082-[NOIP2020模拟赛B组Day8]导出子图【dp】
  8. P2568-GCD【欧拉函数,欧拉筛】
  9. 【传递闭包】【倍增】幸福路径(P4308)
  10. 【贪心】数据备份(P6320)