Xv6内核分析(十七)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月20日18:48:16 评论 1,124

inode内容分析

1. inode具体内容

磁盘上的Inode具体内容如下:

Xv6内核分析(十七)

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的数据块号,返回此数据块在磁盘上扇区号,如果此数据块还没分配则分配一个。

Xv6内核分析(十七)

  • 如果数据块号在前12以内,首先判断address表中对应记录是否为0,为0则通过balloc分配一个数据块并记录数据块的扇区号,然后返回。
  • 如果数据块号再间接address表中,首先判断间接表是否存在,不存在同样通过balloc分配并记录,接着读取间接块的内容,如果对应的数据块不存在,同样分配一个并记录,由于此记录是更新了磁盘上的数据,所以需要通过log_write回写磁盘。

3. itrunc函数

itrunc回收一个inode的所有数据块。

Xv6内核分析(十七)

  • 首先通过for循环回收前12个数据块,然后将直接address表置0。
  • 如果存在间接address表,则读取间接address表,然后回收间接表中的所有的有效数据块,最后将间接表所在的数据块回收。

4. stati函数

stati用于拷贝inode的信息给上层使用。

Xv6内核分析(十七)

5. readi函数

readi根据指定的偏移位置和大小读取inode数据到指定的位置。

Xv6内核分析(十七)

  • 首先判断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中。

Xv6内核分析(十七)

  • 首先判断inode的类型,如果是设备文件,则调用对应的设备驱动程序中的写函数。
  • 然后对偏移和大小进行检查,保证要写入的数据总量不会超过文件的最大值。
  • 写数据同样是对每一个扇区进行操作,计算要写回的数据量,然后通过memmove写回。
  • 每次写完一个扇区后,都调用log_write写回磁盘。
  • 数据全部写完后,判断文件现在的大小是否超过了原来的大小,如果超过了则更新文件的大小,然后将新的Inode信息更新到磁盘上。
gewenbin
  • 本文由 发表于 2020年12月20日18:48:16
  • 转载请务必保留本文链接:http://www.databusworld.cn/9539.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: