オペレーティングシステムの複雑な内部構造はいくつか理解していますが、カーネルとユーザースペースを理解するには大きなギャップがあります。
では、これをどのように理解するかを説明します。
まず、フラットメモリのRAM
例があります。または、メカニズムを使用してメモリのすべての部分にアクセスできます。8GB
CPU
DMA
Virtual Memory
システムが起動すると、初期段階でブートローダがメモリにロードされますが、この段階ではメモリが生の状態になるため、カーネルはこれらの機能を提供するため、概念はありません。ここで疑問に思うのは2
つのモードがあります。real mode
protected mode
私が知る限り、これらのモードはCPU機能です。主な違いは、保護モードでは、プロセスが独自のメモリ空間に分離されることです。しかし、これはどのように機能しますか?プロセスは単にオペレーティングシステムの概念です。この段階では、メモリにオペレーティングシステムがロードされておらreal
ずprotected mode
、メモリは他のデバイスからアクセスできるハードウェアにすぎません。たとえば、メモリにロードされたBIOSはメモリのすべての領域にアクセスできます。ただし、これはAプロセスではなく、メモリの一部のアドレスに0と1のみがロードされ、CPUは各命令を1つずつ読み込み実行します。
たとえば、カーネルがメモリにロードされた後、カーネルは他の0x000000 to 0x000fff
すべてのメモリからメモリを取得します。これはプログラムに使用できる空きメモリです。これでメインプログラムをカーネルメモリにロードしましたが、これはCPUが実行する命令のリストにすぎません。
私が理解している限り、カーネルは必要なすべてのサービス、管理者を設定します...今、カーネルは利用可能なメモリを使用するためのAPIを提供します(例:RAMサイズ - メモリのカーネルサイズ - +さまざまな割り込みハンドラやその他の項目)。CPU
特権モードと呼ばれる機能もありますが、これはCPU
デバイスへのアクセスを制御するレジスタのフラグにすぎず、現在の特権がデバイスにアクセスするのに十分でない場合、CPUは割り込みなどをトリガします。
私は正しいですか?
この旗は誰が制御しますか?たとえば、ユーザースペースのコードがカーネルモードに入り、そのフラグが高い権限に設定されていると、ユーザープログラムがメモリ全体にアクセスして悪い操作を実行できないのはなぜですか?
もう一つの概念はですsystem call
。システムコールは、あまりトリッキーな機能に使用され、特権モードでのみ使用できます。
実際のシステムコールが何であるかは誰もが知っていますが、glibc
これは単に使用されたラッパーであり、システムコールが必要なメモリアドレスをどのように知ることができますか?たとえば、プロセスがシステムコールをしたい場合、glibcはそれをどこに置くのか、どのように IP (instruction pointer)
システムコールを実行するのかをどうやって知ることができますか?
私が理解する最も難しいことの1つは、カーネルとユーザースペースが一緒に動作することです。カーネルスペースとユーザースペースが2人で一人で働き、必要なときに User space guy
助けを求めるような絵や図がたくさんあります。Kernel guy
ところでやめて、どうしたの?single CPU system
一度に1つの命令だけを実行すると考えてください。並列操作がない場合、CPUは1つだけです。
カーネルとユーザー空間の観点からどのように機能するか。 CPUだけであれば、ユーザーモードからカーネルモードに切り替えることは本当に衝撃的でした。
これらを理解するのに役立ちます。質問を強調し、答えを見つけようとしましたが、まだ成功していませんでした。たぶん私は素晴らしい記事を見逃したかもしれませんので、どんな助けでもくれてありがとう。
答え1
リアルモードは忘れてください。これは、1980年代のプロセッサと互換性があるように設計されたx86アーキテクチャの詳細です。
プロセッサには現在の権限レベルを示すフラグがあります。このフラグの詳細はプロセッサの種類によって異なりますが、単純化のためにユーザーとカーネルの2つの設定で考えることができます。
特権レベルを変更できるプロセッサ命令があります。安全のために最も重要なのはより高い権限レベルを入力すると、事前定義されたアドレスに移動します。。アドレスは、カーネルコードによってのみ変更が許可されているレジスタにあるか、ユーザーモードでアクセスできないようにカーネル(MMU経由)によって設定されたメモリにあります。このアドレスのコードは、ユーザーコードからの要求を慎重に確認し、ユーザーコードからの任意の要求を受け入れません。
一般に、より高い権限を取得する方法はいくつかあります。システムコール(ユーザーコードが明示的にカーネルモードに切り替えるとき)、割り込み(周辺機器がプロセッサにタスクを実行する必要があると信号を送信するとき)、トラップ(プロセッサがカーネルモードに切り替えようとするとき)など、少なくとも3つ枝があります。マップされていないメモリにアクセスしたり、不明なコマンドなどの誤ったcideを実行します。
システムコールでは、ユーザーコードはジャンプする場所を指定せずにシステムコールコマンドを発行し、プロセッサがジャンプする場所を決定します。呼び出すシステムコールを決定するために、カーネルコードはレジスタの内容を確認します。通常、システムコール番号を含むレジスタがあり、カーネルのシステムコールスケジューラはテーブル内のその番号を見つけます。
また、見ることができますユーザー空間からカーネル空間への切り替えそしてカーネルは、悪意のあるプログラムがすべての物理RAMを読み取ることをどのように防止しますか?