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 ausgebenmov 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