S
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