Linuxの基本的なファイルシステムの1つであるExt2について、ステップごとに実装し、動かして、ファイルシステムの基本的な仕組みを体験して、理解していきます。
普段使用しているシステムコールから、いったいどのようにファイルシステムが駆動していくのでしょうか?
実際のLinuxのソースコードから少しずつ実装・開発して、見ていきましょう。
下記注意を熟読頂いて、すべてご納得頂いてからダウンロードしてくださいますようお願いいたします。
【注意1】C言語の説明記述はありません。C言語はポインターおよびファンクションポインターを理解している、初級者レベルで十分だと思います。
【注意2】説明が非常に長いです。このため、校正はできておらず、誤字・脱字はたくさんあります。そして、日本語もおかしなところが随所にみられます。ご理解いただけますようお願いいたします。
【注意3】作成に時間がかかってしまったため、説明に使用しているカーネルのバージョンは古いです。現在のカーネルバージョンでは、記述と異なることがあります。
【注意4】説明に使用しているプログラム例は、Linuxカーネルのソースが行う処理と、ほぼ同じ(ほとんどコピーです)ように見えますが、劣化版です。プログラムは間違っている可能性がおおいにあります。説明で使用したソースコードは、この説明以外には使用しないでください。
【注意5】説明に使用しているプログラム例は、Linuxカーネルのプログラム規約にまったく則っておりません。このため、Linuxカーネルの開発を目指したい方にとっては苦痛である可能性があります。Linuxカーネルのドキュメンテーションを参照してください。
【注意6】作者は普段、Linuxは一切使っておりません。このため、Linuxについての知識・経験は浅く、素人です。説明が正しいとは限りません。ご理解頂きますようにお願いいたします。
【注意7】説明は長く、面白いものでもありません。真面目にすると1か月から2か月を要します。数ページで確実に飽きてしうと思います。忙しい方は、ダウンロードしても無駄になる可能性があることをご考慮頂きますように、お願いいたします。
【注意8】本書の内容はご期待に沿えないものである可能性が十分にあります。少しでも不安だと感じる場合、お勧めはしません。カーネルモジュールを作った経験があれば、本書の役割はほとんど無いでしょう。
【注意9】本書がなくても、Linuxのソースコードを見れば、ファイルシステムは理解できると思います。よくお考えください。
[目次]
ファイルシステムの概要
ファイルシステムへのアクセス
カーネルサイドから見たシステムコール
簡単なシステムコールの実装
ファイルシステム関連のシステムコール
仮想ファイルシステム(VFS)
ステップ0 Ext2ファイルシステムと簡単なモジュールの実装
ステップ1 Ext2ファイルシステムタイプとマウントメソッド
ステップ2 Ext2スーパーブロックの読み込み
Ext2ファイルシステムのディスク格納構造
スーパーブロックの読み込み
ページキャッシュとバッファーキャッシュ概要
ステップ3 スーパーブロック管理情報
ステップ4 マウントとスーパーブロックオブジェクト
ルートディレクトリのdエントリーのセットアップ
ステップ5 スーパーブロックオブジェクトと管理情報のセットアップ
ステップ6 ブロックグループディスクリプターの読み込み
ステップ7 ルートディレクトリのinode読み込み
ディスクinode
inodeオブジェクト
inode管理情報
inode管理情報のメモリー割り当てについて(スラブアロケーター)
inodeの読み込み
ステップ8 簡単なディレクトリの読み込み
lsで"."と".."エントリーを表示させる
ディレクトリエントリー
ステップ9 ディレクトリ読み込みとページキャッシュとaddress_space
address_space構造体とページキャッシュ
ディレクトリ読み込みとページキャッシュ
ステップ10 inodeオブジェクトのlookupメソッド
ステップ11 inodeオブジェクトのmkdirメソッドとper-cpuカウンター
新規inode割り当て
per-cpu変数
per-cpuカウンター
空のディレクトリ作成
ステップ12 簡単なブロックの新規割り当て処理
新規ブロックの割り当てのトリガーとなるaddress_spaceメソッド
get_block_tコールバック関数の新規ブロック割り当て処理
likelyマクロとunlikelyマクロ
ステップ13 スーパーブロックオブジェクトのwrite_inodeメソッド
inodeの書き込み処理 write_inodeメソッド
inodeの事前読み込み
ステップ14 Orlov方式による新規ディレクトリのinodeを割り当てるブロックグループ選択
ステップ15 inodeオブジェクトのrmdirメソッドとunlinkメソッド
ステップ16 inodeオブジェクトのrenameメソッド
ステップ17 inodeオブジェクトのcreateメソッドとファイルオブジェクトの汎用メソッド
ステップ18 inodeオブジェクトのlinkメソッド
ステップ19 シンボリックとinodeオブジェクトのsymlinkメソッド
ステップ20 inodeオブジェクトのmknodメソッドとtmpfileメソッド
ステップ21 スーパーブロックオブジェクトのevict_inodeメソッド
evict_inodeメソッド
ブロックの解放処理
inodeの解放処理
ステップ22 スーパーブロックオブジェクトのsync_fsメソッド
ステップ23 スーパーブロックオブジェクトのstatfsメソッドとメモリーバリアー/フェンス
statfsメソッド
メモリーバリアー/メモリーフェンス smp_rmb()マクロとsmp_wmb()マクロ
ステップ24 スーパーブロックオブジェクトのremount_fsメソッドとマウントオプション解析
ステップ25 スーパーブロックオブジェクトのshow_optionsメソッドとprocfs
procファイルシステム
シーケンシャルファイル(seq_file)
show_optionsメソッド
ステップ26 カーネルオブジェクトとsysfs
ステップ27 スーパーブロックオブジェクトのfreeze_fs/unfreeze_fsメソッド
ステップ28 ファイルオブジェクトのioctlメソッド
ステップ29 ファイルオブジェクトのsetattrメソッド
ステップ30 address_spaceのdirect_IOメソッド
ステップ31 リザベーションウィンドウ
ステップ32 拡張アトリビュートその1 ハンドラーの呼び出し
ステップ33 拡張アトリビュートその2 コア処理
ステップ34 POSIX ACLその1 ハンドラーの呼び出し
ステップ35 POSIX ACLその2 コア処理
ステップ36 ディスククォータ
Tips カーネルの再構築
ファイルシステム関連のシステムコール一覧
インデックス
普段使用しているシステムコールから、いったいどのようにファイルシステムが駆動していくのでしょうか?
実際のLinuxのソースコードから少しずつ実装・開発して、見ていきましょう。
下記注意を熟読頂いて、すべてご納得頂いてからダウンロードしてくださいますようお願いいたします。
【注意1】C言語の説明記述はありません。C言語はポインターおよびファンクションポインターを理解している、初級者レベルで十分だと思います。
【注意2】説明が非常に長いです。このため、校正はできておらず、誤字・脱字はたくさんあります。そして、日本語もおかしなところが随所にみられます。ご理解いただけますようお願いいたします。
【注意3】作成に時間がかかってしまったため、説明に使用しているカーネルのバージョンは古いです。現在のカーネルバージョンでは、記述と異なることがあります。
【注意4】説明に使用しているプログラム例は、Linuxカーネルのソースが行う処理と、ほぼ同じ(ほとんどコピーです)ように見えますが、劣化版です。プログラムは間違っている可能性がおおいにあります。説明で使用したソースコードは、この説明以外には使用しないでください。
【注意5】説明に使用しているプログラム例は、Linuxカーネルのプログラム規約にまったく則っておりません。このため、Linuxカーネルの開発を目指したい方にとっては苦痛である可能性があります。Linuxカーネルのドキュメンテーションを参照してください。
【注意6】作者は普段、Linuxは一切使っておりません。このため、Linuxについての知識・経験は浅く、素人です。説明が正しいとは限りません。ご理解頂きますようにお願いいたします。
【注意7】説明は長く、面白いものでもありません。真面目にすると1か月から2か月を要します。数ページで確実に飽きてしうと思います。忙しい方は、ダウンロードしても無駄になる可能性があることをご考慮頂きますように、お願いいたします。
【注意8】本書の内容はご期待に沿えないものである可能性が十分にあります。少しでも不安だと感じる場合、お勧めはしません。カーネルモジュールを作った経験があれば、本書の役割はほとんど無いでしょう。
【注意9】本書がなくても、Linuxのソースコードを見れば、ファイルシステムは理解できると思います。よくお考えください。
[目次]
ファイルシステムの概要
ファイルシステムへのアクセス
カーネルサイドから見たシステムコール
簡単なシステムコールの実装
ファイルシステム関連のシステムコール
仮想ファイルシステム(VFS)
ステップ0 Ext2ファイルシステムと簡単なモジュールの実装
ステップ1 Ext2ファイルシステムタイプとマウントメソッド
ステップ2 Ext2スーパーブロックの読み込み
Ext2ファイルシステムのディスク格納構造
スーパーブロックの読み込み
ページキャッシュとバッファーキャッシュ概要
ステップ3 スーパーブロック管理情報
ステップ4 マウントとスーパーブロックオブジェクト
ルートディレクトリのdエントリーのセットアップ
ステップ5 スーパーブロックオブジェクトと管理情報のセットアップ
ステップ6 ブロックグループディスクリプターの読み込み
ステップ7 ルートディレクトリのinode読み込み
ディスクinode
inodeオブジェクト
inode管理情報
inode管理情報のメモリー割り当てについて(スラブアロケーター)
inodeの読み込み
ステップ8 簡単なディレクトリの読み込み
lsで"."と".."エントリーを表示させる
ディレクトリエントリー
ステップ9 ディレクトリ読み込みとページキャッシュとaddress_space
address_space構造体とページキャッシュ
ディレクトリ読み込みとページキャッシュ
ステップ10 inodeオブジェクトのlookupメソッド
ステップ11 inodeオブジェクトのmkdirメソッドとper-cpuカウンター
新規inode割り当て
per-cpu変数
per-cpuカウンター
空のディレクトリ作成
ステップ12 簡単なブロックの新規割り当て処理
新規ブロックの割り当てのトリガーとなるaddress_spaceメソッド
get_block_tコールバック関数の新規ブロック割り当て処理
likelyマクロとunlikelyマクロ
ステップ13 スーパーブロックオブジェクトのwrite_inodeメソッド
inodeの書き込み処理 write_inodeメソッド
inodeの事前読み込み
ステップ14 Orlov方式による新規ディレクトリのinodeを割り当てるブロックグループ選択
ステップ15 inodeオブジェクトのrmdirメソッドとunlinkメソッド
ステップ16 inodeオブジェクトのrenameメソッド
ステップ17 inodeオブジェクトのcreateメソッドとファイルオブジェクトの汎用メソッド
ステップ18 inodeオブジェクトのlinkメソッド
ステップ19 シンボリックとinodeオブジェクトのsymlinkメソッド
ステップ20 inodeオブジェクトのmknodメソッドとtmpfileメソッド
ステップ21 スーパーブロックオブジェクトのevict_inodeメソッド
evict_inodeメソッド
ブロックの解放処理
inodeの解放処理
ステップ22 スーパーブロックオブジェクトのsync_fsメソッド
ステップ23 スーパーブロックオブジェクトのstatfsメソッドとメモリーバリアー/フェンス
statfsメソッド
メモリーバリアー/メモリーフェンス smp_rmb()マクロとsmp_wmb()マクロ
ステップ24 スーパーブロックオブジェクトのremount_fsメソッドとマウントオプション解析
ステップ25 スーパーブロックオブジェクトのshow_optionsメソッドとprocfs
procファイルシステム
シーケンシャルファイル(seq_file)
show_optionsメソッド
ステップ26 カーネルオブジェクトとsysfs
ステップ27 スーパーブロックオブジェクトのfreeze_fs/unfreeze_fsメソッド
ステップ28 ファイルオブジェクトのioctlメソッド
ステップ29 ファイルオブジェクトのsetattrメソッド
ステップ30 address_spaceのdirect_IOメソッド
ステップ31 リザベーションウィンドウ
ステップ32 拡張アトリビュートその1 ハンドラーの呼び出し
ステップ33 拡張アトリビュートその2 コア処理
ステップ34 POSIX ACLその1 ハンドラーの呼び出し
ステップ35 POSIX ACLその2 コア処理
ステップ36 ディスククォータ
Tips カーネルの再構築
ファイルシステム関連のシステムコール一覧
インデックス