Konvertieren Sie die physische Adresse unter Linux in eine virtuelle und lesen Sie deren Inhalt

Lesezeit: 3 Minuten

Benutzer-Avatar
Michail Kalaschnikow

Ich habe Linux und eine physikalische Adresse: (dh 0x60000000).
Ich möchte diese Adresse aus dem User-Space-Linux-Programm lesen.

Diese Adresse befindet sich möglicherweise im Kernelspace.

  • Sie können verwenden mmap(2) wie im Folgenden beschrieben: stackoverflow.com/questions/12040303/…

    – MTZ4

    12. März 2014 um 7:20 Uhr


  • Mögliches Duplikat von Gibt es eine API zum Bestimmen der physischen Adresse aus der virtuellen Adresse in Linux

    – Ciro Santilli Путлер Капут 六四事

    4. August 2017 um 5:33 Uhr

  • Haben Sie /dev/mem auf deinem System? Haben Sie devmem Programm (überprüfen Sie mit type devmem)? Wenn ja, tut es devmem 0x60000000 Arbeit? Wenn dies der Fall ist, ist es kein großes Problem, eine Funktion dafür zu schreiben mmaps ein Teil davon /dev/memdafür habe ich einen fertigen Code.

    – Arkadiusz Drabczyk

    14. August 2017 um 19:53 Uhr


  • Es gibt auch devmem2 auf einigen Systemen: manpages.ubuntu.com/manpages/xenial/man1/devmem2.1.html

    – Arkadiusz Drabczyk

    14. August 2017 um 19:59 Uhr


Sie benötigen einen Kernel-Treiber, um die physikalische Adresse auf Benutzerebene zu exportieren.

Schau dir mal diesen Treiber an: https://github.com/claudioscordino/mmap_alloc/blob/master/mmap_alloc.c

Beachten Sie, dass dies jetzt über /proc/ möglich ist[pid]/Seitenübersicht

  • Können Sie bitte Ihre Antwort erweitern? Es enthält binäre Daten. Wie arbeite ich mit dieser Datei?

    – Michail Kalaschnikow

    12. März 2014 um 7:09 Uhr

Is there an easy way I can do that?

Für den Zugriff aus dem Benutzerbereich, mmap() ist eine schöne Lösung.

Is it possible to convert it by using some function like "phys_to_virt()"?

Physische Adresse kann mit auf virtuelle Adresse abgebildet werden ioremap_nocache(). Aber aus dem Benutzerbereich können Sie nicht direkt darauf zugreifen. Angenommen, Ihre Treiber- oder Kernelmodule möchten auf diese physische Adresse zugreifen, ist dies der beste Weg. Normalerweise verwenden speicherabgebildete Gerätetreiber diese Funktion, um Register dem virtuellen Speicher zuzuordnen.

  • Ein Kopfgeld ist jetzt verfügbar … Eine andere Frage lautete, wie man auf die physische Adresse eines Registers eines Geräts zugreifen kann. Welches sich offensichtlich im Kernel-Speicher befinden wird. Wäre es möglich, es auf virtuelle Adresse zu stellen, dann gib es an copy_to_user() Funktion mit 4 Bytes, um den Wert dieses Registers zu erhalten?

    – Tonyyyy

    10. August 2017 um 17:40 Uhr

  • Es scheint wie ein Job für devmem. Siehe mein Kommentar unter der Frage.

    – Arkadiusz Drabczyk

    14. August 2017 um 19:57 Uhr

So etwas in C. Wenn Sie ein Hardwareregister abfragen, stellen Sie sicher, dass Sie flüchtige Deklarationen hinzufügen, damit der Compiler Ihre Variable nicht optimiert.

#include <stdlib.h>

#include <stdio.h>
#include <errno.h>

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <memory.h>

volatile int *hw_mmap = NULL; /*evil global variable method*/

int map_it() {
/* open /dev/mem and error checking */
int i;
int file_handle = open(memDevice, O_RDWR | O_SYNC);

if (file_handle < 0) {
    DBG_PRINT("Failed to open /dev/mem: %s !\n",strerror(errno));
    return errno;
}

/* mmap() the opened /dev/mem */
hw_mmap = (int *) (mmap(0, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, file_handle, 0x60000000));
if(hw_mmap ==(void*) -1) {

    fprintf(stderr,"map_it: Cannot map memory into user space.\n");
    return errno;
}
return 0;
}

Jetzt können Sie in hw_mmap lesen und schreiben.

1345820cookie-checkKonvertieren Sie die physische Adresse unter Linux in eine virtuelle und lesen Sie deren Inhalt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy