在diy的文件系统上创建文件的流程

【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, 进程调度;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java设计模式 订阅模式_Java中的外观设计模式

java设计模式 订阅模式立面是指建筑物的外观。 当穿过街道时,我们所看到的只是建筑物的外观。 该工作面抽象了建筑物的所有复杂实现细节。 同样, 外观设计模式旨在为子系统中的一组接口提供统一的接口。 这个统一的接口对客户端隐藏了子系统的复杂性。 …

dnn模型 list index out of range_基于svm的财务预警模型

前言本文将我国A股上市公司作为研究对象,选取了A股 2015-2019 年度被 ST 或被 *ST上市公司,剔除了部分非财务原因导致ST或*ST的上市公司。财务指标选择了T-3期的资产负债率、流动比率、应收账款周转率等10个财务指标。数据收集及预处理导入所需要库 im…

汇编操作显存

【0】README 0.1)本文转自: http://www.cnblogs.com/youxin/archive/2012/05/21/2512329.html for relative source code , please visit https://github.com/pacosonTang/Orange-s-OS/blob/master/lib.inc 【1】关于 80*25彩色字符模式显示缓冲区&…

Hibernate中的实体对象的三种状态

对于 Hibernate 而言,实体对象的状态分为三种: 1.暂时态 当对象刚创建,和 Session 没有发生任何关系时,当程序运行完就立刻消失,被称为暂时态。 2.持久态 持久态的对象和 Session 发生了关系,如执行了 ses…

java设计模式之状态模式_Java中的状态设计模式

java设计模式之状态模式在本教程中,我们将探讨另一种流行的行为设计模式-状态设计模式。 当我们使用可以存在于多个状态的对象时,状态设计模式的知识变得非常有用。 当对象的行为取决于其当前状态时,我们应该主要使用它。 这种模式有助于我们…

php概率计算_PHP指定概率算法

PHP指定概率算法,可用于刮刮卡,大转盘等抽奖算法。假设:有一个二维数组,记录了所有本次抽奖的奖项信息:$test_arr array(a>20,b>30,c>50);a奖概率20%,b奖概率30%,c奖概率50%模拟函数执…

os如何处理键盘的所有按键,显示or不显示,显示是如何显示

【0】README 0.1) source code and text decription are from orange’s implemention of a os , and for complete code , please visit 我待会上传; 【1】 键盘输入缓冲区 step1)缓冲区的数据结构如下: step2)对…

Hibernate的缓存机制/会话级缓存机制

Hibernate 中维持了两级缓存。第一级缓存由 Session 实例维护,该缓存区保存着与该 Session 实例有关联的所有实体对象的数据,也称为内部缓存。而第二级缓存则存在于 SessionFactory 实例中,由通过该 SessionFactory 实例获取的所有 Session 实…

orm提取指定列_使用ORM提取数据很容易! 是吗?

orm提取指定列介绍 几乎所有系统都以某种方式与外部数据存储一起运行。 在大多数情况下,它是一个关系数据库,并且通常将数据获取委托给某些ORM实现。 ORM涵盖了很多例程,并且带来了一些新的抽象作为回报。 Martin Fowler写了一篇有关ORM的有…

如何编译文件(gcc + nasm)

【0】README 编译文件(nasm gcc),特别是编译目标文件的依赖文件;本文旨在回顾 gcc 和 nams 编译器的编译命令,以及如果有多个依赖文件该如何编译; 【1】编译文件 1.1)编译 lib/syscall.asm(lib/syscall.asm) nasm …

Hibernate中的Session.load() 和 Session.get() 的区别

文章目录相同点区别懒加载的问题执行语句 session.load(UserInfoBean.class,2) 会先在一级缓存中找 id2 的 UserInfoBean 对象(看红色线条),找不到去二级缓存找,还找不到就不找了,直接获取一个代理对象并返回该对象。当…

python 分布式队列_〖Python〗-- Celery分布式任务队列

【Celery分布式任务队列】一、Celery介绍和基本使用Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery, 举几个实例场景中可…

最大子序列和问题的解(共4种,层层推进)

【0】README 0.1) source code and text description are from data structure and alg analysis ; 0.2) there are 4 methods solving maximum sum of subsequence, but the fourth proves to be the best one , the 3rd deser…

java设计模式代理模式_Java中的代理设计模式

java设计模式代理模式代理对象或代理对象为另一个对象提供占位符,以控制对该对象的访问。 代理充当原始对象的轻量级版本或简化版本。 它支持与原始对象相同的操作,但可以将那些请求委托给原始对象以实现它们。 代理设计模式是一种结构模式,…

Struts2参数值自动注入到JavaBean对象的属性中和JavaBean对象的属性值展示在页面中

文章目录参数值自动注入示例代码将JavaBean的属性值显示在页面上示例代码参数值自动注入 注意事项: 1.前端界面的表单项的参数命名格式为:Action属性名.JavaBean的属性名 2.Action的属性必须要有setter/getter方法,注入时会调用setter方法 …

ibmmq 通道命令_IBM MQ常用命令

常用命令创建队列管理器crtmqm –q QMgrName-q是指创建缺省的队列管理器删除队列管理器dltmqm QmgrName启动队列管理器strmqm QmgrName如果是启动默认的队列管理器,可以不带其名字停止队列管理器endmqm QmgrName 受控停止endmqm –i QmgrName 立即停止endmqm –p Qm…

算法运行时间中的对数

【0】README 0.1) source code and text description are from data structure and alg analysis ; 【1】分析算法最混乱的方面大概集中在对数上面, 除分治算法外,可将对数最常出现的规律概括为下列一般法则: 1.1&a…

java项目:永和大王项目_Java项目:书评

java项目:永和大王项目本文是关于这本书的 Peter Verhas撰写的Java Projects Second Edition 我去年写的 这样一篇文章的目的通常是为了促进这本书的销售。 在这种情况下没有什么不同,但是由于这是我写的书,而且我是撰写评论的人,因此赞美这…

Struts2+Hibernate项目中的时间和日期问题

文章目录数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间日期控件日期时间数据展示问题日期时间数据存储问题场景一场景二场景三场景四数据表中的 datetime 的数据如何通过 json 传送给前端仅展示其日期,而不展示时间 数…

把一个人的特点写具体作文_把一个人的特点写具体作文

把一个人的特点写具体作文在日常学习、工作抑或是生活中,大家都跟作文打过交道吧,写作文可以锻炼我们的独处习惯,让自己的心静下来,思考自己未来的方向。那要怎么写好作文呢?下面是小编为大家整理的把一个人的特点写具…