2016-09-01 3 views
0

プロセッサは、現在の特権レベルをCPLフィールドに保持します。私は、CPLフィールドが3から0へとその逆に変化するときのすべての可能なシナリオについて知りたい。たとえば、CPLフィールドは、ユーザープロセスによってシステムコールが呼び出されたときに、3から0に変更される可能性があります。いつどのようにCPLフィールドが変更されますか?

さらに、CPLフィールドが変更される前に、カーネル/ CPU内部で何が起こっているのかを詳しく解説してください。

注:CPL、RPL、およびDPLを使用してCPUによって保護がどのように強制されるかを説明する記事をいくつか読んでいます。私はCPLがいつ、どのように変化するのか理解できません。

+0

CPLフィールドについてのリファレンスマニュアルを引用してもらいたいですか?または何? – Tsyvarev

答えて

2

これはかなり深い疑問です。答えはあなたが見ているカーネルによって異なります。通常、CPLはコンテキストスイッチ(カーネルからユーザー空間への初期スイッチ)やシステムコール中にのみ変更されます。

カーネルでは、グローバルディスクリプタテーブルにusermode(CPL 3)セグメントが設定されている必要があります。次に、セグメントセレクタ(CS、DS、ES、FS、GS)がCPL = 3セグメント値に設定されます。ここで

は偉大なリファレンスです:http://duartes.org/gustavo/blog/post/cpu-rings-privilege-and-protection/

はまた、インテルのマニュアルを見てみましょう。 https://www-ssl.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html(具体的には、3A、ページ5-7はあなたが探しているものです)

+0

これはタグ付きのlinux-kernelです。異なるLinuxカーネルバージョンやカスタムパッチを意味しますか?あるいはamd64とi386カーネルのような意味ですか? (32ビットカーネルはvm86モードをサポートしています...) –

+0

ああ、linux-kernelタグに気付かなかった。私はx86のタグからここに来た(ちょうど今日に参加して、私を許して)。私はLinuxの中で、唯一の違いは64と32ビットの間にあると思います。私は、セグメント記述子テーブルがx86_64でも使用されていると考えているため、CPLの変更がどれだけ影響を受けるかはわかりませんが、インテルのマニュアルを確認してください。他のカーネルに関する限り、マイクロソフトとモノリシックは、どのシステムプロセスがユーザー領域とカーネル領域にあるかに応じて、CPLの変更が発生したときに何らかの影響を与えます。 – crunch

+0

ええ、x86_64にはまだGDTが必要です。 32ビットのユーザー空間と64ビットのユーザー空間の違いは、長いモードと互換モードの違いであり、アドレスサイズなどはCSによってインデックスされたセグメント記述子によって決まります。 SO、BTWへようこそ:) –

関連する問題