Reservieren Sie einen festen RAM-Speicherbereich als Blockgerät (mit einer bestimmten physischen Startadresse).

11

Es gab viele Fragen zu RAM-Festplatten, und mir sind RAMFS und TMPFS bekannt, die die Verwendung von RAM als Blockgerät ermöglichen. Mein Interesse ist jedoch die Verwendung eines festen Speicheradressbereichs als Blockgerät.

Dies ergibt sich aus der Notwendigkeit, nichtflüchtigen RAM zu verwenden, der in meinem System verfügbar ist. Ich habe 6 GB RAM zur Verfügung und 8 GB nichtflüchtigen RAM vorhanden. Die Ausgabe von / proc / iomem gibt mir Folgendes

100000000-17fffffff: System-RAM

180000000-37fffffff: reserviert

Hier entspricht der Bereich von 6 GB bis 14 GB dem nichtflüchtigen RAM-Bereich, der durch die E820-BIOS-Speicherzuordnung als reserviert markiert ist. Meine Hauptabsicht ist es, diesen NVRAM als Blockgerät unter Linux zu verwenden. Dies ist nützlich zum Testen von NVRAM-Systemen. Gibt es bereits einen Linux-Befehl, mit dem ich diese Region als Blockgerät verwenden kann, oder muss ich meinen eigenen Kernel-Gerätetreiber schreiben, um dies zu ermöglichen?

qstack
quelle
2
Nur neugierig, warum willst du das tun?
Mtak
Es bietet eine einfache Möglichkeit, Dateisysteme zu testen, die für nichtflüchtiges RAM unter Linux entwickelt wurden.
qstack

Antworten:

2

Ich bin kein Experte für Gerätetreiber, aber hier sind einige Hinweise für Ihre Forschung und Entwicklung:

  1. Wenn der Speicher als "reserviert" markiert ist, kann das Betriebssystem ihn nicht berühren. Sie müssen einen Weg finden, um das BIOS entweder als für das Betriebssystem verfügbar markieren zu lassen oder direkte Low-Level- Ioctls zu verwenden, um es zu steuern
  2. wenn Linux kann sehen , den Speicher, würden Sie noch nicht einen einfachen Weg, um Linux zu verhindern , dass es wie bei jedem anderen Block des RAM verwendet wird ; ein Versuch , konnte durch die Markierung solcher RAM als „schlecht“ versucht werden , und dann den Kernel noch einen besonderen Nutzen daraus (bitte Kernel - Dokumentation bezüglich dieser machen ändern, hat sie sich verändert viel seit dem letzten Mal , als ich in sie gehackt und es entwickelt sich mit großer Geschwindigkeit)
  3. In Anbetracht des oben Gesagten als vorläufige (und nicht endgültige oder erschöpfende) Machbarkeitsstudie würde ich sagen, dass das Schreiben Ihres Ramdisk-Blockdevice-Treibers in Ihrem Fall die vernünftigste Option ist, und vielleicht sollten Sie ihn wieder in den Linux-Kernel einbringen und / oder sich mit ihm zusammenschließen Leute, die dies bereits versuchen (vielleicht ist die Linux-Kernel-Mailingliste ein besserer Ort für diese Frage , falls Sie dort noch nichts gepostet haben)

Einige andere relevante Quellen:

Deim0s
quelle
1

Vor der Einführung von tmpfs/ initramfswurde ramdiskzum Laden der initrdImages ein vordefiniertes Blockgerät mit fester Größe verwendet, das meiner Meinung nach zumindest bei früheren Implementierungen zusammenhängend ist.

Der Blocktreiber selbst hat keine Parameter für die Speicheradresse, nur die Größe, sondern den Kernel, der zum Laden von initrd-Images an einer vordefinierten Adresse (per Konfiguration) verwendet wird, um einen Blick in main / init zu werfen Kernelcode hilfreich sein könnte (würde ich) Seien Sie überrascht, wenn Ramdisk für initrd nicht mehr unterstützt wird, aber da initramfs bereits seit vielen Jahren verfügbar ist, wird ramdisk nie mehr verwendet.

Die Treiberquelle war drivers / block / rd.c , wenn ich das jetzt richtig sehen ist drivers / block / brd.c .

Ansonsten habe ich auf der Suche nach Ramdisk eine Implementierung gefunden, die interessant aussieht:

Disk on RAM - Spielen mit Blocktreibern

Alex
quelle