ein Kapitel zurück                                           ein Kapitel weiter

/dev/zero

Einen besonderen Status bei den Memory Mapped I/O besitzt die Datei /dev/zero. Mit der Datei /dev/zero ist es möglich zwischen zwei Verwandten Prozessen zu kommunizieren. Der Vorteil an dieser Methode.......

if((fd=open("/dev/zero", O_RDWR)) < 0)
  {/*Fehler........*/};
memoin=mmap(0,8192......);  

ist der das keine neue Datei mit dem Memory Mapped Aufruf mmap erstellt werden muss.

Folgendes geschieht bei diesen Aufruf und ist zu beachten....

  • Der Speicherbereich der eingerichtet wird ist namenlos.
  • Die Größe des Speicherbereichs wird mit dem 2.Argument übergeben
  • Dieser Speicherbereich wird mit 0 initialisiert.
  • Und WICHTIG! Wenn verwandte Prozesse ebenfalls auf diesen Speicherbereich zugreifen sollen so müssen sie das Flag MAP_SHARED angeben.

/dev/mem

Ich möchte Ihnen hier eine Methode zeigen mit der sie auf einen bestimmten Speicherbereich Ihres Hauptspeichers (RAM) Memory Mapped I/O anwenden können.

Ich übernehme für diese Methode keine Verantwortung wenn Ihr Betriebsystem nicht mehr startet, Datenverluste entstehen oder sonst irgendeine negativ Auswirkende Form von Laufzeitverhalten die sich daraus resultieren könnte!!!

Die Dateien /dev/mem und /dev/kmem bilden den Arbeitsspeicher des Rechners ab. Beide Devices sind zeichenorientiert. Auf diese Devices greifen nur spezielle Programme wie free oder ps zu. Das direkte Lesen und Schreiben im Arbeitsspeicher des Rechners muß den Benutzern immer verboten sein.

Soviel zu /dev/mem. Jetzt müssen wir Linux, besser gesagt Lilo erst mal Konfigurieren. Öffnen sie die Datei...

lilo.config  

...was dann in etwa so aussehen könnte...

..........
image = /vmlinuz
root = /dev/hda6
label = linux
..............  

Darin tragen sie jetzt zusätzlich ein...

..........
image = /vmlinuz
append = "mem=63m"
root = /dev/hda6
label = linux
..............  

Ich gehe jetzt mal davon unser System ist mit 64MB Arbeitspeicher ausgerüstet. Mit....

append = "mem=63m"  

...stehen uns nun für Linux 63MB zur Verfügung. Somit haben wir automatisch 1MB des Arbeitspeichers für das Memory Mapped reserviert. Starten sie Ihren Rechner neu damit die neue Konfiguration aktiviert wird.

Jetzt will ich Ihnen nur noch schnell anhand eines simplen Beispiels zeigen wie sie auf das 63. Megabyte des Arbeitspeichers (RAM) zugreifen können.......

/*Download:map6.c*/
#include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <fcntl.h> /*Damit definieren wir die Startadresse im Arbeitspeicher 63 steht für die Startadresse des 63. MB im Arbeitspeicher*/ #define RAM_ADDRESS (63*0x100000) /*Wir reservieren 16386 Bytes von dem einen MB*/ #define ALLOCA 16384 int main() { char *mem_ptr; int fd, i; if ((fd=open("/dev/mem", O_RDWR)) < 0) { fprintf(stderr, "Fehler beim öffnen von /dev/mem\n"); exit(1); } mem_ptr = (char *)mmap(0, ALLOCA, PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, f, ADDRESS); for (i=0; i<ALLOCA; i++) mem_ptr[i]=i; /*Wir befüllen den Speicher mit Zahlen*/ /*Wir lesen die Zahlen aus dem Hauptspeicher wieder*/ for (i=0; i<ALLOCA; i++) printf("%d\n",mem_ptr[i]); /*Wir geben den Speicherplatz wieder frei*/ munmap(mem_pointer, ALLOCA); return 0; }

Normalerweise dürften sie das Programm nur als root ausführen dürfen. Ich will es jetzt dabei belassen denn alles andere was tiefer ins Detail geht gehört schon zum Kernel Hacking. Ein Gebiet wo ich mich übrigens nicht auskenne aber interessiert daran bin. Vielleicht........

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf