2017-12-31 37 views
0

私は、オペレーティングシステムのコアが実行され、そのサービスを提供するメモリセクションを知っています。ユーザースペースは、ユーザープログラムを実行する場所です。また、プロセスには、そのアドレス空間に独自のスタック、ヒープ、データ、およびテキストセクションがあることもわかります。しかし、私はユーザースタックカーネルスタックの概念と混同しています。私の質問は次のとおりです。

カーネルスペースとカーネルスタックの関係は何ですか?

  1. は、私が前に述べたプロセスのスタックはユーザスタックとカーネルスタックで構成されていますか?
  2. カーネルスタックはカーネルスペースの一部ですか?
  3. 2つのスタックはプロセスの仮想メモリアドレスで区切られていますか?
  4. コードセグメント:void main(){user_mode_call(); system_call()} 2つの呼び出しのスタックフレームはそれぞれユーザースタックとカーネルスタックにありますか?


あなたのお時間をいただき、ありがとうございます。関連する文献やリンクも参考になります。
(私の質問は純粋ではないかもしれませんが、もっとプロフェッショナルな方法で入力するとすぐに更新していきます)

+2

答えには本が必要です。 [* Operating Systems:Three Easy Pieces *](http://pages.cs.wisc.edu/~remzi/OSTEP/)をお読みください。あなたの質問は広すぎます。あなたのビジョン[仮想アドレス空間](https://en.wikipedia。org/wiki/Virtual_address_space)はあまりにも素朴です:端末で 'cat/proc/$$/maps'を試してみてください。[proc(5)](http://man7.org/linux/man-pages/man5/proc .5.html) –

答えて

2

スタック構造は、通常、プロセッサによって指定されます。各プロセスは通常、プロセスごとに1つのスタック(ユーザー、カーネル+プロセッサによって使用される他のもの)と、プロセッサごとに1つの割り込みスタック(別のカーネルスタック)を持っています。

前述のプロセススタックはユーザースタックとカーネルスタックで構成されていますか?

いいえ。カーネルスタックは、ユーザーモードアクセスから保護する必要があります。

カーネルスペースはカーネルスペースの一部ですか?

これはユーザー空間内の保護されたメモリである場合もあります。

2つのスタックがプロセスの仮想メモリアドレスで区切られていますか?

はい。

コードセグメント内で:void main(){user_mode_call(); system_call()} 2つの呼び出しのスタックフレームはそれぞれユーザースタックとカーネルスタックにありますか?

"コードセグメント"は教育的な構成です。両方のスタックフレームはユーザースタックにあります。システムコールはレジスタ値を設定するラッパー関数を呼び出し、プロセッサーをカーネルモードに切り替える例外を発生させます。その時点で、ほとんどのプロセッサはデフォルトスタックをカーネルモードスタックに変更します。ユーザスタックはカーネルモードのSPレジスタから直接アクセスできないため、パラメータをシステムコールに渡す必要があります。

+0

私たちが通常参照するスタックは何を意味しますか?ユーザースタックですか? – Mark

+0

最初の段落では、 "per process"はおそらく "スレッドごと"であるべきです。 –

+0

"スタック"は、通常、ユーザースタックです。また、「スレッドごと」と言うこともできますし、プロセッサの観点からも、同じアドレス空間を共有する複数のプロセスを持つプロセスごとに依然として可能です。プロセッサのドキュメントは、スレッドではなくプロセスの観点から語っています。 – user3344003

関連する問題