ウォンツテック

そでやまのーと

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

新規ファイル作成機能、 書き込み機能実装
また、カーネルファイルシステムAPI実装のため各所を大幅に書き換え。

1. メモリ管理回り

 今まではMemHole構造体のポインタをメモリallocする側に渡していたが、それを止めvoid*ポインタを返すように変更した。メモリ管理の内部的に使用中のMemHoleをリストで繋げたmuse_listを用意し、開放時にはポインタ値からmuse_listを線形探索しMemHoleを探し出してfreeしています。 これでカーネル内部でのメモリの扱いが大分楽になったなー。

2. FDC読み書きインタフェース

 論理セクタ番号(512byteを単位としたディスクの先頭からの値)と読み書きセクタ数を指定して渡し、内部でfdc_rowxxx()関数を呼び出して実際に読み書きを行わせる。

3. ファイルシステム

3.1 管理情報

初期化時にルートディレクトリを幹とした全木構造をdentry構造体のダブルリンクリストを使って全て取得。これにより初回読み込み時以外の管理パラメータの変更等は全てメモリ上で行う
SICPやってるせいか、ディレクトリTree取得時の再起構造はすんなり書けました。

3.2 dirty list

実際に書き込みやsuper block, group descriptor, inode等の変更が発生した場合、ただちにディスクには書き込まず一旦メモリ上のdirty管理構造体

typedef struct _ext3_inode_dirty {
  u_int32_t ino;
  ext3_inode* inode;
  struct dlist_set list;
} ext3_inode_dirty;

typedef struct _ext3_block_dirty {
  u_int32_t iblock;
  char* pblock;
  struct dlist_set list;
} ext3_block_dirty;

typedef struct _ext3_dirty {
  int d_super;
  int d_group;
  int d_inobmp;
  int d_blkbmp;
  ext3_inode_dirty d_inodirty;
  ext3_block_dirty d_blkdirty;
} ext3_dirty;

のリストとして連結させておき、ext3_flush()APIを読んだ時に連結されている全てのブロック(inode, データブロックなど)をディスクに書き込んでいる。



この画像は以下の操作をした所

  int fd = ext3_open("/hoge", O_CREAT|O_RDWR, 0);
  ext3_dentry* dentry = FD_TODENTRY(fd);
  _kprintf("file open => ino:%x, name:%s\n",
           dentry->d_inonum, dentry->d_name);
  char buf[16] = {'0', '1', '2', '3', '4', '5', '6', '7',
                  '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
  _kprintf("write to fd:%x\n", fd);
  ext3_write(fd, buf, 16);
  _kputs("-------------- debug info --------------\n");
  ext3_dirty_print();
  _kputs("----------------------------------------\n");
  ext3_flush();
  ext3_ls(rootdir);

"/hoge"ファイルをオープンして、そのinode番号とファイル名を表示、その後にオープンしたファイルディスクリプタに対してbufの書き込みをし、実際書き込む前に全dirtyリスト(新規ファイルのオープンなのでinodeとデータブロックがリストにつながれている)を表示して最後にls。


現段階では
1. 48KB以上のファイルが書き込めない (ext3のブロック階層のため)
2. flushがおかしい(データ部分が消えている)
3. ディレクトリのcreateはまだ出来ない
の問題点あり。


最新コミット
sodex rev.16

次の目標はflushのデバッグとdirectoryの新規作成かな。