気になったことのあれこれ。この広告は、90日以上更新していないブログに表示しています。2.6.11のコードリーディングをしていく。CPUのアーキテクチャは書籍に沿ってIntelのx86とする。今回はrxt2のファイルシステムについて見ていく。ext2ext2は1994年に導入されたファイルシステムでLinuxにとってネイティブのファイルシステムである。ext2の特徴としては以下のようなものが挙げられる。ファイルシステム作成時に扱うファイルの平均サイズの予測からブロックサイズを1~4KBの間で選択可能。ファイルシステム作成時に扱うファイル数の予測から一定サイズあたりのiノード数を選択可能。ファイルの断片化を可能な限り防ぐためファイルの拡張のための隣接する領域を予め確保する。シンボリックリンクの文字列が60文字以下の場合にデータブロックではなくiノードにパス名を保存する。データ構造ext2のパーティションは先頭のブートブロックとその後に末尾まで続く複数のブロックグループから構成される。詳解Linuxカーネル全てのブロックグループは同じ大きさなのでインデックスからその位置を算出することが可能。この仕組みによって同じファイルのデータブロックは同じブロックグループ内に格納しようと試みるので断片化が起こりづらくなる。ブロックグループ内には以下の情報が含まれている。7の累乗番目に存在する。カーネルは使用するのは0番目のもののみだが他のブロックグループにバックアップとして福祉しておくことでプライマリ(0番目)が壊れた際にも復旧(fsck)が可能となる。ブロックグループの個数はパーティションサイズとブロックサイズに依存する。主な制約としては上記のビットマップが単一のブロックに収まる必要があるということ。スーパーブロックスーパーブロックはext2_super_block構造体で定義されている。スーパーブロックはパーティション全体の情報を保持している。ジャーナリングのためのフィールド}グループディスクリプタグループディスクリプタはext2_group_desc構造体で定義されおり、グループ毎の情報が格納されている。グループディスクリプタテーブルの連続する複数のブロックからなる領域にグループの数だけ配置される。*/};データブロックビットマップ及びiノードビットマップ各ビットマップはグループディスクリプタが保持しているグループ内の位置にある単一のブロックで表現される。iノードテーブルiノードテーブルは連続した複数のブロックからなり、複数のiノードが各ブロックに格納される。iノードのサイズは128バイトで、ext2_inode構造体として定義されている。1)ext2_inodeは主にファイルの情報を保持している。拡張属性とはiノードとは別のブロックに配置されるデータ構造で以下のようにブロック上に展開される。拡張属性が展開されるブロックはiノードのi_file_aclメンバで参照される。*/};拡張属性の操作のためのシステムコールには以下のようにものがある。List)はUnixファイルシステムの保護機能として存在し、所有者、グループ、その他の3つの指定方法とは別にそれぞれのファイルにACLを設定し、ユーザまたはグループを指定することでアクセス制御を行う。ACLはiノードの拡張属性(前述)を用いて実現されている。ファイル種別ext2が認識する異なる種別のファイルは異なる方法でデータブロックを使用する。通常ファイル通常のファイルは作成時に空でありデータブロックを必要としない。ディレクトリext2ではディレクトリもファイルとして実装しており、ディレクトリのデータブロックにはファイル名と対応するiノード番号を一組にして保持している。ディレクトリのデータブロックに保持されているのは可変長のデータ構造であるext2_dir_entry_2構造体で以下のように定義されている。*/};nameは4バイトでアラインメントされており\0で埋められる。ファイル種別は以下のように定義されている。EXT2_FT_MAX};シンボリックリンクシンボリックリンクが参照するファイルパスが60バイト未満の場合にはiノードのi_blockメンバ内に保存する。60バイト以上の場合にはパス名の文字列ためのデータブロックが必要となる。デバイスファイル、パイプ、ソケットこの種類のファイルはデータブロックを必要としない。効率的に処理を行うためext2パーティションではファイルシステムのマウント時にほとんどのデータ構造をRAMに読み込む。RAMに読み込むことで頻繁に変更されるデータを効率よく処理することが可能となる。新たなファイルの作成時にext2スーパーブロックのs_free_inodes_countメンバ及び対応するグループディスクリプタのbg_free_inodes_countメンバの値をデクリメントするファイルの拡張時にext2スーパーブロックのs_free_blocks_countメンバと対応するブロックグループディスクリプタのbg_free_blocks_countメンバの値を変更する既存のファイルを更新した際にext2スーパーブロックのs_writeメンバを更新する上記の操作で処理するデータは全てディスク上のext2パーテションのブロックが保持しているため、当該データにはページキャッシュを使用する。ext2のデータ構造とVFSのデータは以下のように対応する。無"常"となっているデータは常にメモリ上に存在する。"動的"となっていデータは参照されている間はキャッシュに置かれる、そのためファイルのクローズや削除、ページフレームの回収などがキャッシュからパージされる可能性がある。ext2スーパーブロックオブジェクトVFSスーパーブロックのs_fs_infoメンバはファイルシステム固有のデータを保持しており、ext2の場合にはext2_sb_info構造体となる。*/};詳解Linuxカーネルext2のマウント時にはext2_fill_super関数を呼び出してext2_sb_infoを初期化する。iノードオブジェクトVFSがディスク上のiノードにアクセスする時に、ディスクのiノードに対応するext2_inode_info型のiノードディスクリプタを生成する。VFSのiノードオブジェクト};ext2のiノードオブジェクトを取得するため関数はext2_alloc_inode関数で、以下のようにスラブキャッシュから確保する。&ei->vfs_inode;}ext2の関数VFSのインターフェースとなっている操作の多くに対してext2は固有の実装を行っている。スーパーブロック操作スーパーブロックの操作には以下のような関数を用意している。ext2_quota_write,#endif};(上記のext2_read_inodeは特に実装が読みやすく、前述のデータ構造からiノードの位置を算出し読み出しているのがよくわかる)iノード動作VFSのiノード操作の一部にExt2固有の実装が存在し、通常ファイル操作はext2_file_inode_operations変数、ディレクトリ操作はext2_dir_inode_operations変数に格納されている。ext2_permission,};シンボリックには高速シンボリックリンク(iノード内にパスの文字列を保持している)と通常のシンボリックリンクの2種類があり以下のように定義されている。generic_removexattr,#endif};iノードがキャラクタデバイス、ブロックデバイス、パイプなどを参照している場合にはiノード操作はファイルシステムに依存せず上記のような別の関数テーブルを参照する。generic_file_sendfile,};上記のうちgeneric_で始まるのは汎用関数でファイルシステム共通の処理となる。データブロックのアドレッシング空でない通常ファイルは一般的に複数のデータブロックから構成されており、以下の手順でファイルのデータが存在するブロックを求める。ファイルのオフセットからファイル内でのブロック番号を求めるファイル内でのブロック番号をパーティション内でのブロック番号に変換する。データブロック番号はext2ではext2_inode構造体のi_blockメンバに格納されており上記でも見た通り以下のように定義されている。i_block[EXT2_N_BLOCKS];デフォルトではi_blockは15となっており、以下のようなかたちで使用される。先頭12個(0~11)はブロック番号が格納されており、ファイルのデータブロックの先頭12個分に対応する。13個目(インデックス:12)は関節ブロックのブロック番号が格納されており、関節ブロック番号に対応するデータブロックにはファイルデータのブロック番号が4バイト毎に保存されている。11までのブロック番号(計1024個)を保持する。14個目(インデックス:13)は3段階の間接ブロックとなっており、間接ブロック番号→間接ブロック番号→データブロック番号となる(計10242個)。15個目(インデックス:14)は4段階の間接ブロックとなっており、間接ブロック番号→間接ブロック番号→間接ブロック番号→データブロック番号となる(計10243個)。»Profile低レイヤ好きのソフトウェアエンジニア。(1)はてなブログをはじめよう!k--onishiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。