Rückgabewert prüfen
-
Hallo, ich stehe gerade auf dem Schlauch.
Der Linux-Systemcall mmap2 gibt bei Erfolg die Adresse eines Speicherbereichs zurück,
einen negativen Wert, wenn es nicht geklappt hat. (nasm)mov eax,192 ; Nummer des Systemaufrufs xor ebx,ebx ; Adresse (vom System verwaltet) mov ecx,dword[laenge] ; Größe des Speicherbereichs mov edx,3 ; Datei lesen und schreiben mov esi,1 ; MAP_SHARED mov edi,dword[fd] ; file-descriptor xor ebp,ebp ; Datei-Offset int 080h test eax,eax js .bug1
Das Problem ist, wenn ich am Ende das Sign-Flag abfrage, bekomme ich einen Fehler, wenn der angeforderte Speicherbereich
eine Adresse hat, die höher ist als 0x7FFF.FFFF ist, da ja nur das höchste Bit geprüft wird. Wie könnte man hier unterscheiden,
ob man einen negativen Wert oder eben eine korrekte Adresse bekommen hat?Danke für Antworten
-
-
Ja genau mit der man-page arbeite ich.
Aber es wird eben nicht -1 im Fehlerfall zurueckgegeben, in eax steht nach einem Fehler bspw.
0xFFFFFFED, was nicht -1 ist.
-
Ich vermute jetzt einfach mal, dass im niedrigsten Byte des Rückgabewertes die errno-Nummer zurückgegeben wird, da dort immer ein anderer Wert als -1 steht.
Ich habe verschiedene Fehler erzeugt und im Debugger den Wert überprüft.Wenn das so ist, dann werde ich jetzt nur die oberen 3 Bytes des Rückgabewertes auf 0xffffff testen.
Falls mir jemand dazu noch was genaueres sagen kann, würde ich mich über eine Antwort freuen.
Danke
-
Die Manpage beschreibt ja strenggenommen das C-Interface. Ich hab hier was:
Die glibc scheint alles größer als -4096 als Fehler anzusehen. Macht wegen der Pages auch irgendwo Sinn, die größte sinnvolle Adresse kann ja 2^32 - 4096 sein.
-
Bashar schrieb:
Die glibc scheint alles größer als -4096 als Fehler anzusehen. Macht wegen der Pages auch irgendwo Sinn, die größte sinnvolle Adresse kann ja 2^32 - 4096 sein.
Super. Danke, das hilft mir weiter.