MochiOS@仮想ファイルシステムの作成part5
前提知識無しで作るなんちゃって仮想ファイルシステムpart5。
開発日記です。独り言です。
これまでのあらすじ
part | 内容 |
---|---|
0 | 仮想ファイルシステムを作りたい宣言をする。 |
1 | ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 |
2 | カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 |
3 | ログ出力の為に使うvsnprintf()の仕様を調べる。 |
4 | ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 |
共通メッセージフォーマットを決める
ようやっとタイトルに相応しい内容が書ける。メッセージフォーマットを決めます。
まぁ、mvfsライブラリでその他のプロセスにはメッセージを隠蔽するので適当に作ればいいのだけれど、設計して書き残しておかないと忘れちゃうよね~。
とりあえず、以下のようなフォーマットとしておく。
offset | size | 内容 |
---|---|---|
0x00 | 4 | 機能ID |
0x04 | 4 | タイプ(要求/応答) |
0x0c | 可変 | 機能ID毎のデータ |
ただ、このフォーマットだと後々に色々と問題が出てくる。要求と応答メッセージの対応が分からない、とか。一旦リリースした後に改変したくなった時にバージョン違いとの互換性をどうするか、とか。
でも、今は考えない。困ったら考えよう。行動力第一。
以下、機能IDとタイプの値を決めておく。
機能ID | 意味 |
---|---|
0x0000_0000 | mount |
0x0000_0001 | open |
0x0000_0002 | read |
0x0000_0003 | write |
0x0000_0004 | close |
0x0000_0005 | unmount |
タイプ | 意味 | 備考 |
---|---|---|
0x0000_0000 | 要求 | mvfsへのメッセージ |
0x0000_0001 | 応答 | mvfsからのメッセージ |
mount要求メッセージ
とりあえず、マウントするパスの場所が分かればいいので、次のようにした。
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0000 | mount |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0000 | 要求 |
0x08 | 1024 | 絶対パス(\0含む) | - | - |
絶対パスは、例えば、"/serial"。
ルート以外のディレクトリ機能は後回しにするので、"/dev/serial"みたいに指定しちゃダメって事にする。
mount応答メッセージ
とりあえず、成功か失敗かあればいいっしょ!?
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0000 | mount |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0001 | 応答 |
0x08 | 4 | 処理結果 | 0x0000_0000 0x0000_0001 |
成功 失敗 |
ファイル・ディレクトリ管理方法
mountはじゃあ何させようかなぁ、とその前にファイルやディレクトリってどう管理しようかという事を決めてなかったので、テキトーに決める。
マウントするファイルやディレクトリはノードというオブジェクトで管理することにする。
ノードには、パス名、タイプ、マウントタスクID、エントリリストへのポインタの情報を持たせ、C標準ライブラリのmalloc()を使って確保する。
今の段階では、タイプにマウントファイル、ディレクトリの2つを用意する。たぶん、これにマウントディレクトリを後で追加するかなぁ。
マウントファイルはマウントしてきたタスクIDと関連付けて、このファイルへのopen()やread()、write()、close()は全部そのタスクIDに横流しする。
ディレクトリは単純にディレクトリ。エントリリストを持たせて、配下のファイルやディレクトリのノードへの参照にする。(まだ決めないけど、マウントディレクトリの場合はマウントファイルと同じで、マウントしたタスクIDへの横流しかな。)
エントリリストは128個(数はテキトー)のノードへのポインタを持たせる。これもmalloc()で確保する。ディレクトリ内に128個のファイルやディレクトリしか置けないなんて制限は掛けたくないので、いっぱいになったら新しいエントリリストと双方向リンクさせる。チャンク構造って言えばいいのかな?
mountを実装する
mountメッセージも管理方法も決めたので、とりあえず、mountを実装しようそうしよう。
mount要求メッセージを受信して、mount要求メッセージからマウントするファイルのパスがあるのでパスからノードを生成して、mount応答メッセージを送信する。
とりあえず、こんな感じで実装した。
途中、前回作ったvsnprintfがしくってて上手く表示ができなくかなり時間かかってしまった。。トホホ。
はぁー、次はopenか。
コメント
コメントを投稿