Excepción INVALID_OPCODE extraña al inicializar IDT (núcleo de 64 bits)
Aquí está el código que configura la IDT.
global lngmd<em>start
extern kernel</em>main
extern gdt.data
section .text
bits 64
lngmd<em>start:
mov ax, gdt.data
mov ss, ax
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
call map</em>entries
lidt [idt.pointer]
sti
;call kernel<em>main
;int 0x00
jmp krnl</em>hlt
map<em>entries:
mov rbx, idt
.map</em>exceptions:
mov rdx, 0
mov r8, exception<em>handler
mov rcx, 32
jmp .loop
.map<em>irqs<em>pic1:
mov rdx, 1
mov r8, isr</em>handler.pic1
mov rcx, 8
jmp .loop
.map<em>irqs</em>pic2:
mov rdx, 2
mov r8, isr<em>handler.pic2
mov rcx, 8
.loop:
mov rax, r8
mov word [rbx], ax
shr rax, 16
mov word [rbx + 6], ax
shr rax, 16
mov dword [rbx + 8], eax
add rbx, 16
dec rcx
;jmp krnl</em>hlt ; Esto funciona según lo previsto y detiene el kernel, mostrando "a2"
jne .loop
jmp krnl<em>hlt ; esto se supone que imprimirá "a2" y luego se detendrá, pero causa una excepción INVALID_OPCODE (0x6 en el depurador de QEMU). Si se elimina este salto, el código se bloquea sin excepciones.
test rdx, rdx
je .map<em>irqs</em>pic1
dec rdx
test rdx, rdx
je .map<em>irqs</em>pic2
ret
idt:
.exception<em>0:
dw 0
dw 0x8
db 0
db 10001110b
dw 0
dd 0
dd 0
; --------------------------------
; excepciones 1 - 30
; --------------------------------
.exception</em>31:
dw 0
dw 0x8
db 0
db 10001110b
dw 0
dd 0
dd 0
.irq<em>0:
dw 0
dw 0x8
db 0
db 10001110b
dw 0
dd 0
dd 0
; --------------------------------
; interrupciones 1 - 14
; --------------------------------
.irq</em>15:
dw 0
dw 0x8
db 0
db 10001110b
dw 0
dd 0
dd 0
.pointer:
dw $ - idt - 1
dq idt
exception<em>handler:
jmp krnl</em>hlt
isr_handler:
.pic1:
mov ax, 0x20
out 0x20, ax
iretq
.pic2:
mov ax, 0x20
out 0xa0, ax
iretq
krnl_hlt:
mov dword [0xb8000], 0x0c320c61
abbc:
hlt
nop
jmp abbc
He pasado las últimas 5 horas intentando diferentes formas de hacer que esta IDT funcione a través de muchos métodos diferentes, y normalmente no hago preguntas, pero parece que he llegado a un callejón sin salida. Si me he perdido alguna información requerida o he hecho una “mala pregunta”, avísenme y trataré de mejorarla.
davy.ai
Pregunta
¿Cuál es el propósito del código proporcionado y qué problemas has encontrado al intentar configurar la Tabla de Descriptores de Interrupción (IDT)?
Respuesta
El propósito del código proporcionado es configurar la Tabla de Descriptores de Interrupción (IDT) en un sistema operativo de 64 bits. La IDT es una estructura de datos utilizada por el procesador para gestionar interrupciones y excepciones. El código configura la IDT mediante el mapeo de los manejadores de excepción e interrupción a sus correspondientes entradas en la IDT.
Los problemas encontrados al intentar configurar la IDT no están especificados en la pregunta proporcionada.