创建文件需要做的工作:
- 需要创建
inode
。文件需要inode来描述大小,位置等信息。我们需要向inode_bitmap
中申请向量位图来获取inode号,此时会更新inode_bitmap。inode_table中的项也会由新的inode填充 - 向
block_bitmap
申请可用位来获取可用的块,填入inode->i_sector
,即文件具体存储的扇区地址(简便起见,此处1块等于1扇区)。block_bitmap
会更新,分区的数据区data_start_lba
后的某个扇区也会被分配。 - 新创建的文件存在于某个目录,该目录的
inode->i_size
会增加目录项的大小,新的文件对应的目录项需要写入该目录的inode->i_sectors[]
中的某个扇区,原有的扇区可能已经满了,可能需要申请新的扇区来存储目录项。 - 如果其中的某个步骤操作失败了,需要回滚到之前已成功的操作。回滚的设计是为了保证操作的原子性
- 将
block_bitmap
,block_bitmap
,新的inode,目录的inode这些在内存中的数据同步到硬盘中。
写完了open中的对根目录文件的create的处理
来看一下效果
- 先看磁盘分区的data_start的lba,此处是
0xA8B
,这是扇区号,乘上512是0x151600
>
我们用hexdump看一下这个目录项的内容
每个目录包含三个部分的内容,依次为16字节的filename
,4字节的inode编号i_number
,还有4字节的文件类型f_type
。
可以看到,当前目录有两个目录项
第一个目录项目从0x151600
开始。
第二个目录项从0x151618
开始,2E2E
是..
的filename,也是目录项的开始。
-
0x00151630
的地方是第三个文件test的目录项,从图中可以看出,test文件的i_number是1,即它的inode编号是1,紧随根目录inode为0的编号。最后是f_type,值为1,说明式普通文件的FT_REGULAR.