web-dev-qa-db-ja.com

固定予約RAMブロックデバイスとしてのメモリ領域(指定された開始物理アドレス)

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

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

100000000-17fffffff:システムRAM

180000000-37fffffff:予約済み

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

11
qstack

私はデバイスドライバーの専門家ではありませんが、R&Dのヒントをいくつか紹介します。

  1. メモリが「予約済み」としてマークされている場合、OSはメモリにアクセスできません。 BIOSでOSで使用できるようにマークする方法、または低レベルの ioctl sを control it に直接使用する方法を見つける必要があります
  2. linuxがメモリを参照できる場合でも、Linuxがメモリを他のRAMブロックとして使用するのを防ぐ簡単な方法はありません。このようなRAMを「不良」としてマークしてから、カーネルを変更して特別に使用することで試行できます(これについてはカーネルのドキュメントを確認してください。変更されていますたくさん前回ハッキングして以来、それは素晴らしいスピードで進化しています)
  3. 上記を予備的な(そして決定的でも網羅的でもない)実現可能性調査として考えると、私はあなたのramdiskブロックデバイスドライバーを書くことがあなたのケースで最も健全なオプションであると思います、そしておそらくあなたはそれをLinuxカーネルやチームと協力して戻す必要があります既にこれを試している人(おそらく、この質問のより良い場所は Linuxカーネルメーリングリスト です(まだそこに投稿していない場合))。

他の関連する情報源:

2
Deim0s

tmpfs/initramfsが導入される前は、ramdiskimagesをロードするためにinitrdimagesが使用されていました。これは、事前定義された固定サイズのブロックデバイスです。少なくとも連続していると思います以前の実装。

ブロックドライバー自体には、メモリアドレスのパラメーターはなく、サイズのみがありますが、カーネルは、事前定義されたアドレス(config)でinitrdイメージをロードするために使用されるため、を覗き見ることができますメイン/initカーネルコードが役立つ可能性があります(ramdiskはinitrdでサポートされなくなりましたが、initramfsが使用されているため、今では何年も使用されていないため、ramdiskもう)。

ドライバーのソースは drivers/block/rd.c でしたが、正しく表示されている場合は drivers/block/brd.c です。

または、ramdiskを探しています。興味深い実装が見つかりました。

ディスクRAM —ブロックドライバでの再生

1
Alex