9

私の理解では、仮想メモリは次のとおりです。

プログラム/アプリケーション/実行可能ファイルはストレージ デバイスに存在します。ストレージ デバイスへのアクセスは、RAM よりもはるかに低速です。したがって、プログラムは実行のためにストレージメモリからメインメモリにコピーされます。コンピュータのメイン メモリ (RAM) は限られているため、すべての RAM が使用されている場合 (たとえば、多数のプログラムが同時に開いている場合、または 1 つの非常に大きなプログラムが使用されている場合)、仮想メモリが有効になっているコンピュータはデータをHDD と必要に応じてメモリに戻るため、実際にはシステム メモリの合計が増加します。

私の知る限り、ほとんどの組み込みデバイスにはディスク メモリがありません (スマートフォンや車載インフォテインメント システムなど)。コードはフラッシュ メモリから直接実行されます。RAM は主にスクラッチパッド領域 (ローカル変数、戻りアドレスなど) として使用されます。

では、なぜ組み込みシステムに仮想メモリが必要なのでしょうか? (例: WinCE と QNX は仮想メモリをサポートします)

4

5 に答える 5

16

あなたの理解は完全に間違っています。仮想メモリとスワッピングまたはページ ファイルを混同しています。仮想メモリを持ち、スワップ ファイルやページ ファイルを持たないシステムもあれば、仮想メモリを持たずにスワップするシステムもあります。

仮想メモリとは、プロセスが物理マッピングとは異なるメモリのビューを持っていることを意味します。特に、プロセスが独自の仮想アドレス空間を持つことができます。

ストレージ デバイスへのアクセスは、RAM よりもはるかに低速です。したがって、プログラムは実行のためにストレージメモリからメインメモリにコピーされます。コンピュータのメイン メモリ (RAM) は限られているため、すべての RAM が使用されている場合 (たとえば、多数のプログラムが同時に開いている場合、または 1 つの非常に大きなプログラムが使用されている場合)、仮想メモリが有効になっているコンピュータはデータをHDD と必要に応じてメモリに戻るため、実際にはシステム メモリの合計が増加します。

それがスワッピング (またはページング) です。最近のほとんどのオペレーティング システムが仮想メモリを使用してスワッピングを実装していることを除けば、仮想メモリとは何の関係もありません。スワッピングは、仮想メモリのに実際に存在していました。

これらのデバイスがフラッシュ メモリから直接コードを実行していることについては、おそらく間違っていると思います。フラッシュの読み取り速度はかなり遅く、RAM は非常に安価です。あなたが言及したシステムのほとんどは、フラッシュから直接コードを実行せず、代わりに仮想メモリを使用して、必要に応じてコードを RAM にフォールトさせていると思います。

于 2013-01-03T04:56:29.693 に答える
7

組み込みシステム、この用語自体には幅広い用途があります。フラッシュプログラムスペースがキロバイト以下で測定され、RAMがビットまたはバイト(キロバイトには不十分)で測定される小さなマイクロコントローラーを組み込みシステムと呼ぶことができます。同様に、組み込みシステムとして、かなり本格的なコンピューターのマザーボードで本格的なオペレーティング システムを実行する tivo (別の例として、tivo を xbox に置き換えます)。したがって、質問について曖昧にする必要はありません。仮想メモリは、そのアプリケーションがこれらの境界を越えることとはほとんど関係がありません。

上記の多くの答えがあります.David Sはもちろん、仮想メモリは単に仮想メモリ境界の片側のメモリアドレスがその境界の反対側で使用される物理アドレスと異なることを意味します。どこに、どのように、なぜ境界があるのか​​など、さまざまです。

仮想メモリの一般的な使用法であり、主な使用例はオペレーティング システムであると主張するかもしれません。利点の 1 つは、たとえば、すべてのアプリケーションを同じアドレス空間用にコンパイルできることです。すべてのアプリケーションは、プログラムの観点からすると、たとえばアドレス 0x8000 から始まるようにコンパイルできます。そのアドレスに基づいたもの。ハードウェアとオペレーティング システムの組み合わせにより、プログラムが使用している仮想アドレスが物理アドレスに変更されます。オペレーティング システムでマルチタスクが許可されている場合、各タスクは同じアドレス空間にあると見なされる可能性がありますが、物理アドレスはそれらのタスクごとに異なります。仮定された固定アドレス空間を使用することが利点である理由については、これ以上詳しく説明しません。オペレーティング システムが使用するもう 1 つの側面は、メモリ管理です。ただし、多くの MMU ではメモリをセグメント化できます。ユーザーが 100 メガバイトのメモリを割り当てたい場合、プログラムは仮想アドレス空間で 100 メガバイトが線形であるかのようにアクセスでき、そのアドレス空間では線形ですが、その 100 メガバイトはたとえば 4K バイトのチャンクに分割される可能性があります。常にそうであるとは限りませんが、その物理メモリの 2 つのチャンクがその 100 メガバイトの他のチャンクの隣にないことは技術的に可能です。メモリ管理は、アプリケーションが割り当てることができるメモリの大きな物理チャンクを常に維持しようとする必要はありません。すべての MMU がまったく同じというわけではなく、4K バイトは単なる例であることに注意してください。オペレーティング システムに対する仮想アドレス空間の 3 つ目の大きな利点は、保護です。アプリケーションが仮想アドレス空間にバインドされている場合、多くの場合、そのアプリケーションが他のアプリケーションやオペレーティング システムのメモリにアクセスするのを簡単に防ぐことができます。この場合のアプリケーションは、すべてのアクセスが仮想と見なされ、物理への変換を経る必要があるような保護レベルで動作/実行されます。仮想から物理への変換を定義するために使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。多くの場合、そのアプリケーションが他のアプリケーションやオペレーティング システムのメモリにアクセスするのを簡単に防ぐことができます。この場合のアプリケーションは、すべてのアクセスが仮想と見なされ、物理への変換を経る必要があるような保護レベルで動作/実行されます。仮想から物理への変換を定義するために使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。多くの場合、そのアプリケーションが他のアプリケーションやオペレーティング システムのメモリにアクセスするのを簡単に防ぐことができます。この場合のアプリケーションは、すべてのアクセスが仮想と見なされ、物理への変換を経る必要があるような保護レベルで動作/実行されます。仮想から物理への変換を定義するために使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。この場合のアプリケーションは、すべてのアクセスが仮想と見なされ、物理への変換を経る必要があるような保護レベルで動作/実行されます。仮想から物理への変換を定義するために使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。この場合のアプリケーションは、すべてのアクセスが仮想と見なされ、物理への変換を経る必要があるような保護レベルで動作/実行されます。仮想から物理への変換を定義するために使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。仮想から物理への定義に使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。仮想から物理への定義に使用されるテーブルには、保護フラグを含めることができます。アプリケーションがビジネスでアクセスしていない仮想空間のメモリ アドレスをアドレス指定する場合、ハードウェアはそれをトラップし、オペレーティング システムにその処理方法に関するアクションを実行させることができます (一部のハードウェアを仮想化し、エラーをポップアップ表示してアプリを強制終了し、警告を表示し、アプリを強制終了するのではなく、同時にアプリに偽のトランザクション データをフィードするなど)。

組み込みシステムでこれを使用する方法はたくさんあります。まず、多くの組み込みシステムはオペレーティング システムを実行するため、上記のすべて、アドレス空間用のプログラムのコンパイルの容易さ、メモリ管理の相対的な容易さ、および他のアプリケーションとオペレーティング システムの保護、および言及されていないその他の利点があります。(仮想化は 1 つですが、ブロック単位で命令/データのキャッシュを有効/無効にできることは別です)

肝心なのは、David Sが指摘したことです。仮想メモリは単に、仮想アドレスが必ずしも物理アドレスと等しいとは限らないことを意味します。そうである必要はありませんが、仮想アドレスを物理アドレスに変換する何らかの境界、通常はテーブル駆動型のハードウェアがあります。一部の組み込みシステムは非組み込みシステムと見分けがつかないため、非組み込みシステムに適用される理由は組み込みシステムにも適用される可能性があるため、これを行う理由はたくさんあります。

システムにはフラットなアドレス空間があると信じてもらいたいと思っている人もいるかもしれませんが、それは多くの場合幻想です。たとえば、マイクロコントローラーでは、複数のフラッシュ バンクと 1 つ以上の RAM バンクが存在する場合があります。これらの各バンクには、通常ゼロベースの物理アドレスがあります。mmuなどがない場合でも、プロセッサのアドレスバスとフラッシュまたはRAMメモリのアドレスバスの間に、プロセッサのアドレスをデコードし、それを使用して特定のメモリバンクにアドレス指定する場所があります. 多くの場合、下位ビットが一致し、上位ビットがバンクの選択を担当します (これは mmu の場合もよくあります)。その意味で、プロセッサは仮想アドレス空間に存在します。(マイコンに限らず、これは通常、プロセッサのアドレスバスがどのように扱われるかです) マイクロコントローラは、ピンがハイまたはローにプルされるか、または他のメカニズムに依存するため、1 つのフラッシュバンクを使用してプロセッサまたは別のフラッシュバンクを起動できるようにするチップ機能を備えている場合があります。入力ピンをハイに接続すると、ブートローダに組み込まれたプロセッサにより、アプリケーション フラッシュの再プログラムなど、システムへのアクセスとデバッグが可能になります。または、そのラインをローに接続し、ベンダーのデバッガー/ブート フラッシュの代わりにアプリケーション フラッシュをブートします。一部のチップはさらに複雑になり、1つのフラッシュを起動すると、プログラムがどこかにレジスタを書き込み、メモリアーキテクチャを即座に変更して物事を動かします。

ディスクとの間のスワッピングに関して仮想メモリについて話す場合、これは、より多くの RAM があるように見せるためにオペレーティング システムでよく使用されるトリックです。上記の仮想化のカテゴリでそれについて述べました。実際には存在しないという意味での仮想メモリ、私は X バイトを持っていますが、ソフトウェアに Y バイト (Y は X より大きい) が利用可能であると認識させます。オペレーティング システムは、ハードウェアによって使用される仮想テーブルを介して、どのメモリ チャンクが物理 RAM に関連付けられ、ハードウェアによってそのまま完了できるか、または何らかの方法で使用不可としてマークされ、オペレーティング システムに例外が発生するかを管理します。検査の結果、オペレーティング システムはこれがこのアプリケーションの有効なアドレスであると判断しますが、このアドレスの背後にあるデータはディスクにスワップされています。
vmware やその他の仮想マシンがどのように機能するかということと何ら変わりはありません。例外が発生するまで、仮想メモリを使用してハードウェアでネイティブに命令を実行できます。仮想マシンは、xyz ネットワーク インターフェイスがあると認識し、その xyz ネットワーク インターフェイスのレジスタにアクセスするドライバーを持っている可能性があります。 xyz ハードウェアがない、および/または仮想マシン アプリケーションがそのハードウェアにアクセスすることを望まない場合は、それを仮想化し、そのレジスタ アクセスをトラップし、ハードウェアをシミュレートするソフトウェアを使用して、そのアクセスを偽装し、仮想上のプログラムを許可します。マシンは続行します。これは明らかに仮想マシンを実行する唯一の方法ではありませんが、ハードウェアがサポートしている場合、ハードウェア上で実際に命令を実行している時間の割合として仮想マシンを非常に高速に実行できるようにする方法の 1 つです。もちろん、仮想化する最も遅い方法は、プロセッサを含むすべてを仮想化することです。その場合、すべての命令がシミュレートされます。これは非常に遅いですが、独自の機能があります (アームの x86 または x86 でアームシステムを仮想化し、アームで xyz を仮想化する)。 abc、空欄を埋めてください)。そして、それが組み込みシステムで話している仮想メモリのタイプである場合、組み込みシステムが非組み込みシステム (xbox や tivo など) とほとんど見分けがつかない場合は、同じ理由でそんなことを許してしまう。マイクロコントローラーを使用している場合、一般的に、より多くのメモリが必要な場合は、より大きなマイクロコントローラーを購入するか、システムにメモリを追加するか、アプリケーションのニーズを変更して、それほど多くのメモリを必要としないことを意味します。 . 例外もあるかもしれませんが、しかし、それは主にアプリケーションと要件に依存します。アプリケーションまたはそのデータが利用可能なRAMよりも大きくなることを可能にする汎用または汎用のようなシステムには、何らかの解決策が必要です。キーレスエントリーキーフォブ、テレビのリモコン、時計付きラジオなどのマイクロコントローラーは、通常、「アプリケーション」が物理的に存在するよりも多くのリソースを必要とすることを許可する必要はありません。

于 2013-01-08T04:18:47.253 に答える
2

仮想メモリを使用することのより重要な利点は、すべてのプロセスが他のすべてのプロセスから分離された独自のアドレス空間を取得できることです。このようにして、仮想メモリは障害を封じ込め、セキュリティと安定性を向上させます。通信を容易にするために、2 つのプロセスが少量のメモリを共有できることに注意してください (共有メモリ IPC)。

また、共有部分を複数のプロセス (組み込み使用のために libc が頭に浮かびます) のアドレス空間にマッピングすることでメモリを節約するなど、他のトリックを実行できますが、物理メモリには一度しかありません。fork/cloneまた、これにより速度が向上します。カーネル記述子をコピーするだけで、最初の書き込みアクセスが同様のアイデアで行われるまでメモリイメージをそのままにしておくことで、Linux が安くする方法でさらに強化することもできます。

最後の利点として、最近のシステムでは、ファイルをプロセス空間にマッピングすることでファイル I/O を行うのが一般的です (mmap例を参照)。

于 2013-01-03T04:54:16.393 に答える
1

本格的なMMUを必要とせずに、「仮想メモリ」の利点のいくつかを得ることができることに注意するのは興味深いことです。ハードウェア要件は、驚くほど軽い場合があります。PIC 16C505には、5ビットのアドレス空間と40バイトのRAMがあります。アドレス0x10から0x1Fは、16バイトのRAMの2つのグループのいずれかにマップできます。2つの異なるデータストリームを管理する必要があるアプリケーションを作成するとき、1つのデータストリームに関連付けられたすべての変数が16の「切り替え可能な」メモリ位置の最初のグループにあり、他のデータストリームに関連付けられた変数が対応するものになるように調整しました2番目のグループのアドレス。次に、同じコードを使用して両方のデータストリームを管理できます。バンキングビットを一方の方法で設定し、ルーチンを呼び出し、もう一方の方法で設定して、ルーチンを再度呼び出すだけです。

于 2013-01-08T00:47:43.703 に答える
-2

仮想メモリが存在する理由の 1 つは、デバイスがマルチタスクできるようにするためです。また、RAM と同じように機能することもできるため、物理 RAM の負荷を取り除き、負荷を前後にスワップします。

于 2013-01-03T04:56:49.387 に答える