固定RAMメモリ領域をブロックデバイスとして予約します(与えられた開始物理アドレスを使用)。

固定RAMメモリ領域をブロックデバイスとして予約します(与えられた開始物理アドレスを使用)。

RAMディスクについて多くの質問があります。私はramfsとtmpfsがramをブロックデバイスとして使用できることを知っています。しかし、私の関心は、固定されたメモリアドレス範囲をブロックデバイスとして使用することです。

これは、システムで使用可能な不揮発性RAMを使用する必要があるためです。使用可能なRAMは6GB、不揮発性RAMは8GBです。 /proc/iomem の出力は次のようになります。

100000000-17fffffff: システムメモリ

180000000-37fffffff:予約済み

ここで、6GBから14GBまでの領域は、E820 BIOSメモリマップに予約されているとマークされた不揮発性RAM領域に対応します。私の主な目的は、このNVRAMをLinuxのブロックデバイスとして使用することです。これはNVRAMシステムをテストするのに便利です。この領域をブロックデバイスとして使用できるようにするLinuxコマンドはすでに存在していますか?それとも同じ機能を達成するには、独自のカーネルデバイスドライバを作成する必要がありますか?

答え1

私はデバイスドライバの専門家ではありませんが、開発のためのいくつかの提案は次のとおりです。

  1. メモリが「予約済み」とマークされている場合、オペレーティングシステムはそれに触れることができません。 BIOSがそのメモリをオペレーティングシステムで利用可能であることを示す方法を見つけるか、低レベルのメモリを使用する必要があります。I/W制御到着それを制御する
  2. Linuxができるならバラよりメモリがある場合、Linuxがそれを別のRAMブロックとして使用するのを防ぐ簡単な方法はありません。これらのRAMを「不良」とマークし、カーネルを修正して、そのメモリを特別に使用することができます(カーネルを確認してください)。この文書に対して変更されましたたくさん前回のハッキング以降、途方もないスピードで発展しています。)
  3. 上記が予備的(結論的または徹底的ではない)妥当性調査であることを考慮すると、RAMディスクブロックデバイスドライバを作成することが最も賢い選択であり、おそらくLinuxカーネルお​​よび/または以下を持つ人に貢献する必要がありますです。すでにこれを試しました(おそらくこの質問のより良い場所はLinuxカーネルメーリングリスト、まだ公開していない場合)

その他の関連ソース:

答え2

tmpfs/が導入される前にはイメージロードのためにあらかじめ定義された固定サイズブロ​​ックデバイスがinitramfsありましたが、少なくとも初期実装ではこれが連続的であったと仮定します。ramdiskinitrd

ブロックドライバ自体にはメモリアドレスパラメータがなく、サイズしかありませんが、カーネルは(設定を介して)事前定義されたアドレスにinitrdイメージをロードするために使用されます。基本/内部にカーネルコードが役に立つかもしれません(もしメモリディスクinitrdはサポートされなくなりましたが、ファイルシステムの初期化すでにそこにいて、何年も一度も使っていません。メモリディスクこれ以上)。

ドライバソースはドライバ/ブロック/rd.c、今私が正しく読んだならドライバ/ブロック/brd.c

それ以外の場合は、次を見つけます。メモリディスク興味深い実装を見つけました。

RAMのディスク - ブロックドライバの使用

関連情報