操作系统目录解析代码实现---22

2022-08-23 10:53:20 浏览数 (1)

操作系统目录解析代码实现---22

  • “完成全部映射下”的磁盘使用
  • 将open弄明白…
  • get_dir完成真正的目录解析
  • 目录解析 — 从根目录开始
  • 读取inode — iget
  • 开始目录解析 — find_entry(&inode,name,...,&de)
    • while(i<entries)…

“完成全部映射下”的磁盘使用

到目前位置,就差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,然后重复一开始的操作…


0 人点赞