[LINUX]文件绝对路径到索引节点之间的转换

文件绝对路径到索引节点之间的转换算法:(system V系统,这个算法的特点是比较简单容易理解,相对的,对于某些特殊场景,其性能一般)。算法的输入是一个绝对路径,而输出是一个inode节点的编号。

  • ①目录的存储格式:目录以前规定不超过14个字符,而目录类型的inode都是前面预留的,所以目录的inode编号一般也比较小,基本上就是2个字节存储,所以一个目录表项的结构大小是16字节(linux很多都是宁可浪费一点点的资源,比如空间资源,也将结构体设计得比较简单一些的思路,比如这里的目录表项结构,其实可以设计成可变长度,但是那样代码维护起来困难,而且读写性能也一般,再想想,平时在做性能优化的时候多数都是通过空间来换取时间,为何不在一开始的时候,就设计一些简单的结构体换取相对良好的性能呢?),这里面的每个表内容很简单,前两个字节是inode编号,后面14个字节是对应的目录或者文件的名字,类似于key,value的一张表。
  • ②路径转换成inode:首先将路径根据/符号进行分割,一开始是/,/表示根目录,在文件系统创建的时候,mkfs的时候,就会创建这么一个根节点目录,并存储在全局变量中,这个就是根节点,能否改变?其实可以的,在某个进程中可以用chroot系统调用,改变该进程的根节点inode编号(这个就是changeroot的实现原理,其实就是做一个系统调用,将这个全局变量的值替换掉,这样就可以从一个指定的目录开始作为根目录了),②有了根目录的inode之后,读取该inode通常在高速缓冲中,然后根据其磁盘块指针(应该是很小的,直接指针,找到对应的磁盘块,理论上应该也在高速缓冲中),从这里面就可以获取到目录表项,然后查询两个/之间的那个文件的名称,如果有,再看下当前进程的用户是否有权限搜索、读取目录等,类似于权限控制,如果有的话,就把这个节点的inode号得到,然后再重复前面的过程,根据inode号得到磁盘块指针,再获取目录表项,这样递归的寻找下去,最好找到所需的文件或者目录。目录虽然存储在磁盘上,但是多数都是在高速缓冲中,所以实际操作起来并不慢的。这样最后就可以实现将一个绝对路径名称转换成一个inode节点编号的算法了。
  • ③当然这个是简化的版本,中间可能还有一些权限校验、异常处理等,尤其是文件、目录名字的异常。linux文件系统实际就是将系统的树形结构分布再各个目录文件中的方式来存储这颗树的。存储比较方便,使用的时候需要进行一些遍历查询。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值