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:

    http://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/i386/mmap.S;h=a1481feeb55e9124e1706fb57b3e27b67d1ef925;hb=HEAD

    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.


Anmelden zum Antworten