Python, der Aufruf von mmap mit einer zu großen Adresse verursacht eine Überlauf-Ausnahme

9

Ich konvertiere einen C-Code, der über mmap auf einen Gerätetreiber zugreift. Ich dachte, ich könnte in Python sehr ähnliche Dinge tun. Ich bin jedoch auf dieses Problem gestoßen. Die Adresse, die mmapiert werden muss, wird von der PCI-Konfiguration bereitgestellt, so dass ich keine Kontrolle über diese Adresse habe. In diesem Fall ist die gefundene Adresse 3451912192. Das Adressfeld ist natürlich eine vorzeichenlose Ganzzahl und ist 32-Bit.

Diese Adresse befindet sich zufällig in dem Bereich, in dem sie in eine Ganzzahl ohne Vorzeichen, aber nicht in eine Ganzzahl mit Vorzeichen passt. Wenn ich mmap rufe, bekomme ich die folgende Ausnahme:

%Vor%

Python sagt mir also künstlich, dass die Nummer nicht passt, weil sie denkt, dass sie unterschrieben ist. Ist es möglich, dies irgendwie zu lösen, oder muss ich den Aufruf von mmap in C tun?

Beachten Sie, dass die Umwandlung des Zeigers in den entsprechenden negativen Wert Folgendes ergibt:

%Vor%

eryksun weist darauf hin, dass die C-Schnittstelle tatsächlich ein signiertes Wert gibt, so Python korrekt aus einer semantischen Sicht ist, aber es wird mir diese Einschränkung nicht zulassen umgehen, die das C-Programm in der Lage ist, zu ignorieren.

Tatsächlich zeigt lspci an, dass das Gerät eine Ressource hat:

%Vor%

und 0xcdc00000==3451912192 . Es scheint zumindest, dass der Check für offset > 0 in mmap vielleicht nicht korrekt ist. Warum das überprüfen? Lassen Sie das Betriebssystem einen Fehlercode zurückgeben, wenn es nicht unterstützt wird.

    
Steve 19.07.2011, 02:24
quelle

1 Antwort

1

Ich hatte einmal ein ähnliches Problem, ich wollte auch einen größeren - dann - 4 GB großen Datenblock auf einer 64-Bit-Maschine zu einem 64-Bit-kompilierten Python machen.

Wenn ich mich richtig erinnere, der Hauptgrund, warum es nicht geklappt hat, war, dass das grundlegendste Python-Objekt mmap ein Objektgröße Mitglied enthält, was nur 32bit . Und das zu ändern ist so schwierig, dass man sagen könnte, man müsse die gesamte Sprache überarbeiten und vor allem alle kompilierten Erweiterungen reparieren.

Ich bin mir nicht sicher, aber das ist vielleicht mit Python 3.0 gemacht worden.

    
towi 31.07.2011 11:11
quelle

Tags und Links