es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , , ,

Answer

  1. Avatar for 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.

Comments are closed.