前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >操作系统目录解析代码实现---22

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

作者头像
大忽悠爱学习
发布2022-08-23 10:53:20
2960
发布2022-08-23 10:53:20
举报
文章被收录于专栏:c++与qt学习

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


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

在这里插入图片描述
在这里插入图片描述

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


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 操作系统目录解析代码实现---22
  • “完成全部映射下”的磁盘使用
  • 将open弄明白…
  • get_dir完成真正的目录解析
  • 目录解析 — 从根目录开始
  • 读取inode — iget
  • 开始目录解析 — find_entry(&inode,name,…,&de)
    • while(i<entries)…
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档