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の新規作成かな。