Da ich bei mir gerade nicht weiter komme, habe ich mir deinen Minimalkernel angeschaut.
Da ist mir aufgefallen, dass ich die Alignment Check Exception anders aufgestzt hatte als bei dir:
; 17: Alignment Check Exception (With Error Code!)
_isr17:
cli
;push dword 0 ; correct?
push dword 17
jmp isr_common_stub
Ist da so wirklich o.k.?
Ansonsten habe ich eine Unsymmetrie bei mir, bezüglich der ich nicht weiß, ob es stört oder nicht:
Ich habe z.Z. einen fault_handler für die exceptions, über den ich auch den Software Interrupt (0x7F) für die Syscalls abwickle:
isr_common_stub:
;pusha
push eax
push ecx
push edx
push ebx
;push esp
push ebp
push esi
push edi
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov eax, esp
push eax
mov eax, _fault_handler
call eax
pop eax
pop gs
pop fs
pop es
pop ds
;popa
pop edi
pop esi
pop ebp
;pop esp
pop ebx
pop edx
pop ecx
pop eax
add esp, 8
iret
... auf der anderen Seite habe ich einen _irq_handler1 für IRQ0 bis IRQ15, den ich nach eurem Vorbild aufgebaut habe:
irq_common_stub:
push eax
push ecx
push edx
push ebx
push ebp
push esi
push edi
push ds
push es
push fs
push gs
mov ax, 0x10
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
push esp ; parameter of _irq_handler1
call _irq_handler1 ;
global _irq_tail
_irq_tail:
mov esp, eax ; return value: changed or unchanged esp
pop gs
pop fs
pop es
pop ds
pop edi
pop esi
pop ebp
pop ebx
pop edx
pop ecx
pop eax
add esp, 8
iret
In irq_handler1 läuft momentan das direkte task_switching ab.