РЕДАКТИРОВАТЬ: исходный код можно найти в моем репо на Github: https://github.com/tuhdo/os-study.
Я сопоставил IRQ 2 PIC (x86) с 32-й записью и далее в IDT. Чтобы проверить прерывания PIC, я назначил первую 31 подпрограмму той же функции. Проблема в том, что я не могу заставить работать 15-ю запись прерывания, поскольку она зарезервирована в соответствии с таблицей векторов прерываний. То есть всякий раз, когда я попадаю в защищенный режим, после включения режима в cr0
и перехода к первой инструкции в пространстве ядра (последняя строка в stage2.asm
, то есть jmp 08h:0xFF0
) происходит сбой (в Bochs он переходит на адрес f000:fff0
, который происходит, когда что-то идет не так). Без добавления 15-й записи я могу выполнить весь код и правильно завершить работу с помощью инструкции hlt
.
Поскольку запись зарезервирована, что мне делать, чтобы пропустить запись за 15 часов? В настоящее время моя общая запись IDT выглядит так:
;; IRQ0
dw 0
dw 0x30 ; gdt selector 0x30
db 0
db 011001110b ; interrupt gate callable from userspace
dw 0
Соответствующий код находится в gdt.inc и idt.inc. Моя ОС имеет несколько основных функций:
- Загрузчик
- 32-битный защищенный режим.
- Системные вызовы (из пользовательского пространства в ядро и обратно)
- Поддержка начального прерывания: пока что я могу обрабатывать деление на 0 или явный вызов прерывания (т.е.
int 1
). Я уже активировал PIC (pic.inc) и хотел чтобы попробовать, так как я сопоставил прерывания PIC в 0x32. Однако после добавления 15-й записи IDT я получил тройную ошибку, в то время как 14-я и ниже у меня такой проблемы не было.
INT 0x0f
. - person Ross Ridge   schedule 12.10.2015user_space.asm
- person Tu Do   schedule 12.10.2015user_space.asm
, но после добавления 15-й записи вidt.inc
и при попытке перейти к первой инструкции ядра (расположенной в 0x10ff0, вы можете увидеть код ядра вkernel.asm
) в защищенном режим, он разбился. Я не уверен, произошло ли в это время какое-то прерывание, требующее 15-й записи. - person Tu Do   schedule 12.10.2015