2016-06-16 2 views
2

私はいくつかのSOの質問が結論に来るのを見た:各プロセスは、独自のカーネルスタックを持っています。しかし、このコードはどうですか?各プロセスには独自のカーネルスタックがあります。

main() 
{ 
    while(1) 
     ; 
} 

これはどうですか?

main() 
{ 
} 

このプログラムにも対応するカーネルスタックがあるかどうか。

詳細: 上記の1番目のコードでは、以下のようにテストしました。 Ctrl + Cキーを押して停止し、システム時間が1ms未満であることを確認します。

私が知りたいことは、ユーザースペースプログラムの実行パスがカーネルスペースを経由する必要があるかどうかです。私のコード例では、実行時にプロセス自体がカーネル空間を通過しないと思いますが、これは正しいですか?

$ time ./a.out 
^C 

real 0m24.953s 
user 0m24.942s 
sys  0m0.000s 

答えて

1

アプリケーションコードは、(実行可能ファイルから)カーネルによってメモリにロードされます。しかしカーネルは逆アセンブルを実行しません。したがって、カーネルは、コードが短いかどうか、システムコールを使用するかどうかなどを検出できません。

そのため、アプリケーションカーネルではフル実行コンテキストを作成する必要があります。だから、カーネルスタックを割り当てることはどんな場合でも必要です

カーネルがアプリケーションのプロセスのコンテキストでコードを実行する唯一のケースではないことにも注意してください。プロセスのプリエンプト、例外処理もカーネルによって実行され、カーネルスタックが必要です。

+0

カーネルは、ユーザー空間に対して**実行環境**を提供するプロセスオブジェクトを作成します。 – Tsyvarev

+0

私はあなたをよく理解できません。あなたは言う: "プロセスオブジェクトを完全に構築することが必要です"、これはカーネルで行われますか?それでも、これは対応するカーネルスタックが割り当てられていることを意味しますか? –

+0

本当にありがとう!いい答えだ。 –

関連する問題