Я пытаюсь внедрить таблицу дескрипторов прерываний в мое ядро (используя сборку), но у меня возникли проблемы. Сначала я отключил прерывания. Затем я загружаю GDT с помощью инструкции lgdt, затем я загружаю адрес IDT с помощью инструкции lidt, затем я переключаюсь в 32-битный защищенный режим. Затем я включаю прерывания, и именно здесь происходит сбой моей программы. Когда я просматриваю журнал виртуальной коробки, я вижу, что GDT и IDT загружены по правильному адресу. Я прикреплю свой код и журнал виртуальной коробки.
main.asm
[org 0x7c00]
KERNEL_OFFSET equ 0x1a00
GDT_OFFSET equ 0x1000
IDT_OFFSET equ 0x1600
ISR_OFFSET equ 0x1400
mov bp, 0x9000
mov sp, bp
call load_gdt
call load_idt
call load_isr
call switch_to_pm
jmp $
%include "switch_to_pm.asm"
%include "disk_load.asm"
idt_descriptor:
dw idt_end - idt_start - 1
dd IDT_OFFSET
[bits 16]
; load_kernel:
; mov bx, KERNEL_OFFSET
; mov dh, 2
; mov dl, [BOOT_DRIVE]
; mov cl, 0x0a
; call disk_load
; ret
load_gdt:
mov bx, GDT_OFFSET
mov dh, 2
mov dl, [BOOT_DRIVE]
mov cl, 0x02
call disk_load
ret
load_idt:
push es
mov bx, IDT_OFFSET
mov dh, 4
mov dl, [BOOT_DRIVE]
mov cl, 0x06
mov ax, 0
mov es, ax
call disk_load
pop es
ret
load_isr:
mov bx, ISR_OFFSET
mov dh, 2
mov dl, [BOOT_DRIVE]
mov cl, 0x04
call disk_load
ret
[bits 32]
BEGIN_PM:
sti
jmp $
BOOT_DRIVE db 0
times 510 - ($ - $$) db 0
dw 0xaa55
%include "gdt.asm"
times 1536 - ($ - $$) db 0
%include "isr.asm"
times 2560 - ($ - $$) db 0
%include "idt.asm"
times 4608 - ($ - $$) db 0
switch_to_pm.asm
[bits 16]
switch_to_pm:
cli
lgdt[(gdt_descriptor-0x7e00)+GDT_OFFSET]
mov dx, 0x20
mov ax, 0x11
out dx, ax
mov dx, 0xa0
out dx, ax
mov dx, 0x21
mov ax, 0x20
out dx, ax
mov dx, 0xa1
mov ax, 0x28
out dx, ax
mov dx, 0x21
mov ax, 0x04
out dx, ax
mov dx, 0xa1
mov ax, 0x02
out dx, ax
mov dx, 0x21
mov ax, 0x01
out dx, ax
mov dx, 0xa1
mov ax, 0x01
out dx, ax
mov dx, 0x21
mov ax, 0x00
out dx, ax
mov dx, 0xa1
mov ax, 0x00
out dx, ax
lidt[idt_descriptor]
mov eax, cr0
or eax, 0x1
mov cr0, eax
jmp CODE_SEG:init_pm
[bits 32]
init_pm:
mov ax, DATA_SEG
mov ds, ax
mov ss, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ebp , 0x90000
mov esp , ebp
call BEGIN_PM
gdt.asm
; GDT
gdt_start:
gdt_null:
dd 0x0
dd 0x0
gdt_code:
dw 0xffff
dw 0x0
db 0x0
db 10011010b
db 11001111b
db 0x0
gdt_data:
dw 0xffff
dw 0x0
db 0x0
db 10010010b
db 11001111b
db 0x0
gdt_end:
gdt_descriptor:
dw gdt_end - gdt_start - 1
dd GDT_OFFSET
CODE_SEG equ gdt_code - gdt_start
DATA_SEG equ gdt_data - gdt_start
idt.asm
; IDT
idt_start:
;entry1: dw (isr1-0x8200)+ISR_OFFSET, CODE_SEG, 0x00e1,0
times 19 dw (isr1-0x8200)+ISR_OFFSET, CODE_SEG, 0x008e,0
dw (isr1-0x8200)+ISR_OFFSET, CODE_SEG, 0x008e,0
dw (isr1-0x8200)+ISR_OFFSET, CODE_SEG, 0x008e,0
times 235 dw (ignoreRequest-0x8200)+ISR_OFFSET, CODE_SEG, 0x008e, 0
idt_end:
isr.asm
; ISR definitions
isr_start:
isr1:
pusha
mov dx, 0x4004
mov ax, 0x3400
out dx, ax
mov ax, 0x20
out 0x20, ax
popa
iret
ignoreRequest:
pusha
mov ax, 0x20
out 0x20, ax
popa
iret
isr_end:
журнал виртуальной коробки
https://filebin.net/172ele3szrfm9ftd