質問に答えるには、カーネルと、カーネルがリソース(CPU、メモリなど)を管理し、アプリケーションプログラムに洗練された抽象化を提供するために採用している手法について詳しく理解する必要があります。
まず、「仮想メモリ」が最新のオペレーティングシステムで採用されているメモリ管理手法であることを明確にしておきたいと思います。これは、プロセスの分離などのさまざまな利点を提供し、保護によって、複数のプログラムを一緒に実行できるようにし、システムに存在する物理メモリよりもサイズが大きいプログラムを可能にします。この手法では、「仮想メモリ」と「仮想アドレス空間」という2つの用語があります。これらは同じではありませんが、それでも密接に関連しています。(仮想メモリは、その下にある技術であると同時に概念でもあるのか疑問に思われるかもしれませんが、そうです、それは正しいので、以下で理解できます)
コンピュータサイエンスでは、「記憶」という言葉には2つの意味があります。1つ目は、データの保存に使用できるもの(レジスタ、キャッシュ、RAM、ROM、HDDなど)用です。2つ目は、プライマリメモリ(RAMなど)と同義です。単語を単語に置き換えると、「仮想メモリ」は「仮想RAM」に他なりません。'。これは、プログラムが実行のためにロードされる、システムで常に使用可能なスペースの合計量です。したがって、これは物理RAMメモリ+カーネルによって割り当てられたセカンダリストレージ上のスワップメモリに他なりません。したがって、インストール時に2GBのRAMと4 GBのスワップスペースがカーネルによって確保されている場合、システムの仮想メモリは6GBになります。スワップメモリについては、トピックからさらに逸脱するため、ここでは詳しく説明しません。
仮想アドレス空間に移ります。したがって、これを理解するには、少し心を調整する必要があります。名前自体が「仮想」であるように、アドレス空間は実際には存在しません。これは、カーネルによってアプリケーションプログラマーに作成された単なる幻想です(段落2で述べたように、多くの利点を実現するため)。したがって、各プロセスには、カーネルによって個別の仮想アドレス空間が与えられます。(システムにカーネルがなく、ハードウェア上でアプリケーションプログラムを実行した場合、物理アドレス空間、つまりアドレス空間としてRAMが使用されます)したがって、32ビットアドレスレジスタを備えたマシンでは、カーネルは次のようになります。プロセスごとに2^32=4GBの仮想アドレス空間を提供します。(したがって、この仮想アドレス空間の範囲は、HWアーキテクチャによって異なります。
そして重要なのは、この仮想アドレス空間が空中にあることです!! あなたは今、それが空中にあるのであれば、プロセスのコードやデータをどのように実行することができるかを考えているでしょう。はい、これは物理メモリにマッピングする必要があります。物理メモリとのマッピング方法は、ページングと呼ばれる概念を使用してカーネルによって管理されます。これで、カーネルが仮想アドレス空間を使用してプロセスの分離をどのように達成したかを確認できます。したがって、各プロセスが生成できるアドレスは0〜4GBであり(簡単にするためにシステムに32ビットのアドレスレジスタがあると仮定)、これは全体の範囲内です。また、システムで実行されている他のプロセスについては何も知りません。つまり、各プロセスが別々のスペースに詰め込まれているようなものです。
したがって、カーネルコードも別のプロセス/エンティティのようなものです。したがって、カーネルがまったく異なるアドレス空間に存在する場合。その後、アプリケーションプログラムがカーネルと対話する手段がありませんでした。アプリケーションがカーネルと通信できず、カーネルがアプリケーションと通信できない場合、システムを駆動するためのカーネルの有用性はありません。だから今の質問は-カーネルと相互作用するようにアプリケーションプロセスを作る方法は?
オプションは次のとおりです。カーネルコードがアプリケーションプロセスの仮想アドレス空間に存在する場合、それらは相互に作用する可能性があります。これが、すべてのプロセスがカーネルと通信する必要があるため、カーネルコードが各プロセスの仮想アドレス空間に存在する理由です。カーネルコードがプロセスごとに物理的に複製されないことを心配する必要はありません。前述したように、VASは単なる幻想であるため、物理メモリに存在するカーネルコードのコピーは1つだけであり、すべての仮想アドレス空間(ページングを介して)によって参照されます。Linuxの場合、カーネルはC0000000からFFFFFFFFの間の上位アドレススペースに配置され(つまり、1GBがVASのカーネル用に予約されている理由)、残りの3GB(00000000からBFFFFFFFまで)はアプリケーションプログラムに許可されます。使用する。カーネルが存在する仮想アドレス空間はカーネル空間と呼ばれ、アプリケーションプログラムが存在する仮想アドレス空間はユーザー空間と呼ばれます。注意深く観察した場合、アプリケーションコードとカーネルコードの両方が同じ仮想アドレス空間に存在し、カーネルが事前定義されたアドレス位置に存在するため、それは不可能であるという疑問が浮かびます。アプリケーションコードがカーネルコードを破壊するために!おっと、最初は可能に見えますが、できません。理由-これはHWの助けを借りて保護されています。実行モードがSUPERVISORMODEであるかUSERMODEであるかを示すフラグがプロセッサに表示されます。カーネルスペースコードはSUPERVISORモード(そのフラグを適切に設定)で実行する必要があり、ユーザースペースコードはユーザーモードで実行する必要があります。したがって、ユーザーモードで、カーネルスペースのコードにアクセス/変更しようとすると、例外がスローされます。(プロセッサは、命令がアクセスしようとしているアドレスに基づいてそれを認識します。それがC000 0000より大きい場合、カーネルスペースコードにアクセスしようとしていることを簡単に検出でき、現在の実行モードには適切な権限がありません。フラグはUSERMODE権限で設定されます)。注:SUPERVISORモードでは、プロセッサは追加の命令セットセットへのアクセスを提供します。フラグはUSERMODE権限で設定されているため)。注:SUPERVISORモードでは、プロセッサは追加の命令セットセットへのアクセスを提供します。フラグはUSERMODE権限で設定されているため)。注:SUPERVISORモードでは、プロセッサは追加の命令セットセットへのアクセスを提供します。
この概念を理解していただければ、ご質問にお答えいただければ幸いです。コンセプト自体を説明しながら、多くの質問に直接答えました。