Hi Leute,
ich habe jetzt schon seit langer Zeit Probleme mit der Registerübergabe. Ich möchte, dass wenn ein ISR-Handler aufgerufen wird, alle Register der CPU an die C-Funktion übergeben werden. Da bei vielen Tuts auch gleich so ein Beispiel war, wollte ich jetzt einfach mal das hier ausprobieren http://www.osdever.net/bkerndev/Docs/isrs.htm
Aber es funktioniert nicht. Der ISR-handler wird zwar aufgerufen, aber als Description kommen nur 3 kryptische Zeichen.
Des weiteren habe ich noch eine Verständnisfrage:
Die CPU_Register sind ja alle unterschiedlich groß. (Es gibt 32bit, 16bit, ...)
Warum werden in allen Tuts die Register in jeweils einen int gepackt? Wenn sie doch unterschiedlich groß sind, müsste man doch auch unterschiedliche Datentypen nehmen.
Hier mein Code:
Was habe ich falsch gemacht?
ich habe jetzt schon seit langer Zeit Probleme mit der Registerübergabe. Ich möchte, dass wenn ein ISR-Handler aufgerufen wird, alle Register der CPU an die C-Funktion übergeben werden. Da bei vielen Tuts auch gleich so ein Beispiel war, wollte ich jetzt einfach mal das hier ausprobieren http://www.osdever.net/bkerndev/Docs/isrs.htm
Aber es funktioniert nicht. Der ISR-handler wird zwar aufgerufen, aber als Description kommen nur 3 kryptische Zeichen.
Des weiteren habe ich noch eine Verständnisfrage:
Die CPU_Register sind ja alle unterschiedlich groß. (Es gibt 32bit, 16bit, ...)
Warum werden in allen Tuts die Register in jeweils einen int gepackt? Wenn sie doch unterschiedlich groß sind, müsste man doch auch unterschiedliche Datentypen nehmen.
Hier mein Code:
Code: [Auswählen]
struct SISRParam
{
unsigned int gs, fs, es, ds; /* pushed the segs last */
unsigned int edi, esi, ebp, esp, ebx, edx, ecx, eax; /* pushed by 'pusha' */
unsigned int int_no, err_code; /* our 'push byte #' and ecodes do this */
unsigned int eip, cs, eflags, useresp, ss; /* pushed by the processor automatically */
};
const char* ExceptionMessage[] = // Descriptions for the Exceptions
{
"Division By Zero Exception",
"Debug Exception",
"Non Maskable Interrupt Exception",
"Breakpoint Exception",
"Into Detected Overflow Exception",
"Out of Bounds Exception",
"Invalid Opcode Exception",
"No Coprocessor Exception",
"Double Fault Exception",
"Coprocessor Segment Overrun Exception",
"Bad TSS Exception",
"Segment Not Present Exception",
"Stack Fault Exception",
"General Protection Fault Exception",
"Page Fault Exception",
"Unknown Interrupt Exception",
"Coprocessor Fault Exception",
"Alignment Check Exception",
"Machine Check Exception",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions",
"Reserved Exceptions"
};
Code: [Auswählen]
ISR0:
cli ; Disable all interrupts
push byte 0 ; Push the isr number on th stack
push byte 0
jmp FAULT_HANDLER ; Jump to the general faulthandler
ISR1:
cli
push byte 1
push byte 1
jmp FAULT_HANDLER
; Create the parameters
pusha
push ds
push es
push fs
push gs
mov ax, 0x10 ; Load the Kernel Data Segment descriptor!
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov eax, esp ; Push us the stack
push eax
; Call the c-FaultHandler
mov eax, FaultHandler
call eax
ret
Was habe ich falsch gemacht?

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert