码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 操作系统目录解析代码实现---22


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

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


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

    在这里插入图片描述
    到目前位置,就差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

    在这里插入图片描述
    如果是绝对路径的话,核心思路就是先获取到根路径的inode,然后获取根路径inode下面所有的目录项,挨个遍历匹配,直到找到对应的匹配的文件或者目录名,判断是否是最终文件,如果不是则iget获取到刚才返回的目录对应的inode,然后重复一开始的操作…


  • 相关阅读:
    动作捕捉系统用于苹果采摘机器人
    全量知识系统 详细程序设计 之“编程理念”(Q&A SmartChat)
    Redis基本数据类型与基本操作
    微服务17:微服务治理之异常驱逐
    井水,矿泉水等饮用水去除氟离子树脂技术
    源码的角度分析Vue2数据双向绑定原理
    【Linux基础】第31讲 Linux用户和用户组权限控制命令(三)
    本地部署 川虎 Chat
    【PAT甲级 - C++题解】1011 World Cup Betting
    天龙八部科举答题问题和答案(全4/8)
  • 原文地址:https://blog.csdn.net/m0_53157173/article/details/126300122
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号