2016-08-14 4 views
1

私は、カーネルとこのタスクを担当するカーネルの部分によってどのように特権の分離が強制されるのかを知りたいと思います。Linuxカーネルのどの部分が権限分離を実施し、どのように実施していますか?

例えば、リング0とリング3の2つのプロセスが実行されていると仮定します。カーネルはどのように各プロセスのリング番号を追跡しますか?

編集:私はリング番号について知っています。私の質問は、特権レベルを知るためにプロセスをチェックするカーネル(モジュールまたは何か)の部分についてです。私は、プロセスの呼び出し回数をチェックするカーネルのコンポーネントがあると信じています。

+0

[OSのRing 0とRing 3とは何か]の可能性があります(http://stackoverflow.com/questions/18717016/what-are-ring-0and -ring-3-in-os) –

+0

[** OSのRing 0とRing 3とは何なのですか?](http://stackoverflow.com/questions/18717016/what-are-ring-0-and) -ring-3-in-os)である。可能な重複を越えて、この質問は接尾辞的なプログラミング質問だけであり、* Kernel Documentation *の質問のようです。 –

+0

待ちます。 **ハードウェア**によってリングがチェックされていませんか?リング3でプロセスが実行されているとは、文字通りCPUがそのレベルで実行するように設定されていることを意味します。 OSがプログラムを実行する前にCPUモードを切り替え、再度呼び出されると、CPUはリング0にCPUを戻してOSを動作させます。あなたの質問に答えるには、これをチェックするカーネルのモジュールはありません。なぜなら、それを行うハードウェアだからです。カーネル、特にスケジューラーは、ユーザーコードを実行する直前に切り替わります。それだけです。 – Bakuriu

答えて

4

プロセスのリング番号の概念はありません。

カーネルはメモリの1つの領域にマップされ、ユーザー空間は別の領域にマップされます。起動時にカーネルはシステムコール命令が実行されたときにCPUがジャンプする必要のあるアドレスを指定します。誰かがのシステムコールを実行すると、cpuはring0に切り替わり、カーネルの指示に従ってアドレスにジャンプします。現在、カーネルコードを実行しています。その後、戻って、CPUはリング3に戻り、実行を再開します。

例外のようにカーネルに入る他の方法についても同様の話です。

したがって、Linuxカーネルはどのように分離を実行しますか?ユーザーインターフェイスがring3で実行されるように設定します。 cpuをring0に切り替えると、ブート時にカーネルによって設定されたアドレスにジャンプします。 カーネルコード以外のコードはring0で実行されません

+0

答えをありがとう。私の仮定は間違っていて、あなたはそれをはっきりと説明しました。 –

+0

それでは、リング0またはリング3のいずれかで実行されているのはCPUだとわかります。したがって、CPUの実行レベルを設定するSWコンポーネントが必要です。 –

+1

何が起こったかに応じて、sysretまたはiretを使ってユーザスペースに戻ることができます。 cpuスイッチをring0にする方法はいくつかあります。私はなぜあなたがそれに掘り下げたいと思うかわかりません。これは、amd64の例に示されている基本的な概念を越えて、このようなことをしない限り、ほとんど価値のない細部に入ります。代わりにオペレーティングシステムを読むことをお勧めします。古典的な本は "Unix internals:新しいフロンティア"です。 –

関連する問題