2016-08-19 19 views
2

Ich habe eine physikalische Adresse, speziell 0x000000368d76c0. Ich versuche es in meinem Programm mmap. Der Code, den ich verwende istWarum schlägt mmap fehl?

void *mmap64; 
off_t offset = 0x000000368d76c0; 
int memFd = open("/dev/mem", O_RDWR); 
if (-1 == memFd) 
    perror("Error "); 

mmap64 = mmap(0, sizeof(uint64_t), PROT_WRITE | PROT_READ, MAP_SHARED, memFd, offset); 
if (MAP_FAILED == mmap64) { 
    perror("Error "); 
    return -1; 
} 

Aus irgendeinem Grund, wenn ich diesen Code ausführen ich einen Fehler auf mmap bekommen. Genauer gesagt heißt es Error Invalid argument. Ich bin mir ziemlich sicher, dass es wegen des Werts offset ist, aber ich weiß nicht, was mit ihm falsch ist.

Ich würde jede mögliche Hilfe darauf schätzen.

+0

Meinst du 'address' mit' address' in den Argumenten von 'mmap()'? – MikeCAT

+0

@MikeCAT Ich meine das "Offset" -Argument. – flashburn

+7

[mmap (2) - Linux-Handbuchseite] (http://man7.org/linux/man-pages/man2/mmap.2.html) sagt "Offset" muss ein Vielfaches der Seitengröße sein, die von zurückgegeben wird 'sysconf (_SC_PAGE_SIZE)' ". Was ist der Wert in Ihrem System? Referenz: [sysconf (3) - Linux-Handbuchseite] (http://man7.org/linux/man-pages/man3/sysconf.3.html) – MikeCAT

Antwort

3

Nach mmap(2) - Linux manual page,

offset muss ein Vielfaches der Seitengröße als von sysconf(_SC_PAGE_SIZE) zurückgegeben werden.

Wenn die Seitengröße 4096 (eine Seitengröße in x86-CPU verwendet wird), ist 0x000000368d76c0 nicht ein Vielfaches von 4096 und wird als ungültig betrachtet werden.

Aus diesem Grund müssen Sie den Offset anpassen.