3 Stimmen

Linux-Kernel: Wie durchläuft man physische Seiten in mem_map aus dem Userspace mit /dev/mem?

Ich muss alle in mem_map enthaltenen physischen Seiten im Userspace über /dev/mem durchlaufen. mmap kann nicht verwendet werden. Die einzige Hoffnung ist, open/read-Aufrufe zu verwenden. Ich kenne die physikalische Adresse von mem_map im Kernel. Dies ist der Code im Benutzerbereich:

 /* open /dev/mem file*/
 if((fd = open("/dev/mem", O_RDONLY)) == -1) {
    printf("/dev/mem could not be opened.\n");
perror("open");
    exit(1);
  } else {
  printf("/dev/mem opened.\n");

 /* seek to the mem_map at mem_map_phy_addr */
 if(lseek(fd, mem_map_phy_addr, SEEK_SET) == -1) {
   perror("lseek");
 }
 else {
   printf("lseek ok\n");
 }

Nun stellt sich die Frage, wie man mit dem Durchlaufen der mem_map beginnt? Welche Benutzerland-Include-Datei hat die "struct page"?

Gracias.

0 Stimmen

Userland-Include-Dateien haben keine struct page . Sie müssen Kernel-Header verwenden.

0 Stimmen

Können Sie das genauer erläutern? Wie verwende ich Kernel-Header? Kopiere ich die Header-Datei, um sie mit meinem Benutzerprogramm zu kompilieren?

0voto

Cong Wang Punkte 1953

Zunächst müssen Sie den Offset von "mem_map" ermitteln, d. h. die physikalische Adresse des betreffenden Symbols. Da "mem_map" exportiert wird, können Sie ein kleines Kernelmodul schreiben, um diese Adresse zu erhalten.

Dann können Sie lseek() auf diesen Offset setzen (das ist die Adresse, die Sie oben erhalten haben), und Sie können von dort aus mit dem Lesen von 'mem_map' beginnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X