Der Funktionsaufruf zu mmap64() ist wie folgt:mmap64() funktioniert in Red Hat 6.6, aber nicht in Red Hat 7.2
addr = (unsigned char*) mmap64(NULL, regionSize, PROT_READ|PROT_WRITE, MAP_SHARED, FileDesc, (unsigned long long)regionAddr);
Die Argumente haben in der Regel Werte wie folgt:
regionSize = 0x20000;
FileDesc = 27;
regionAddr = 0x332C0000;
Offensichtlich sind diese Werte im Code nicht fest codiert, aber ich möchte Ihnen nur zeigen, was die typischen Werte für sie sind.
Das Problem:
mmap64() -Aufruf funktioniert perfekt in Red Hat Linux 6.6, Kernel-Version: 2.6.32-504.16.2.el6.x86_64. Es schlägt in Red Hat Linux 7.2, Kernel-Version: 3.10.0-327.13.1.el7.x86_64 fehl.
Kein Unterschied in Code, soweit ich weiß.
Das zurückgegebene Errno ist "ungültiges Argument" oder errno # 22 (EINVAL). Mit Blick auf diese Referenz http://linux.die.net/man/3/mmap64, ich sehe 3 Possiblilities für die EINVAL Fehler:
- Wir mögen es nicht Adr, Länge oder Offset (beispielsweise sind sie zu groß ist, oder nicht auf einer Seitengrenze ausgerichtet). -> wahrscheinlich Schuldige in meiner Situation.
- (seit Linux 2.6.12) Länge war 0. -> Unmöglich, überprüft Länge (RegionSize) Wert im Debug-Druck, es war 0x20000.
- Flags enthielten weder MAP_PRIVATE noch MAP_SHARED oder enthielten beide Werte. -> Kann nicht so sein, wie Sie von meinem Funktionsaufruf sehen können, nur MAP_SHARED Flag wurde als Argument angegeben.
So bin ich im Moment fest. Ich bin mir nicht sicher, wie das zu debuggen ist. Dieses Problem ist zu 100% reproduzierbar. Hat jemand Tipps, was sich zwischen den beiden OS-Versionen geändert haben könnte?
Warum einfach 'mmap()' ohne das Suffix verwenden, wenn Sie ausführbare 64-Bit-Dateien erstellen? Macht das für Ihr Problem einen Unterschied? Sind Sie sicher, dass der von Ihnen angegebenen Region bereits nichts zugewiesen ist? Was würde passieren, wenn Sie 'mmap64()' wählen würden, wo der Speicher abgelegt werden soll? –
Das letzte Argument wird in der Synopsis als 'offset' bezeichnet ([' mmap64() '] (http://linux.die.net/man/3/mmap64)), und: _'offset' muss ein Vielfaches von sein die Seitengröße, wie sie von 'sysconf (_SC_PAGE_SIZE) zurückgegeben wird. ._ Ist Ihr Wert ein Vielfaches der Seitengröße? Es sieht für mich so aus, als hätte es zu wenige nachfolgende Nullen im Hex (ein Vielfaches von 512, nicht von 4K oder größer). –