Как мне получить таблицу дескрипторов прерываний для работы? - PullRequest
0 голосов
/ 31 марта 2020

Я пытаюсь внедрить таблицу дескрипторов прерываний в мое ядро ​​(используя сборку), но у меня возникли проблемы. Сначала я отключил прерывания. Затем я загружаю 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

...