文件系统: i节点与磁盘文件
:
首先提出我的一些问题:
1. 文件描述符fd 、文件对象、i节点、磁盘文件之间是什么关系???
a) 文件对象:表示进程已经打开的文件在内存中的表示,该对象不是物理上的文件,
b) 文件对象在内存中有一段存储内容。
c) 每一个文件对象都包含:文件的状态信息、内存中存储文件内容的缓冲区指针,以及当前文件的读写位置等。在文件对象中,存有文件的iNode节点信息。
d) 文件描述符-------》文件对象------》iNode节点-------》磁盘文件
2. 如何将一个字符串形式的路径名,转换为一个文件在内核中的iNode号??
3. iNode节点都有哪些信息???
4. 如何才能由i节点定位到文件在磁盘上的物理地址的???
1》 目录文件中存有每一个文件的文件名和该文件名所对应的iNode号。
2》 iNode_table文件即:iNode节点表文件,该文件存有iNode号和该iNode号节点的结构体指针, 在iNode节点中存有该iNode节点所指向的在磁盘上的磁盘块的指针。
3》 每一个iNode节点,都对应有一个磁盘文件,该文件要么是目录项或者是普通文件
4》 要点:
1. iNode节点都有哪些信息??
a) 每一个iNode节点都有一个描述它的磁盘数据结构,在iNode节点中存有该iNode节点所对应的文件在磁盘上的数据块的指针和文件的数据块数。
2. 目录文件的作用:
a) 完成文件名到iNode号的映射。
b) 即:给定一个文件名找出其所对应的iNode号。
3. 每一个iNode节点都能唯一定位一个磁盘文件。
4. 在磁盘上,存储的有两种文件:
a) 1目录文件
b) 普通文件
5. 我们来看一下,磁盘结构:
如何将一个字符串形式的路径名,转换为一个文件在内核中的iNode号?????
实例:/home/my/code/test.c
这个工作流程:
1. 首先:把这个路径名拆分成一个个文件名序列,除了最后一项以外,所有的文件名都必定是目录。
在这里是: home、 my 、 code、test.c
2. 内核会存有一个根目录文件,然后内核会把分析出的第一个文件名home,与根目录中的文件名进行匹配,如果找到匹配项,则把该目录项的iNode号提出出来,home的iNode号是2
3. 内核得到一个iNode号,便会在iNode_table 中找到该iNode 号所对应的文件在磁盘上的数据块地址,然后,根据数据块的地址,把文件内容读取到内存当中。
4. 然后继续分析下一个文件名。
5. 重复以上工作。
我们发现,home文件名的iNode号的磁盘文件是一个目录文件,该目录文件中的iNode号指向的又是一个目录文件,只有路径名中的最后一个文件名的iNode节点号所对应的磁盘文件是一个普通文件。因此,把此普通文件读取到内存中。