Taskwechsel auf CPL 3 = Prozessorfehler



  • Hallo zusammen,

    Was ich machen möchte:

    Von einer Task (CPL 0) in eine Task mit CPL3 wechseln mittels
    JMP 0x20:123456

    Was ich erstellt habe:

    GDT:

    gdttabelle:			;0
    		dd 0
    		dd 0
    
    CODE:				;8
    		dw 0xFFFF
    		dw 0                 		;wird zur Laufzeit eingetragen
    		db 0                 			;wird zur Laufzeit eingetragen
    		db 11111010b
    		db 11001111b			;DB und G Bit gesetzt
    		db 0
    
    DATEN:				;16		0x10
    		dw 0xFFFF
    		dw 0					;wird zur Laufzeit eingetragen
    		db 0		                 	;wird zur Laufzeit eingetragen
    		db 11110010b
    		db 11001111b			;DB und G Bit gesetzt
    		db 0		
    TMPTSS:				;24		;0x18
    		dw 0x67
    		dw tmpbuffer
    		dw 0x8900
    		dw 0	
    usertss1:				;32		0x20
    		dw 0x67
    		dw ITT
    		dw 0x8900
    		dw 0
    

    Bei dem Code- und Datensegment habe ich DPL auf 3 gestellt, damit alle darauf
    zugreifen dürfen.
    Das TSS in Zeile 21 wird nur temporär verwendet bis zum wechsel.

    TSS erstellt:

    ITT:
    dw 0				;Backlinkfeld
    dw 0				;NULL
    dd 0x80000		;ESP0
    dw 0x10			;SS0
    dw 0				;NULL
    dd 0				;ESP1
    dw 0				;SS1
    dw 0				;NULL
    dd 0				;ESP2
    dw 0				;SS2
    dw 0				;NULL
    dd 0		;Cr3 = 0x21000 = 135 KByte
    .eip dd user2		;EIP
    .eflag dd 0x3002	;EFlag
    ;----- allgemeine Register
    dd 0				;EAX
    dd 0				;ECX
    dd 0				;EDX
    dd 0				;EBX
    dd 0x88000       	;ESP
    dd 0				;EBP
    dd 0				;ESI
    dd 0				;EDI
    ;-------
    dw 0x13			;ES
    dw 0				;
    dw 0xB			;CS
    dw 0				;
    dw 0x13			;SS
    dw 0				;
    dw 0x13			;DS
    dw 0				;
    dw 0x13			;FS
    dw 0				;
    dw 0x13			;GS
    dw 0				;
    dw 0				;LDT Selektor
    dw 0				;NULL
    dd 0				;
    

    Bei den EFlags habe ich IOPL auf 3 gestellt damit auch hier
    keine Einschränkungen bestehen.

    Wenn ich in Zeile 28 CS auf 0x8 umschreibe funktioniert auch alles.
    Andernfalls kommt der Prozessorfehler.

    Was habe ich denn vergessen?

    Gruß, Nicky



  • 0x8 (wie im Text) oder 0xB (wie im Code)?



  • Hallo Mr X,

    ich verstehe die Frage nicht 😕

    Nicky



  • Dein Fehler ist vermutlich, dass dein Code-Segment als DPL 0 hat und dementsprechend kein Zugriff darauf gegeben wird, wenn der RPL des Code-Segments 0x3 ist. Normalerweise hat man fuer User- und Kernelmode sowieso verschiedene GDT-Eintraege, einmal DPL 0 und einmal DPL 3, auch, wenn Limit, Base etc. gleich ist.

    EDIT: Wenn du bei uns in den IRC kommen wuerdest, koennten wir Fragen, sofern nicht alle AFK sind, auch zeitnaher beantworten, als es hier im Forum moeglich ist.



  • Nun habe ich für DPL 0 und DPL 3 jeweils ein Code und Datensegment erstellt.
    Läuft 👍

    Gruß, Nicky


Log in to reply