MochiOS@仮想ファイルシステムの作成part8
前提知識無しで作るなんちゃって仮想ファイルシステムpart8。
開発日記です。独り言です。
これまでのあらすじ
part | 内容 |
---|---|
0 | 仮想ファイルシステムを作りたい宣言をする。 |
1 | ざっくり仮想ファイルシステムの機能を決める。 が、機能呼出し先の仮想ファイルシステムのタスクIDをどう取得するかという問題に気付く。 |
2 | カーネルにタスク名登録機能を実装した。 これでタスク名からタスクIDを取得する事が出来る様になるハズ、なので試したいが試す方法が無い事に気付き、ログ出力タスクの開発を宣言する。 |
3 | ログ出力の為に使うvsnprintf()の仕様を調べる。 |
4 | ログ出力タスクを開発してタスク名からタスクIDの取得機能が正しく動いている事が確認できた。 |
5 | mount機能を実装した。たぶんできてる。 |
6 | FDどうやって管理しようかー。メッセージのやり取り制御を状態遷移で制御しようかー。とか考えて、open機能を実装した。たぶんできてる。 |
7 | openと同じようなシーケンスなので、メッセージとちょっとやる事変えて簡単にwrite機能を実装できちゃった。 |
readの仕様を考える
今回はread機能を作ります。
仮想ファイルサーバとしては、openもwriteもreadもあんまりやること変わらないハズ。なので簡単にできるかな~と思っている。
あ、キャッシュなんて何にも考えていませんからね。
(ブログ記事までwriteのコピペ)
シーケンスの順番は何も変わらず、渡すデータとちょっと間にやる事が変わったくらい。
以下、メッセージ仕様。
■ read要求メッセージ
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0005 | read |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0000 | 要求 |
0x08 | 4 | グローバルFD | 任意 | - |
0x0C | 8 | アドレス | 任意 | - |
0x14 | 4 | データサイズ | 1~24,064 | - |
なぜ24,064かというと、現在のMochiKernelで送信可能なメッセージの最大長が24,576byteなので、そこから-512byte(ヘッダとかも含めるので)減らした。適当。
そもそも、なんで24,576にしたんだっけ…
(writeとおんなじ。)
■ read応答メッセージ
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0005 | read |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0001 | 応答 |
0x08 | 4 | 処理結果 | 0x0000_0000 0x0000_0001 |
成功 失敗 |
0x0C | 4 | 読込み実施サイズ | 0~24,064 | - |
0x10 | 0~24,064 | データ | 任意 | - |
■ vfsRead要求メッセージ
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0006 | vfsRead |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0000 | 要求 |
0x08 | 4 | グローバルFD | 任意 | - |
0x0C | 8 | アドレス | 任意 | - |
0x14 | 4 | データサイズ | 1~24,064 | - |
■ vfsRead応答メッセージ
offset | size | 内容 | 値 | 意味 |
---|---|---|---|---|
0x00 | 4 | 機能ID | 0x0000_0006 | vfsRead |
0x04 | 4 | タイプ(要求/応答) | 0x0000_0001 | 応答 |
0x08 | 4 | グローバルFD | 任意 | - |
0x0C | 4 | 処理結果 | 0x0000_0000 0x0000_0001 |
成功 失敗 |
0x10 | 4 | 読込み実施サイズ | 0~24,064 | - |
0x14 | 0~24,064 | データ | 任意 | - |
実装してみた
大体、OpenやWriteと同じような動きなので、あっさり実装。
とりあえず、実行結果をば。
今回はちょっと動画でご紹介。
上は画面、下はシリアルポート入出力のウィンドウ。
最初にシリアルポート側で"testes"が出ていますが、前回のwrite機能実装でお試ししてみたもの。今回はその後に「aadekita!!!」を入力してやって、それをエコーしています。
1秒ビジーウェイトしているのは、ドライバ側で割込み待ちができない(現状、MochiKernelではメッセージ待ちと割込み待ちを同時に行えない。)ので仕方なく(CPUを労わる為に)。
write以上にあっさりreadを実装してしまった。
次はもっと簡単で、closeを実装する。キャッシングないからね。
コメント
コメントを投稿