操作系统目录解析代码实现---22
Posted 大忽悠爱忽悠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作系统目录解析代码实现---22相关的知识,希望对你有一定的参考价值。
操作系统目录解析代码实现---22
- “完成全部映射下”的磁盘使用
- 将open弄明白…
- get_dir完成真正的目录解析
- 目录解析 — 从根目录开始
- 读取inode — iget
- 开始目录解析 — find_entry(&inode,name,...,&de)
“完成全部映射下”的磁盘使用
到目前位置,就差open定位文件Inode的过程还没有进行讲解了,本节就对这部分内容源码进行分析。
将open弄明白…
之前讲过open函数的核心,是为了建立下面这条链:
而我们这里关心的是如何从磁盘上将对应文件的inode读取到内存中来
get_dir完成真正的目录解析
操作系统在启动初始化的时候,会将根目录inode赋值给0号进程PCB的root中,然后当fork子进程的时候,子进程都会去继承父进程的root。
- 一上来,先判断是从根路径开始查询,还是从当前路径开始查询,也就是是否是绝对路径,还是相对路径
如果是绝对路径,则从根目录开始查询,先在FCB数组中定位到根目录的FCB,然后根据根目录FCB定位到根目录对应的盘块,然后根据盘块中保存的文件名和对应FCB数组中索引映射关系,找到下一级目录的FCB,然后再根据下一级目录的FCB定位到下一级目录的盘块,然后不断往复,直到定位到最终文件位置。
目录解析 — 从根目录开始
操作系统初始化的时候,需要挂载根目录,具体挂载过程简单来说,就是从磁盘读取出根目录的FCB,然后赋值给当前进程的root (0号进程)
读取inode — iget
iget负责将某个inode从磁盘读取到内存中来,那么就需要确定对应的inode在磁盘中的位置:
- 首先定位超级块的位置,然后跳过引导块和超级块,还有两个位图的位置
- 通过传入的inode的编号,除以每个盘块中存放的inode数量,就可以计算出当前inode位于哪个盘块上
- 然后将对应的盘块从磁盘读取到内存中来
- 从对应的盘块中读取出我们需要的那个inode,因为一个盘块中可以存放多个inode,而操作系统读取磁盘的最小单位为盘块
开始目录解析 — find_entry(&inode,name,…,&de)
遍历当前目录的直接索引块,还有一阶索引,二阶索引,直到匹配成功,就可以获取到对应目录项或者文件的inode编号
while(i<entries)…
如果是绝对路径的话,核心思路就是先获取到根路径的inode,然后获取根路径inode下面所有的目录项,挨个遍历匹配,直到找到对应的匹配的文件或者目录名,判断是否是最终文件,如果不是则iget获取到刚才返回的目录对应的inode,然后重复一开始的操作…
以上是关于操作系统目录解析代码实现---22的主要内容,如果未能解决你的问题,请参考以下文章