到目前位置,就差open定位文件Inode的过程还没有进行讲解了,本节就对这部分内容源码进行分析。
之前讲过open函数的核心,是为了建立下面这条链:
而我们这里关心的是如何从磁盘上将对应文件的inode读取到内存中来
操作系统在启动初始化的时候,会将根目录inode赋值给0号进程PCB的root中,然后当fork子进程的时候,子进程都会去继承父进程的root。
如果是绝对路径,则从根目录开始查询,先在FCB数组中定位到根目录的FCB,然后根据根目录FCB定位到根目录对应的盘块,然后根据盘块中保存的文件名和对应FCB数组中索引映射关系,找到下一级目录的FCB,然后再根据下一级目录的FCB定位到下一级目录的盘块,然后不断往复,直到定位到最终文件位置。
操作系统初始化的时候,需要挂载根目录,具体挂载过程简单来说,就是从磁盘读取出根目录的FCB,然后赋值给当前进程的root (0号进程)
iget负责将某个inode从磁盘读取到内存中来,那么就需要确定对应的inode在磁盘中的位置:
遍历当前目录的直接索引块,还有一阶索引,二阶索引,直到匹配成功,就可以获取到对应目录项或者文件的inode编号
如果是绝对路径的话,核心思路就是先获取到根路径的inode,然后获取根路径inode下面所有的目录项,挨个遍历匹配,直到找到对应的匹配的文件或者目录名,判断是否是最终文件,如果不是则iget获取到刚才返回的目录对应的inode,然后重复一开始的操作…