Forkシステムコールを作りたいが予期せぬ警告が出る #21
-
概要
カーネル側のコードはこちらで、上記警告の再現方法は以下です。
開発環境No response ソースコードのURL |
Beta Was this translation helpful? Give feedback.
Replies: 2 comments 4 replies
-
Would Blockが返ってくる原因はこの変更です。 diff --git a/servers/vm/main.c b/servers/vm/main.c
index f38e34d..8d094c0 100644
--- a/servers/vm/main.c
+++ b/servers/vm/main.c
@@ -129,7 +129,9 @@ void main(void) {
m.type = SPAWN_TASK_REPLY_MSG;
m.spawn_task_reply.task = task_or_err;
- ipc_reply(m.src, &m);
+ // ipc_reply(m.src, &m);
+ // 暫定的。通常のアプリケーションを起動するときにもwarnを吐くようになってしまうので別のメッセージタイプを用意する必要あり?
+ ipc_reply(task_or_err, &m);
break;
}
case DESTROY_TASK_MSG: {
|
Beta Was this translation helpful? Give feedback.
-
なるほど、シーケンス図で表して考えると確かに分かりやすいですね。
また現状taskはカーネルとvm両方で構造体を作って管理していると思っているのですが、task_spawnで両方の構造体の初期化をしているのでそれを利用するためにvmにメッセージを送って実装するのが一番シンプルかと思ったのですが、(メッセージを送らずにカーネル上で実装するとなるとおそらくどうやってvm上で管理するためのtask構造体を作るかも考える必要が出てくると思ったので)、どう思われますでしょうか? |
Beta Was this translation helpful? Give feedback.
重箱の隅をつつくと、call操作をするときの
recv_message
関数で受信状態に入ります。カーネルは単一ロック(Big Kernel Lock)で動作するため、送信操作とそれが完了した後の受信操作が一気に行われます。fork処理で発生するメッセージの流れを、シーケンス図で考えるとバグの原因が分かりやすいかもしれません。
現状の流れ
期待される流れ
ただし、以下で説明するように
fork
システムコールの方で処理を実装する際は、VMサーバへのメッセージは必要ないかもしれません。補足: fork処理の実装に必要なもの
実装したいforkは、親タスクの複製を作るものだと思います。この場合、2つコピーするものがあります。
alloc_pages
関数で割り当…