みかん本輪読会 17章 ファイルシステム
ファイルとは p.396 - 任意のバイト列に名前等をつけたもの ちなみに授業では - 大量の情報を保持できること - 情報は使用したプロセスが失われても残ること - 他の複数のプロセスからも利用できること → 上記3つの要求に応える具体的な解答
ブロックデバイス p.396 - データの記録にはファイルは必須ではない - SSDやUSBメモリはデータ領域が固定の大きさをもつブ ロックに分割されて、ブロック単位で読み書き → ブロックデバイスと呼ぶ - 1ブロックで足りないデータは複数個繋げれば良い - データの大きさが変化しなければうまく機能する → データが大きすぎても小さすぎてもダメ柔軟性なし
ファイルシステム p.396 - 管理データの置き方やブロックの割り当て方によって 様々なファイルシステムがある → linuxだとext4やbtrfs windowsだとFAT16/32やNTFS、exFAT macだとHFS、HFS+、APFS 他にもZFSやColossusなど - UEFI規格ではFATが標準的に用いられる
ファイル方式のメリット p.396 - データに名前をつけて管理 - 名前とブロック番号の対応表を使用する - 対応表のおかげで複数の区画でデータを記録可能 - 動的にブロックの割り当てが可能 → 名前とブロック番号の対応表を管理する機能を中心と した仕組みをファイルシステムと呼ぶ
FATのボリュームイメージを作る p.396~397 - ddコマンドはifで指定したファイルからofで指定したファ イルにコピーする - /dev/zeroはゼロが無限に読み出せる - bsはddが1度にコピーする大きさ(ブロックサイズ) - countはコピーするブロックサイズ - 結局は128MiBだけifからofにコピーされる - mkfs.fatはFAT形式でフォーマットするコマンド
ボリュームイメージを見てみる p.397
ボリュームイメージに書き込み p.397~398 - ボリュームをマウントして適当なテキストファイルをコ ピー - hexdumpする
更にボリュームイメージに書き込み p.398~399 - 大文字小文字混合の8文字以上のファイル名にする - ファイル名がOSAKAI~1DATになっている 中身はそのまま
BIOS パラメータブロック p.400 - これまでに作成したボリュームイメージは1つのパー ティションを表している → ブロックデバイスを複数に分割した1つの領域 - パーティションの先頭1ブロックをPBRと呼ぶ → パーティションの大きさやどこから始まるかの情報 - PBRの中でもBPBと呼ばれる領域が特に重要 表17.2
ディレクトリ p.402 - ファイルシステムの構成を管理するためのファイル で、複数のファイルやディレクトリを格納可能 - FATでは特殊なファイルとして表現 - ディレクトリエントリという32バイトのデータ構造が配 列状に並んだ構造
FATファイルシステムでのディレクトリエントリ
ボリュームを読み出す p.403 - BPBの値からルートディレクトリの位置を取得し、その 中身をディレクトリエントリの構造に従って読めばボ リュームイメージ内のファイルの一覧を得られる - しかしボリュームイメージをメモリに読み出す方法が まだ分からない → 具体的にはブロックデバイスからの読み出し方法
ブロックデバイスからの読み出し p.403 - 一般的なOSではドライバが準備されている - ドライバを開発するのはすごく大変 → UEFIにあるBlock I/O Protocolを使う - OSが起動する前にブロックデバイスのデータをまとめ て読み出す - OSはブートローダーがメモリ上に読み出したデータを読 み込む
ボリュームイメージの読み込み p.404 - リスト17.1はボリュームイメージを読み出す処理 - 前半は起動メディアにfat_diskがあるか調べる - なければ全体を読み込みボリュームイメージを探す - ファイルはkernel.elfを読み込む処理と同じ - ReadFileにファイルを渡すとvolume_imageに戻す - fat_diskがない場合はBlock I/O Protocolを用いて起 動メディアの先頭ブロックから読み込む
Block I/O Protocol p.404~410 - OpenBlockProtocolForLoadImage()でBlock I/O Protocolを取得しblock_io変数に設定 - block_io->Mediaにはブロックデバイスの各種情報 - BlockSizeとLastBlockで最大サイズ(byte)を求める - volume_byte(全体のサイズ)は16MB → 全体を読み込むとメモリがなかったり時間がかかる - ReadBlocks()でデータを読み込む
lsコマンド p.410~414 - OSがボリュームイメージを受け取れるようになったので lsコマンドが作れる → ボリュームに含まれるファイルの一覧を出す - リスト17.10で実装 → ルートディレクトリの先頭ポインタを取得しforでルート ディレクトリの中身を順に表示する