私の理解では、OS カーネルは、低レベルの割り込みや複数のコアの処理など、他のプログラムでは実行できない低レベルの操作を実行する特権を持っています。
これを可能にする特別な指示はありますか?
私の理解では、OS カーネルは、低レベルの割り込みや複数のコアの処理など、他のプログラムでは実行できない低レベルの操作を実行する特権を持っています。
これを可能にする特別な指示はありますか?
これは部分的な答えにすぎません。
主な特権の分離はアドレス空間と関係があります。「スーパーバイザーモード」で実行すると、CPUはすべてのアドレス空間にアクセスできます。OSカーネルはこのモードで実行されます。ユーザープロセスはそうではありません。
これが、たとえば、32ビットLinuxホスト上のユーザープロセスが自由に使用できるアドレススペースが3 GBしかないのに対し、理論的に利用可能なアドレススペースは2 ^ 32 =4GBである理由です。「取り残された」ギガバイトはカーネルからのみアクセス可能です。 、およびカーネルはそのデータ構造をこのギガバイトにマップします。そのアドレス空間にアクセスしようとするユーザープロセスには、SIGBUSが表示されます。このフロンティアは64ビットマシンにも存在しますが、非常にリモートです。
スーパーバイザーモードでは、実行中のコード(カーネル)にアドレス空間のレイアウトを変更する機能もあります。これは、たとえば、ビデオカードのPCIアドレス空間またはデバイスのDMAアドレス空間をレンダリングできることを意味します。 、シリアルポートなどは、非監視モードで他の実行中のコード(プロセス)からは完全に見えません。
カーネルは、システムコールを介して低レベルの操作(ディスク書き込みなど)へのアクセスを許可できます。システムコールがトリガーされると、カーネルは、システムコールを呼び出したプロセスに代わって、スーパーバイザーモードでシステムコールを実行します。システムコールが実行または中断されると、プロセスは独自の権限で実行を再開します。
今日のプロセッサにおけるこのすべてのロジックの中心的な部分の1つは、MMU(メモリ管理ユニット)です。これは、アドレス空間の書き換えを可能にするコンポーネントであるためです。これが、4GBを超えるRAMを備えた32ビットマシンを使用できる理由です。これは不可能なことです。 MMUが利用できなかった場合。
OS は、起動中およびハードウェアの初期化中に、自分自身を最高の特権所有者として設定するためです。OS は、MMU ハードウェアの助けを借りてこれを行います。たとえば、x86 ベースのプロセッサでは、ハードウェアが保護のために提供する 2 つのメカニズムがあります。
セグメンテーション:
セグメンテーションはメモリをセグメントのように見せ、それらのセグメントに 0 から 3 までの特権レベル (PL) を割り当てることができます。0 が最高の特権です。ハードウェアの起動と初期化中に、カーネル コード セグメント 0 PL を割り当てることができます。ユーザー プロセスの実行が開始されると、カーネルは PL 3 を割り当てます。ユーザー コードがより特権的なカーネル コードにジャンプしようとすると、ハードウェアは General Protection(GP) Fault (interrupt #13) を生成し、カーネル コードを実行し、ユーザー プロセスを強制終了することを選択できます。同様に、 0 PL でのみ実行できる などlidt
の命令がありlgdt
、ユーザー コードがそれらを実行しようとすると、GP フォールトが生成されます。セグメンテーションは、次の問題も解決します。
ページング:
ページングはメモリをサイズ (4KB/2MB/4MB/1GB) のページに分割し、ハードウェアからのページング サポートは次の問題を解決します。
ユーザー コードが OS によって設定されたページング ルールに違反しようとすると、ハードウェアはページ フォールトを生成し、カーネル コードを実行します (OS が割り込み/フォールト/例外ハンドラーの初期化中にそれを設定するため)。このようにして、カーネルは何をすべきかを決定できます。ユーザープロセスで。
セグメンテーションとページングはどちらもより複雑なトピックですが、この回答は質問のコンテキスト内でのみです。
理論的には:はい、大量のインジェクションやハッキングさえあれば、低レベルの命令セットでも使用できますが、実際には、特定の領域をロックするリソースが多すぎるため、これは不可能です.
標準言語と標準ライブラリを使用すると、ハードウェアの 100% にアクセスできない可能性が高くなります。これは、これらが設計されているためです。重要で危険な可能性がある決定を取り除くことで、複雑な (そして強力な) フレームワークを可能にすることさえできます。OSS オペレーティング システムを使用すると、完全に制御できる場合がありますが、最終的には同じ問題が残ります。カーネル操作と独自の操作が交差し、カーネルを大幅に変更しない限り、完全に制御することはできません。常に。
ハードウェアを 100.0% 制御したい場合は、独自のブートローダー、カーネル、およびオペレーティング システムを作成する必要があります。オペコード レベルのハードウェア命令を介して、事実上すべてを操作できます。プログラミング言語 (ASM も含む) を使用すると、限界が生じます。