Skip to content

Forkシステムコールを作りたいが予期せぬ警告が出る #21

Closed Answered by nuta
keisuke713 asked this question in Help
Discussion options

You must be logged in to vote

先に送信を行なった関数はブロック状態となり返信を待つ

重箱の隅をつつくと、call操作をするときの recv_message 関数で受信状態に入ります。カーネルは単一ロック(Big Kernel Lock)で動作するため、送信操作とそれが完了した後の受信操作が一気に行われます。

fork処理で発生するメッセージの流れを、シーケンス図で考えるとバグの原因が分かりやすいかもしれません。

現状の流れ

sequenceDiagram
    親タスク->>VMサーバ: FORK_TASK_MSG
    VMサーバ-->>子タスク: タスクを新規作成
    VMサーバ->>子タスク: FORK_TASK_REPLY_MSG (would blockで失敗)
    親タスク->>親タスク: VMサーバからの返信を待ち続ける (フリーズ状態)
Loading

期待される流れ

sequenceDiagram
    親タスク->>VMサーバ: FORK_TASK_MSG
    VMサーバ-->>子タスク: タスクを新規作成
    VMサーバ->>親タスク: FORK_TASK_REPLY_MSG
Loading

ただし、以下で説明するようにforkシステムコールの方で処理を実装する際は、VMサーバへのメッセージは必要ないかもしれません。

補足: fork処理の実装に必要なもの

実装したいforkは、親タスクの複製を作るものだと思います。この場合、2つコピーするものがあります。

  • メモリ: alloc_pages関数で割り当…

Replies: 2 comments 4 replies

Comment options

You must be logged in to vote
2 replies
@keisuke713
Comment options

@nuta
Comment options

Answer selected by keisuke713
Comment options

You must be logged in to vote
2 replies
@nuta
Comment options

@keisuke713
Comment options

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Help
Labels
None yet
2 participants