PXE Zugriff im Protected Mode



  • Hi alle zusammen,
    habe für mein OS einen PXE Bootloader geschrieben, der auf den Zielcomputer übertragen wird und dann dort in den Protected Mode wechselt und ein paar Informationen auf dem Bildschirm ausgibt. So weit so gut. Nun möchte ich natürlich noch einige Dateien vom Server nachladen, da ein Bootloader alleine ja wenig nützlich ercheint 😃 Also habe ich mir die PXE Spezifikation besorgt. Dort steht drin, dass ich in einem bestimmten Speicherbereich nach der !PXE Struktur suchen sollen. Diese habe ich auch gefunden.

    Nun speicher ich den Entry Point, welcher sich am Offset 0x14 der Struktur befindet, für die Protected Mode Funktionen von PXE in einer Variablen:

    add edi, 0x14
        mov dword esi, [es:edi]
        mov dword [PXE_API_Entry], esi
    

    Nun setze ich den "Status Call Out" wie gefordert auf -1

    add edi, 0x04
        mov dword [es:edi], -1
    

    Nun prüfe ich an Offset 0x1D (SegDescCnt), ob ich 4 oder 7 Deskriptoren für PXE anlegen muss

    add edi, 0x05
        cmp byte [es:edi], 0x04
        je sel4
        cmp byte [es:edi], 0x07
        je sel7
    

    In meinem Fall brauche ich sieben Deskriptoren, also schreibe ich nun an Offset 0x1E den FirstSelector wie gefordert:

    add edi, 0x01
        mov word [es:edi], PXE_STACK_SEL
    

    Und natürlich trage ich dann auch die anderen Selektoren in die foglenden sieben, dafür vorgesehenen, Felder ein

    add edi, 0x02
        mov word [es:edi], PXE_STACK_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00002000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_UNDIDATA_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00003000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_UNDICODE_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00004000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_UNDICODEWRITE_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00005000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_BCDATA_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00006000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_BCCODE_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00007000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    
        add edi, 0x02
        mov word [es:edi], PXE_BCWRITE_SEL
        add edi, 0x02
        mov dword [es:edi], 0x00008000
        add edi, 0x04
        mov word [es:edi], 0xFFFF
    

    Soweit so gut! Die Deskriptoren müssen natürlich 16-Bit Deskriptoren sein, auch dann, wenn ich mich im 32-Bit Protected Mode befinde und der Stack auch 32-bittig ist. Hier die sieben Deskriptoren, die ich für PXE angelegt habe

    PXE_STACK_SEL	equ $-gdt
    gdt9:
        dw 0xFFFF
        dw 0x2000
        db 0
        db 0x91
        db 0x4F
        db 0
    
    PXE_UNDIDATA_SEL	equ $-gdt
    gdt10:
        dw 0xFFFF
        dw 0x3000
        db 0
        db 0x91
        db 0x4F
        db 0
    
    PXE_UNDICODE_SEL	equ $-gdt
    gdt11:
        dw 0xFFFF
        dw 0x4000
        db 0
        db 0x95
        db 0x4F
        db 0
    
    PXE_UNDICODEWRITE_SEL	equ $-gdt
    gdt12:
        dw 0xFFFF
        dw 0x5000
        db 0
        db 0x91
        db 0x4F
        db 0
    
    PXE_BCDATA_SEL	equ $-gdt
    gdt13:
        dw 0xFFFF
        dw 0x6000
        db 0
        db 0x91
        db 0x4F
        db 0
    
    PXE_BCCODE_SEL	equ $-gdt
    gdt14:
        dw 0xFFFF
        dw 0x7000
        db 0
        db 0x95
        db 0x4F
        db 0
    
    PXE_BCWRITE_SEL	equ $-gdt
    gdt15:
        dw 0xFFFF
        dw 0x8000
        db 0
        db 0x91	
        db 0x4F
        db 0
    

    Nun möchte ich gerne die PXE Funktion GET CACHED INFO aufrufen und versuche dies wie folgt

    mov ax, PXE_UNDICODE_SEL
        mov es, ax
    
        push es
        push s_PXENV_GET_CACHED_INFO
        push 0x0071
        call far [PXE_API_Entry]
        add esp, 3 * 4
    

    s_PXENV_GET_CACHED_INFO ist eine Struktur, die ich wie folgt angelegt habe

    s_PXENV_GET_CACHED_INFO:
        status      db 0x00 
        packetType  dw 0x0002
        bufferSize  dw 0x0000
        buffer      dw 0x0000
        bufferLimit dw 0x0000
    

    Wenn ich aber nun den Far Call ausführe, startet sich der PC neu, bzw. mein OS gibt eine Schutzverletzung aus.

    Wo liegt mein Fehler. Vielleciht habe ich was fundermentales übersehen. Ich bin für jede Hilfe dankbar. Wenn ihr noch mehr Informationen brauchen solltet, sagt einfach bescheid 🙂

    Und schonmal vielen Dank für eure Mühen!


Anmelden zum Antworten