MochiOS@仮想ファイルシステムの作成part5

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個のファイルやディレクトリしか置けないなんて制限は掛けたくないので、いっぱいになったら新しいエントリリストと双方向リンクさせる。チャンク構造って言えばいいのかな?

[0]
[127]
entry list 1
entry list 2
entry list 3
Node
path: /
type: directory
mount: -
Node
path: /serial1
type: mount file
mount: 3
Node
path: /serial2
type: mount file
mount: 3

mountを実装する

mountメッセージも管理方法も決めたので、とりあえず、mountを実装しようそうしよう。
mount要求メッセージを受信して、mount要求メッセージからマウントするファイルのパスがあるのでパスからノードを生成して、mount応答メッセージを送信する。

mvfsシリアルポートドライバmlog画面画面出力"mlog"ログ出力( "drv start!" )ログ出力( "mvfs start!" )「/」ノード生成ログ出力( "mount start!" )mount( "/serial" )ログ出力( "MountDo() start" )「/serial」ノード生成「/」ノードのエントリに「/serial」ノード追加mount応答ログ出力( "mount end! )ログ出力( "MountDo() end" )mvfsシリアルポートドライバmlog画面

とりあえず、こんな感じで実装した。
途中、前回作ったvsnprintfがしくってて上手く表示ができなくかなり時間かかってしまった。。トホホ。

mount

はぁー、次はopenか。

コメント

このブログの人気の投稿

プライバシーポリシー

git@よく使うコマンド早見表

MochiOS@仮想ファイルシステムの作成part10