システムコールが行われるとき、コードセグメントレジスタまたは制御レジスタを使用して優先度レベルがチェックされますか?
Intel cpusのコードセグメントレジスタは、セグメンテーションを目的としていました。LinuxでページングとIntelx86メカニズムがどのように処理されるかはわかりません。
レベルの変更に関してシステムコールが行われたときにCPUで何が起こるかを誰かが説明した場合、非常に役立ちます。
システムコールが行われるとき、コードセグメントレジスタまたは制御レジスタを使用して優先度レベルがチェックされますか?
Intel cpusのコードセグメントレジスタは、セグメンテーションを目的としていました。LinuxでページングとIntelx86メカニズムがどのように処理されるかはわかりません。
レベルの変更に関してシステムコールが行われたときにCPUで何が起こるかを誰かが説明した場合、非常に役立ちます。
Linuxは、プロセスを分離したり、仮想メモリを興味深いセグメント化するために286スタイルのセグメンテーションを使用したことはなく、最初から386スタイルのページングを使用していました。カーネルモードへの転送(syscall)int
は、割り込みテーブルに従って実行を転送し、CPUをカーネルモード(保護レベル0)に移行させる単純な命令でした。ただし、CPUは、新しい保護レベルと新しいセグメントがどこにあるかを「学習」するために、セグメント記述子をリロードする必要がありました(ただし、CPUが「知らなかった」のと同じダミーカーネルモードセグメントでした)。
AMDとIntelは、このプロセスを高速化するための最適化された手順を提案しました。これは、このプラットフォーム上のすべてのオペレーティングシステムが実際に使用しているものです。
カーネルコードは、レジスタをスタックに保存して新しい値に初期化するためにさらに多くの作業を行う必要がありますが、これは変更されていません。しかし、これは通常、システムコールプロセスの一部であるとは理解されていません。
システムコールが行われるとき、コードセグメントレジスタまたは制御レジスタを使用して優先度レベルがチェックされますか?
特権レベルは、チェックされずに、割り込みテーブルを介して参照される新しいコードセグメントから取得されます。最適化された場合は、MSR(カーネル以外のコードからアクセスできないCPUレジスタ)にプリロードされます。
同じことを別の言い方をすると、レベル0への切り替えはCPUレベルで自動的に行われますが、セグメント記述子やMSRは、カーネルがトラップハンドラーを実行するだけでなく、実際にカーネルによって事前に調整される必要があります。一般保護違反。