32

たとえば、3つのプログラム(実行可能ファイル)がメモリにロードされると、レイアウトは次のようになります。

代替テキストhttp://img97.imageshack.us/img97/3460/processesm.jpg

私は次の質問をしました:

  1. 仮想メモリの概念はユーザープロセスに限定されていますか?なぜなら、オペレーティングシステムカーネル、ドライバーはどこにあるのだろうか?そのメモリレイアウトはどうですか?カーネル側のメモリについてもっと知りたいです。私はそのオペレーティングシステム固有があなたの選択をすることを知っています(windows / linux)。

  2. 仮想メモリの概念はプロセスごとですか?つまり、4GBのプロセス1+4GBのプロセス2+4GBのプロセス3=12GBの仮想メモリ(すべてのプロセス)と言うのは正しいことです。これは正しく聞こえません。または、合計4GBのスペースから1GBがカーネルによって使用され、残りの3GBはすべてのプロセスで共有されます。

  3. 彼らは、4GBのアドレス空間にある32ビットマシンで言う。その半分(または最近では1GB)がカーネルによって占められています。この図では、「カーネル仮想メモリ」が0xc0000000-0xffffffff(= 1 GB)を占有していることがわかります。彼らはこれについて話しているのですか?それとも何か他のものですか?確認したいだけです。

  4. これらの各プロセスには正確に何が含まれていますKernel Virtual Memoryそのレイアウトは何ですか?

  5. IPCを行うときは、共有メモリについて話します。これらのプロセス間で共有されているメモリはありません。どこに住んでいますか?

  6. リソース(ファイル、Windowsのレジストリ)は、すべてのプロセスに対してグローバルです。したがって、リソース/ファイルハンドルテーブルはグローバルスペースに存在する必要があります。それはどのエリアにありますか?

  7. このカーネル側のものについてどこでもっと知ることができますか?

4

2 に答える 2

38
  1. システムが仮想メモリを使用する場合、カーネルは仮想メモリも使用します。Windowsは、上位2GB(または、Windowsブートローダーで/ 3GBスイッチを指定した場合は1GB)を独自に使用します。これには、カーネルコード、データ(または、少なくともページインされるデータ-そうです、Windowsはカーネルアドレス空間の一部をハードディスクにページアウトできます)、およびページテーブルが含まれます。

  2. 各プロセスには、独自のVMアドレス空間があります。プロセスの切り替えが発生すると、通常、ページテーブルは別のプロセスのページテーブルと交換されます。これはx86プロセッサで簡単に実行できますCR3。制御レジスタのページテーブルベースアドレスを変更するだけで十分です。4GBのアドレス空間全体が、完全に異なる4GBのアドレス空間を置き換えるテーブルに置き換えられます。そうは言っても、通常、プロセス間で共有されるアドレス空間の領域があります。これらの領域は、プロセッサのトランスレーションルックアサイドバッファでこれらの領域を無効にする必要がないことをプロセッサに示す特別なフラグでページテーブルにマークされています。

  3. 前述したように、カーネルのコード、データ、およびページテーブル自体はどこかに配置する必要があります。この情報は、カーネルアドレス空間にあります。カーネルのコード、データ、およびページテーブルの特定の部分自体を、必要に応じてディスクにスワップアウトできる可能性があります。一部の部分は他の部分よりも重要であると見なされ、まったく交換されません。

  4. (3)を参照

  5. 場合によります。ユーザーモードの共有メモリは、ユーザーモードのアドレス空間にあります。カーネルモードのアドレス空間の一部は、プロセス間でも共有される可能性があります。たとえば、カーネルのコードがシステム内のすべてのプロセス間で共有されることは珍しくありません。そのメモリがどこにあるかは正確ではありません。ここでは任意のアドレスを使用していますが、あるプロセスにある共有メモリが別のプロセスの内部0x100000にある可能性があります。0x101000完全に異なるアドレスにある異なるアドレス空間の2つのページは、同じ物理メモリを指すことができます。

  6. ここで何を意味するのかわかりません。開いているファイルハンドルは、すべてのプロセスに対してグローバルではありません。ハードディスクに保存されているファイルシステムは、すべてのプロセスに対してグローバルです。Windowsでは、ファイルハンドルはカーネルによって管理され、オブジェクトはカーネルアドレス空間に格納され、カーネルオブジェクトマネージャーによって管理されます。

  7. Windows NTベースのシステムの場合、MarkRussinovichとDavidSolomonによる5edのWindowsInternalsをお勧めします。

コメントへの回答:

そして今、この3GBはすべてのプロセスで共有されていますか?または各プロセスに4GBのスペースがありますか?

OSによって異なります。一部のカーネル(L4マイクロカーネルなど)は、複数のプロセスに同じページテーブルを使用し、セグメンテーションを使用してアドレス空間を分離します。Windowsでは、各プロセスは独自のページテーブルを取得します。各プロセスが独自の仮想アドレス空間を取得する場合でも、それは物理メモリが常に異なることを意味するわけではないことを覚えておいてください。たとえば、kernel32.dllプロセスAでロードされたイメージkernel32.dllはプロセスBで共有されます。カーネルアドレス空間の多くはプロセス間でも共有されます。

各プロセスにカーネル仮想メモリがあるのはなぜですか?

これを考える最良の方法は、「仮想メモリを使用して実行されなかった場合、カーネルはどのように機能するか」を自問することです。この架空の状況では、プログラムがカーネルへのコンテキストスイッチを引き起こすたびに(たとえば、システムコールを行った場合)、CPUがカーネル空間で実行されている間は仮想メモリを無効にする必要があります。これを行うにはコストがかかり、ユーザースペースに戻ったときにオンに戻すにはコストがかかります。

さらに、ユーザープログラムがシステムコールのためにいくつかのデータへのポインターを渡したと仮定しましょう。このポインタは仮想アドレスです。仮想メモリがオフになっているため、カーネルが仮想メモリを使用する前に、ポインタを物理アドレスに変換する必要があります。仮想メモリをオンにしている場合は、CPUのメモリ管理ユニットのおかげで無料で入手できます。代わりに、ソフトウェアでアドレスを手動で変換する必要があります。私が説明できるあらゆる種類の例とシナリオがありますが(ハードウェアを含むもの、ページテーブルのメンテナンスを含むものなど)、その要点は、同種のメモリ管理スキームを使用する方がはるかに簡単であるということです。ユーザースペースが仮想メモリを使用している場合、カーネルスペースでそのスキームを維持すると、カーネルの作成が容易になります。

OSカーネルのインスタンスは1つだけですよね?では、なぜ各プロセスに個別のカーネル仮想空間があるのでしょうか。

上で述べたように、そのアドレス空間のかなりの部分がプロセス間で共有されます。プロセス間のコンテキストスイッチ中にスワップアウトされるカーネルスペースにあるプロセスごとのデータがありますが、カーネルが1つしかないため、その多くが共有されます。

于 2010-03-15T05:49:16.543 に答える
12

質問に答えるには、カーネルと、カーネルがリソース(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モードでは、プロセッサは追加の命令セットセットへのアクセスを提供します。

この概念を理解していただければ、ご質問にお答えいただければ幸いです。コンセプト自体を説明しながら、多くの質問に直接答えました。

于 2018-02-27T18:07:41.510 に答える