Gelöst: Fehler im Aufbau des Handler's für den IRQ 14 (Page Fehler)



  • Hallo zusammen,

    ich habe mich die letzten Tage mit dem Paging beschäftigt, jedoch habe ich
    noch ein Problem bei der Rückkehr aus dem Handler.

    Kurze Erklärung was mein Programm machen soll:
    - schreiben des Wertes 123456789d an die Adresse 0x500000 (5 MB)
    - Paging einschalten aber nur die unteren 4 MB sind les- und schreibbar
    - Wert von der Speicherstelle 0x500000 lesen und ausgeben

    mov ebx, 0x500000
    		mov eax, 25111977d
    		mov [ebx], eax
    
    		call paging
    
    		mov ebx, 0x500000
    		mov eax, [ebx]
    

    Da der Zugriff verboten ist, wird der IRQ 14 aufgerufen.
    Dieser soll nun die Page "freischalten" in dem er die Bit 0-2 setzt mittels
    OR Verknüpfung.

    Zeilen 21 bis 34 (davor erfolgt noch eine Fehlermeldung mit Adressangabe)

    IRQ_14:
    			cli
    
    			call clearscreen
    
    			push dword .str_fehler
    			call prints
    			call crlf
    
    			mov eax, cr2
    			push eax
    			call itoh
    			push eax
    			call prints
    
    			push dword .str_fehler2
    			call prints
    			call crlf
    
    			;-------------------------------------------
    			mov ebx, cr3
    			mov ebx, [ebx]
    			and ebx, 0xFFFFF000	;EAX enthält den Anfang der PT
    
    			mov eax, cr2			;Fehleradresse nach EAX
    			shr eax, 12d			;Adresse / 4096
    			xor edx, edx
    			mov ecx, 4d			;Adresse * 4
    			mul ecx
    
    			add ebx, eax			;Adresse auf PT aufaddieren
    			mov eax, [ebx]
    			or eax, 0x7			;letzten 3 Bit setzen
    			mov [ebx], eax		;zurückschreiben
    
    			;-------------------------------------------
    
    			mov eax, cr3
    			mov cr3, eax
    			sti
    			pop ebx
    
    iret
    .str_fehler db "Es ist ein Page Fehler bei Adresse: ",0
    .str_fehler2 db " aufgetreten.",0
    

    Am Ende wird das CR3 Register nochmals mit seinem alten Wert beschrieben und
    ein DWORD vom Stack genommen da hier noch der Fehlercode liegt.

    Der Fehler wurde somit behandelt aber der fehlerauslösende Befehl (Zeile 8
    ganz oben) wird übersprungen und nicht nochmals ausgeführt.

    Der IRQ 14 ist als Interrupt-Gate angelegt.

    Was muss ich ändern damit der fehlerhafte Zugriff nochmals nach dem Aufruf
    des IRQ 14 ausgeführt wird?

    Gruß, Nicky


Anmelden zum Antworten