ウォンツテック

そでやまのーと

OS作成 - ファイルシステム編

一通り読んだけど具体的な実装回りになると今一分からなくなっててきたのでとりあえずFD限定で考えてみる。

Ext3 レイアウト

  • 一つのパーティションをブロックグループという単位で管理するが、FDの場合は容量が少ないので1つで十分
  • ブロックグループは複数のブロックを管理するグループだが、後々実装予定であるページングのページサイズに合わせて、ブロックのサイズは4KBとする。
  • ブロックグループはブロック単位で以下のようなフォーマットになっている
ブロック0 ブロック1 ブロック2 ブロック3 ブロック4..n ブロック(n+1)...
ブートブロック&スーパーブロック グループディスクリプタ ブロックビットマップ iノードビットマップ iノードブロック データブロック

※ブートブロックは先頭の512バイトの領域でスーパーブロックは先頭から1KB目に配置される。

スーパーブロック

FSの構成に関する情報が格納されている。とりあえず最初の一歩として必要そうなのをざっと洗い出すと

・iノード総数 128個
 (1ブロックに32個のiノードが配置出来るので、とりあえず
  4ブロック分ほど確保)
・ブロック総数 360 
  (1.44MBなので4KB * 360)
・空きブロック数 352
  (360 - ブロック0〜3 - iノードブロック数)
・空きiノード数 125個
 (とりあえず「/」と「.」と「..」?)
・使用可能な最初のブロック番号 8
 ブロック0〜3 + iノードブロック数後の番号)
・ブロックサイズ  2 (4KB)
  (2^x * 1KB)

他にもいろいろあるけど。

グループディスクリプタ

ブロックグループの管理情報を格納
1グループの管理情報は32バイト必要なので1ブロックには4KB/32B=128グループ分入る。FDでは1グループで十分なので32バイト分のみ。

・ブロックビットマップのブロック番号 2
・iノードビットマップのブロック番号 3
・iノードブロックの開始ブロック番号 4
・空きブロック数 352
  (1グループしかないのでスーパーブロックと同じ値)
・空きiノード数 125
・ブロックグループ内のディレクトリ数 1?

ブロックビットマップ

空きブロックをbitで管理する 11111111000...0かな。
(ブロック0から〜iノードビットマップブロックまでは使用中とする)

iノードビットマップ

空きiノードをbitで管理する
「/」「.」「..」で3つiノードを使っているので 111000...0かな。

iノードテーブル

当座必要そうなパラメータは

・ファイルサイズ
・リンク数
・使用ブロック数
・データブロックの番号 
 (u32の15個の配列で12個まではブロック番号をそのまま入れる。
 13〜15までは第1〜第3間接ブロック用だけどとりあえず使わない)

これだけでいけそうな気がする

ディレクト

ディレクトリはファイルの一種でデータブロックに以下の構造体として配置されている

・iノード番号
・ディレクトリエントリの長さ
・ファイル名の長さ
・ファイルの種類
・ファイル名


まずはこのフォーマットでFD用のimageファイルを作るtoolをC++で書いて、リンカスクリプトでkernelのレイアウトを再配置。その後にディスク上の構造体をメモリにコピーしてメモリ上の値からファイルを読み取るKernel APIを書いてみるかな。