ext2目录项作为链接列表持久化。 从1引用:
目录文件是目录条目结构的链接列表。 每个结构都包含条目的名称,与该条目的数据关联的inode以及目录文件中到下一条目的距离。
但是并不是说inode中有一个终结者。 此外,没有任何字段可以告知目录inode中有多less条目。
所以问题是: 当你读取inode数据结构时,你怎么知道它何时到达列表的末尾?
例如:假设一个空的根目录“/”。 所以命令ls
应该打印出这样的内容:
drwxr-xr-x 4 junji junji 4096 Mar 23 10:33 . drwxr-xr-x 7 junji junji 4096 Mar 23 10:27 .. drwxr-xr-x 7 junji junji 4096 Mar 23 10:27 lost+found
在执行ls
,您已经从磁盘读取了根inode结构,然后按照i_blocks
尝试获取所有的目录条目。 在磁盘上,条目列表实际上存储为:
{inode = 2, rec_len = 12, name_len = 1, name = .} {inode = 2, rec_len = 12, name_len = 2, name = ..} {inode = 12, rec_len = 1000, name_len = 6, name = lost+found} {inode = 12, rec_len = 12, name_len = 1, name = .} {inode = 2, rec_len = 32, name_len = 2, name = ..} ...
第三个“lost + found”条目旁边还有一个条目。
很显然,程序应该停在“lost + found”条目,因为下一个条目即“。” 属于另一个目录。 但是,我们如何让我们的程序知道? 我们什么时候知道这是目录条目列表的末尾?
谢谢!
编辑:
inode列表有一点不一致。 特别是,lost + found条目的rec_len
是1000而不是rec_len
我纠正了它。
我想到了。 目录中的所有条目都应该放入大小固定的数据块中。 对于ext2,数据块是1024。
在上例中,根索引节点只指向一个数据块(即,i_blocks数组只有一个非零元素)。 该数据块中的所有条目都属于根。 除此之外,这是其他一些dirs。
{inode = 2, rec_len = 12, name_len = 1, name = .} {inode = 2, rec_len = 12, name_len = 2, name = ..} {inode = 12, rec_len = 1000, name_len = 6, name = lost+found} {inode = 12, rec_len = 12, name_len = 1, name = .} {inode = 2, rec_len = 32, name_len = 2, name = ..}
如果总结前3个条目的所有rec_len值,则12 + 12 + 1000 = 1024,则它已经是数据块大小。 这是我正在寻找的哨兵信号。 除此之外,它在另一个目录的另一个数据块。