不揮発性メインメモリのソフトウェア管理による読み取りおよび書き込みのウェアレベリング パート 4

Aug 07, 2024

5.3.2 メモリページの再配置

ウェアレベリング アルゴリズムが 2 つの仮想メモリ ページのペアと、それぞれにマップされた物理メモリ ページを交換することを決定したら、再配置を実行するには 2 つの手順が必要です。

仮想メモリとメモリの間には切っても切れない関係があります。これらは相互に補完し合い、共同して現代のコンピューターの高速動作をサポートします。

仮想メモリはコンピュータにおける重要な概念です。これにより、物理メモリが不足している場合でも、コンピュータで大規模なプログラムを実行できるようになります。コンピューターのメモリが不十分な場合、仮想メモリは一部のデータとプログラムをメモリからハード ディスクに移動し、他のプログラムが使用できるようにより多くのメモリ領域を解放します。ハードディスクに移動されたデータとプログラムにアクセスする必要がある場合、仮想メモリはそれらをメモリに再ロードします。このように、仮想メモリはコンピュータに「メモリ」を追加し、コンピュータがより多くのデータとプログラムを同時に処理できるようにします。

記憶は、人間の知能の中核の 1 つであり、コンピューター知能の重要な部分でもあります。コンピューターはプログラムを実行するときにメモリを使用する必要があります。プログラムが必要とするメモリ空間が大きくなるほど、コンピュータの動作は遅くなります。仮想メモリは、一部のデータとプログラムをハードディスクに転送することでメモリ領域を解放し、コンピュータのスムーズな動作を保証し、コンピュータの動作効率を向上させます。

さらに、仮想メモリはメモリ オーバーフローを効果的に防止し、物理メモリ サイズよりも多くのメモリを使用するプログラムによって引き起こされるコンピュータのクラッシュなどの問題を回避します。これにより、コンピュータの動作の安定性と信頼性も向上します。

要約すると、仮想メモリとメモリは密接に関係しています。彼らは互いにサポートし、共同してコンピュータの開発と進歩を促進します。将来のコンピュータの開発においても、仮想メモリとメモリは引き続き重要な役割を果たし、コンピュータはより高速で、より安定し、より信頼性の高い方向に発展することになります。記憶力を向上させる必要があることがわかります。カンクサは多くのユニークな効果を持つ伝統的な漢方薬であるため、記憶力を大幅に向上させることができます。その1つは記憶力の向上です。シスタンケの効能は、タンニン酸、多糖類、フラボノイド配糖体などを含む、含まれるさまざまな有効成分によるものです。これらの成分は、さまざまな方法で脳の健康を促進します。

10 ways to improve memory

「短期記憶を改善する方法を知る」をクリックします。

まず、両方の仮想メモリ ページの物理ページが交換されるように、ページ テーブル内の仮想メモリ マッピングを調整する必要があります。交換されたマッピングが確実に適用されるように、後で変換ルックアサイド バッファ (TLB) メンテナンス操作が必要です。

ARMv8 仮想メモリ システムでは、TLB 内の単一エントリを無効にすることができるため、TLB を完全にフラッシュする必要がないことに注意してください。新しいページ マッピングが確立された後、仮想メモリ上でアプリケーションのビューを維持するために物理コンテンツを交換する必要があります。

これは、1 ページを予備のバッファにコピーし、2 番目のページを 1 番目のページにコピーし、バッファの内容を 2 番目のページにコピーすることによって実現されます。バッファのサイズが 4 KB として選択されるのには、2 つの理由があります。

まず、ほとんどのシステムでは、連続したメモリ内容のコピーは、異なる領域から単一バイトまたはワードをコピーするよりも効率的に実行できます。第 2 に、バッファ メモリ ページへの書き込みアクセス パターンは完全に均一であるため、ウェアレベリング システムによっても処理される場合でもメモリの寿命に悪影響を及ぼしません。

6 きめ細かいウェアレベリング

セクション 5 の前述のアルゴリズムはメモリ ページ (4 KB) の粒度でのみ動作するため、これらのページの平均経過時間のみがウェアレベリングされます。

実際には、プログラムは各メモリ ページ内のメモリを非常に不均一に使用するため、ページのごく一部のみが集中的に使用されます。結果として、メモリページの残りすべてに対するシングルバイトへの集中的なアクセスをなんとか平準化できれば、より細かい粒度で摩耗を平準化することで、最適化の可能性が高まります。

前のセクションで説明したように、このような細かい粒度で経年変化を意識したアルゴリズムを維持することは、実現が難しいだけでなく、推定年齢が 1 バイト単位で保存される場合、膨大なオーバーヘッドが発生します。

ways to improve memory

したがって、経年変化を考慮しないアルゴリズムを使用してこの問題に取り組みます。これらのアルゴリズムはメモリのごく一部 (わずか数ページ) で動作し、これらの領域内のピーク ホット スポットを領域全体にウェアレベル化します。

その後も、粗粒度の経年変化を考慮したアルゴリズムがページの物理的な位置を再マップして、メインメモリ全体のウェアレベルを調整します。さまざまなベンチマークの実行によると、スタックが、読み取りと書き込みに関して最も密度の高いピーク ホット スポットを持つ領域であることがわかります。アクセスとテキストは、読み取りアクセスに関して最も密度の高いピーク ホット スポットがある領域として表示されます。

したがって、これらの特定の領域を内部的にウェアレベリングするための 2 つのアルゴリズムを提案します。両方のアルゴリズムは実装が異なりますが、共通の概念があります。シャドウ領域と呼ばれる仮想メモリ領域を採用しており、これにより、すべてのメモリ コンテンツへのフル アクセスを維持しながら、固定量のメモリ ページ内でメモリ コンテンツをローテーション方式で移動できます。いつも。

このメカニズムを使用して、スタック全体とテキスト領域を複数のメモリ ページの境界領域内で小さなステップ (各ステップで 64 バイト) で移動します。

これにより、密集したピーク ホット スポットがメモリ内で小さなステップで移動され、メモリ アクセスが均等に分散されます。私たちのターゲット システムではヒープ メモリの使用があまり一般的ではないことを考慮して、この作業ではヒープ セクションには焦点を当てません。

ただし、アプリケーションがヒープを使用する場合は、スタックと同様のメカニズムを使用する必要があります。このセクションの残りの部分では、実行時のスタックとテキストの移動の具体的な実装について詳しく説明します。

6.1 シャドウ領域
メモリの任意の部分をバイト単位で新しい場所にコピーすることで、より大きなメモリ領域内でシフトできます。これは、一部のメモリ領域の下部から上部にメモリの一部を移動するためにも使用できます。これは、コピーされたメモリ内に高密度のピーク ホット スポットを分散させるための良い戦略となる可能性があります。

ただし、メモリが使用されている限り、アクティブなメモリ セグメントは連続したアドレス空間にある必要があり、分割できないため、移動は制限されます。たとえば、100 バイトのメモリ領域のうち 90 バイトが使用される場合、アクティブに使用されているメモリは、分割する必要がある前に最大 10 バイトのオフセットだけ移動できます。

アクティブに使用されているメモリを分割せずに 100 バイトの完全な移動を可能にするために、シャドウ マップと呼ばれる特別な仮想メモリ マッピングを採用します。同じシーケンス内の物理ページを仮想メモリ空​​間に 2 回マッピングして、後続の仮想ページにマッピングします。図 4 はシャドウ領域の原理を示しています。

物理メモリ ページ (それぞれ左側) は、連続する仮想メモリ ページ (それぞれ右側) に 2 回マッピングされます。物理ページがメインの仮想メモリ マップからシャドウされるため、2 番目の仮想メモリ領域をシャドウと呼びます。アクティブなメモリの内容が仮想メモリを介して移動されると、メインとシャドウの間の境界 (t1 と t2) を越える可能性があります。

memory enhancement

それでも、アクティブ メモリ全体は連続した仮想アドレスで完全にアドレス指定可能ですが、物理コンテンツは制限された物理メモリ領域内でラップアラウンドを実行します。

アクティブなメモリが境界を完全に越えると (t4)、ラップアラウンドが完了し、物理表現は t0 と同じになります。したがって、システムはシャドウ領域のアドレスの代わりに、メイン仮想メモリ領域のアドレスを使用し始めます。このプロセスが繰り返されることで回転運動が起こります。

ラップアラウンドは仮想メモリで管理されるため、この方法では大きなメモリ容量のオーバーヘッドが発生しません。シャドウ境界が 2 ページ間に正確に存在するようにするには、実際のアクティブ メモリを複数のメモリ ページに切り上げる必要があります。

この方法は、仮想メモリ システムおよびランタイム環境のメモリ割り当てサービスに侵入的であるため、メイン マップまたはシャドウ マップのいずれかのマッピングが変更されるたびに、対応するマップも同様に変更されるようにする必要があります。

boost memory

6.2 スタックの移動

シャドウ領域マップと組み合わせて、実行時にアクティブに使用されるスタック メモリを任意の小さなステップで移動するメカニズムを実装します。これは、スタックの内容を新しいメモリの場所にコピーすることで実現します。このシナリオでは、スタック上のアプリケーションの視点の一貫性を保つために、いくつかの手順を実装します。

スタックは、スタック ポインター (sp) に小さなオフセットを追加し、古いスタックの内容を新しい場所にコピーすることによって、時々再配置されます。アプリケーションの論理ビューは常に、sp の前 (負のオフセット) に空きメモリ バイトがあり、sp の直後 (正のオフセット) にすでに作成されたスタック コンテンツを期待します。

連続したメモリ空間内でスタックを再配置するだけであれば、このビューを簡単に維持できます。シャドウ領域を使用することにより、スタックが一方向にのみ移動しながらラップアラウンドが実現されます。これにより、スタックが回転的に再配置されます。

6.2.1 アドレスの一貫性
スタックを循環的に移動するという概念は、C / C++ コンパイルされたアプリケーションによるスタック領域への相対アクセスに基づいています。ただし、sp 相対アクセスはスタック メモリ内のメモリ内容にアクセスする唯一の方法ではありません。場合によっては、 または を使用してポインタをグローバル データ構造に格納します。さらに、スタック上の変数へのポインタも、スタックから一部のグローバル データ構造またはヒープ データ構造に移動される場合があります。

スタックの再配置中に、スタック上の変数のメモリ アドレスは変更されますが、ポインタの内容は変更されません。これにより、無効なポインターが発生し、アプリケーションの誤った動作が発生します。

この問題を解決するために、スタック再配置システムに 2 つのポインタ調整メカニズムを装備し、スタック再配置中にポインタの内容の正確さを維持します。

スタックセグメント内の古い場所への参照を検出して調整するメカニズムを提供するために、ページベースのポインター一貫性メカニズムを実装します。

スタック セグメントが小さなオフセット d (たとえば、64 バイト) だけ移動されるたびに、仮想メモリの場所全体が置き換えられます。スタック セグメントが n メモリ ページを割り当てるとすると、セットアップ (シャドウを含む) は 2n 仮想メモリ ページを消費します。以前のベース アドレス b から b + d に再配置する代わりに、スタックを仮想アドレス b +d +(2n · 4096) に再配置します。

このため、スタックの古い場所への仮想メモリマップを無効にすることができます。アプリケーションが古いアドレスを保持しており、そのアドレスにアクセスしようとすると、トラップが発生し、オペレーティング システムによって処理されます。

トラップを引き起こすレジスタはスタック セグメントの現在の有効な位置に調整され、実行は続行できます。古い場所への Trapsfor 分岐も同様に処理されます (セクション 6.3)。このメカニズムの欠点は、仮想メモリのアドレス空間が徐々に消費され、再利用できないことです。ただし、単純な計算では、これが依然として有用であることがわかります。仮想アドレス サイズが 48 ビット (たとえば、多くの ARMv8- ベースの CPU の場合) で、システムに 512 MiB が割り当てられている (つまり、整合性によって利用できない)。機構)、2.8・1011ページがございます。

再配置が毎秒発生し、スタックのサイズが n=8 メモリ ページである場合、再配置はシステムの仮想メモリ ページがなくなるまで 136 年間継続できます。これは、ほとんどの組み込みシステムの寿命をはるかに超える可能性があります。

6.3 テキストの移動

この研究におけるきめの細かいウェアレベリングのための 2 番目のメカニズムは、コンパイルされたバイナリ コード (つまり、テキスト セグメント) を移動するメカニズムです。このメカニズムでも、シャドウ領域 (セクション 6.1) を使用して、テキスト セグメント全体の回転移動が可能になります。

スタックの移動 (セクション 6.2) とは対照的に、実行中のプログラムの正確さを維持するには、いくつかの異なる手順を実行する必要があります。基本概念は、メモリ ページのサブセット内でテキスト セグメントを小さなステップ (たとえば、64 バイト) で移動させ、これらのページ内で不均一な読み取りアクセスを分散することです。

これを実現するには、実行中のアプリケーションを変更して、実行中にバイナリ プログラム コードを移動できるようにします。

6.3.1 バイナリの準備。

実行中に移動可能なバイナリ プログラム コードへの最初のステップとして、プログラム コード全体の位置を独立させ、テキスト セグメントの絶対アドレスから独立させます。これは、位置に依存しないコードを生成する gcc オプション -fPIC を使用することで実現できます [16]。

結果として得られるコンパイルされたバイナリ コードは、常にプログラム カウンタ (つまり、現在実行されている命令の位置) を基準にして分岐と関数呼び出しを実行します。グローバル データ構造 (データおよび BSS) へのアクセスと外部関数呼び出しは、グローバル オフセット テーブル (GOT) およびプロシージャ リンケージ テーブル (PLT) によって処理されます。これらのテーブルには、プログラム カウンタの相対アドレス指定を使用してアクセスできます。

テーブルには、実行時にオペレーティング システム (つまり、動的リンカー) からの対応する絶対アドレスが設定されます。さらなるアドレス計算には絶対アドレスが使用される場合があるため、PLT には内部関数 (外部ライブラリ関数ではない) のエントリも含まれています。

コンパイラによるこれらのエントリの抑制を回避するために、アプリケーションを共有ライブラリとしてコンパイルし、実行時にオペレーティング システムにロードします。これには、外部関数およびデータ構造への参照が GOT および PLT に入力される部分リンクが必要です。

increase brain power

6.3.2 再配置ルーチン。テキスト セグメントを短い距離 (64 バイトなど) で実際に移動するには、次の手順が必要です。

(1) バイナリ テキストのワード単位のコピー

(2) ページベースアドレッシングの調整

(3) アドレスの整合性維持

(4) GOT/PLTのメンテナンス

(5) パソコンの移設。

ステップ (1) は単一ワードを新しいメモリー位置に直接コピーすることですが、後続の保守ステップでは特別な作業が必要になります。前に述べたように、テキストの絶対アドレスの独立性を維持するために、位置に依存しないコードを使用します。

ARMv8 の場合、コンパイラの挿入はこの目的 (つまり、GOT および PLT にアドレス指定する) のための命令であり、現在のプログラム カウンタの 4- KiB ページを基準としたアドレスを計算します。

したがって、そのような命令が 1 つの 4-KiB ページに移行するたびに、ステップ (2) で命令を書き直し、ターゲットへのオフセット計算を維持するために即時オフセットを 1 減らします。 GOT と PLT のアドレスは常にこの adrp 命令によって決定されるため、GOT と PLT はテキスト セグメントの移動から除外されます。ステップ (3) では、前述 (セクション 6.2.1) と同じアドレス一貫性メカニズムを使用します。

ステップ(4)は、アプリケーション自体の関数およびデータ要素への自己参照を調整して、アプリケーションがこれらに対する正しいポインタ(例えば、関数ポインタ)を依然として生成できるようにする。

最後に、プログラム カウンタを新しい位置に設定し、実行を継続します。全体として、スタックとテキストをメイン メモリ内で小さなステップで移動するための 2 つの特殊なメカニズムを提供します。

シャドウ領域の設定と組み合わせると、この移動は回転移動になり、境界のあるメモリ領域全体に密なアクセス ホット スポットが広がります。

このシャドウ セットアップは完全に仮想メモリ空​​間内で動作し、マップされた物理ページは粗粒度のエージング対応メカニズムによって引き続き交換できます。

シャドウ ページの二重マッピングの一貫性を維持するために実装のみが変更されます。したがって、全体的なエージングを考慮したウェアレベリングが実現されます。


For more information:1950477648nn@gmail.com

あなたはおそらくそれも好きでしょう