GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie greife ich (wenn möglich) auf den Kernel-Space aus dem User-Space zu?

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.


Linux
  1. Ausführen einer User-Space-Funktion aus dem Kernel-Space

  2. Wie kann man einen Linux-Kernel-Puffer dem Benutzerbereich zuordnen?

  3. So ermitteln Sie die Benutzerspeichernutzung in Linux

  4. Wie kann ich einen Speicherblock aus dem Linux-Kernel reservieren?

  5. So erhalten Sie den Benutzernamen von uid

So erstellen Sie einen Linux-Kernel von Grund auf neu {Schritt-für-Schritt-Anleitung}

So greifen Sie von Windows 10 auf Linux-Partitionen zu

So erstellen Sie einen Linux-Kernel von Grund auf neu

Wie erstelle ich einen neuen Benutzer mit SSH-Zugriff?

Wie entferne ich Swap Space von Centos 7.x?

Shared Memory:shmget schlägt fehl:Kein Speicherplatz mehr auf dem Gerät – wie kann man die Limits erhöhen?