Was sind die verschiedenen Möglichkeiten, wie ich vom Benutzerbereich in den Kernel-Adressraum schreiben kann?
Ich bin mir nicht sicher, ob es andere Methoden gibt, aber Sie können mit /dev/mem
auf den physischen Speicher zugreifen &Systemaufruf mmap()
.
/dev/mem ist eine Zeichengerätedatei, die ein Abbild des Hauptspeichers des Computers ist. Es kann zum Beispiel verwendet werden, um das System zu untersuchen (und sogar zu patchen). Byteadressen in mem werden als physische Speicheradressen interpretiert.
mehr unter /dev/mem
:http://linux.about.com/library/cmd/blcmdl4_mem.htm
mehr unter mmap()
:http://linux.die.net/man/2/mmap
Sie können den mmap()
verwenden um einen Abschnitt von /dev/mem
abzubilden und in Ihrem Anwenderprogramm verwenden. Ein kurzer Beispielcode:
#define MAPPED_SIZE //place the size here
#define DDR_RAM_PHYS //place the physical address here
int _fdmem;
int *map = NULL;
const char memDevice[] = "/dev/mem";
/* open /dev/mem and error checking */
_fdmem = open( memDevice, O_RDWR | O_SYNC );
if (_fdmem < 0){
printf("Failed to open the /dev/mem !\n");
return 0;
}
else{
printf("open /dev/mem successfully !\n");
}
/* mmap() the opened /dev/mem */
map= (int *)(mmap(0,MAPPED_SIZE,PROT_READ|PROT_WRITE,MAP_SHARED,_fdmem,DDR_RAM_PHYS));
/* use 'map' pointer to access the mapped area! */
for (i=0,i<100;i++)
printf("content: 0x%x\n",*(map+i));
/* unmap the area & error checking */
if (munmap(map,MAPPED_SIZE)==-1){
perror("Error un-mmapping the file");
}
/* close the character device */
close(_fdmem);
Stellen Sie jedoch bitte sicher, dass der Bereich, den Sie abbilden, nicht verwendet wird, z. B. vom Kernel, oder Ihr System abstürzt/hängt und Sie gezwungen werden, mit dem Hardware-Netzschalter neu zu starten.
Hoffe es hilft.
Wie genau wird im Linux-Kernel zwischen Benutzerspeicher und Kernel-Speicher unterschieden (in Bezug auf die Sicherheit des Kernel-Speicherplatzes)?
Ich bin mir nicht sicher, ob ich Ihre Frage verstanden habe.
Zum Kernel gibt es technisch gesehen keinen großen Unterschied, es ist nur Speicher. Wieso den? Weil der Kernel, der im privilegiertesten CPU-Modus läuft, auf den gesamten Speicher zugreifen kann.
Was sind die verschiedenen Möglichkeiten, wie ich vom Benutzerbereich in den Kernel-Adressraum schreiben kann?
Sofern es keine Sicherheitslücke im Kernel- oder Kernelmodus-Gerätetreiber gibt, können Sie das nicht tun, zumindest nicht direkt. Der Kernel (oder einer seiner Treiber) kann jedoch Daten aus dem Speicher der Benutzermodusanwendung in den Kernelspeicher kopieren.
... gibt es eine Möglichkeit, auf eine physische Adresse zuzugreifen, die im Kernel-Space vorhanden ist, und Operationen darauf auszuführen?
Dasselbe gilt, Sie sollten nicht in der Lage sein, mit physischen Adressen auf den Speicher zuzugreifen, wenn eine Übersetzung von virtuellen in physische Adressen vorhanden ist. Selbst der Kernel selbst kann diese Übersetzung nicht vermeiden, sobald er aktiviert ist. Es muss geeignete Zuordnungen virtueller zu physikalischen Adressen in den Seitentabellen erstellen, um auf den Speicher an beliebigen physikalischen Adressen zuzugreifen.
Abgesehen von Systemaufrufen gibt es noch andere Möglichkeiten, wie ich von einer Benutzeranwendung aus in den Kernelspace schreiben kann?
Sie können die CPU auch zwingen, auf den Kernelcode umzuschalten, indem Sie eine Ausnahme auslösen (z. B. Division durch 0, Seitenfehler, allgemeine Schutzverletzung usw.). Der Kernel ist der erste, der Ausnahmen behandelt. Der Kernel ändert seinen Speicher nach Bedarf als Reaktion auf eine Ausnahme. Es kann Daten von irgendwoher (z. B. Festplatte) bei einem Seitenfehler laden.