UNIX 7th code reading - data block mapping

はじめに

「itrunc( )が7thと6thではかなり変わっているよ」というコメントを頂きました。


そんなわけで7thのitrunc( )を眺めてみたところ、ある思いが頭によぎりました。続いてbmap( )も眺めてみて、それが確信に変わりました。

「inodeからdata blockへのマッピングの仕様が6thと7thで変わっているな」

というわけで、今回は7thのinodeからdata blockへのマッピングの仕様を解説します。

6thでは

まずは6thのおさらい。6thについては以前書いたのでそちらを参照。


inodeからdatablockへのマッピングの絵を再掲します。

簡単にまとめると、こんな感じです。

  • inodeがファイルの定義をしていて、実際にファイルのデータが入っているブロックは別にある
  • inodeのi_addr[ ]からファイルデータのブロックがマッピングされている
  • マッピングが直接参照か間接参照化はinodeのILARGフラグで決定される
    • ファイルサイズが小さい場合ILARGフラグがオフになり、i_addr[ ]からデータブロックが直接マッピングされている
    • ファイルサイズが大きい場合ILARGフラグがオンになり
      • i_addr[n](n=0-6)からはデータブロックのリストがあるブロックにマッピングされている。これが間接参照
      • i_addr[7]はデータブロックのリストのリストがあるブロックにマッピングされている。これが二重間接参照

7th

続いて7th。

マニュアル

inodeからdata blockへのマッピングの仕様はユーザマニュアルに載っていました。

inodeからdata blockへのマッピング

絵に描くとこんな感じです。

ILARGフラグによる直接・間接参照の区別はなく、i_addr[n]のnで直接参照か間接参照かが決まります。

  • n = 0 - 9(max : 5,120bytes = 512 bytes x 10)
    • direct map(直接参照)
  • n = 10(max : 70,656 bytes = 512 bytes x 128 blocks + 5,120 bytes)
    • indirect map(間接参照)
  • n = 11(max : 8,459,264 bytes = 512 bytes x 128 blocks^2 + 70,656 bytes)
    • double indirect map(二重間接参照)
  • n = 12(max : 1,082,201,088 bytes = 512 bytes x 128 blocks^3 + 8,459,264 bytes)
    • triple indirect map(三重間接参照)


これにより、ソースコードがかなりシンプルになった感があります。


また、この仕様変更がitrunc( ), bmap( )にしか影響が出ていないという事実も興味深い点です。モジュール性が高いと言えるでしょう。(他にもこの仕様変更で影響のでている箇所がありましたらご指摘ください)

終わりに

7thのdata blockマッピングについて、このようなコメントをいただきました。


以前紹介した「UNIXカーネルの設計」に載っていたのも7thの方式でした。

UNIXカーネルの設計

UNIXカーネルの設計

別の見方をすると、6thのdata blockマッピングについてまとめたエントリは、なかなか貴重なものなのかもしれません。(UNIX 6thのユーザマニュアルに載っている話ですけどね)

次回のエントリでは、さらにファイルシステム周りを見ていこうと思います。