inode内容分析
1. inode具体内容
磁盘上的Inode具体内容如下:
inode的数据块在磁盘上的位置由inode的address表来记录,address表分为直接表和间接表,直接表共有12项,间接表最多有128项(512 / 4)。其中address1~address12记录的是inode的数据在磁盘上的扇区号,Indirect记录的是Inode的间接address表在磁盘上的扇区号。可以看出,一个Inode最多可以有12+128=140个数据块,每个数据块512字节,也就是说在xv6下一个文件最大为70KB。其中前6KB的数据块可以从直接address表中找到,后64KB的数据块就需要通过间接address表来寻找。
2. bmap函数
bmap通过给定的inode的数据块号,返回此数据块在磁盘上扇区号,如果此数据块还没分配则分配一个。
- 如果数据块号在前12以内,首先判断address表中对应记录是否为0,为0则通过balloc分配一个数据块并记录数据块的扇区号,然后返回。
- 如果数据块号再间接address表中,首先判断间接表是否存在,不存在同样通过balloc分配并记录,接着读取间接块的内容,如果对应的数据块不存在,同样分配一个并记录,由于此记录是更新了磁盘上的数据,所以需要通过log_write回写磁盘。
3. itrunc函数
itrunc回收一个inode的所有数据块。
- 首先通过for循环回收前12个数据块,然后将直接address表置0。
- 如果存在间接address表,则读取间接address表,然后回收间接表中的所有的有效数据块,最后将间接表所在的数据块回收。
4. stati函数
stati用于拷贝inode的信息给上层使用。
5. readi函数
readi根据指定的偏移位置和大小读取inode数据到指定的位置。
- 首先判断inode的类型,如果是设备文件,则调用对应的设备驱动程序中的读函数。
- 然后对偏移和大小进行检查,如果偏移加大小超过文件的大小,那么读取的字节数自动调整为偏移到文件末尾的大小。
- off/BSIZE表示将偏移起始地址转换为Inode的数据块号。 通过bmap得到对应的扇区号,然后读取到buffer cache。n-tot表示还剩多少字节没有读取,off%BSIZE表示off偏移在数据块中的偏移,BSIZE - off%BSIZE表示在一个数据块中剩余的字节数。(n - tot), (BSIZE - off%BSIZE)中的最小者表示当前需要读取的字节数。可以看出,数据读取是按每一个扇区来计算每一次要读取的字节数的。
- bp->data + off%BSIZE表示在当前扇区中的起始读位置,通过memmove将数据复制到目的地址。
6. writei函数
writei将指定的偏移位置和大小的数据写到inode中。
- 首先判断inode的类型,如果是设备文件,则调用对应的设备驱动程序中的写函数。
- 然后对偏移和大小进行检查,保证要写入的数据总量不会超过文件的最大值。
- 写数据同样是对每一个扇区进行操作,计算要写回的数据量,然后通过memmove写回。
- 每次写完一个扇区后,都调用log_write写回磁盘。
- 数据全部写完后,判断文件现在的大小是否超过了原来的大小,如果超过了则更新文件的大小,然后将新的Inode信息更新到磁盘上。
评论