Защищенный режим процессоров Intel


Программа, которая работает с прерываниями - часть 3


null_idt idt_struc <> CODESEG PROC set_rmode NEAR mov [real_sp],sp ; Переводим процессор в состояние отключения, ; это эквивалентно аппаратному сбросу, но ; выполняется быстрее. ; Сначала мы загружаем IDTR нулями, затем ; выдаём команду прерывания. lidt [FWORD null_idt] int 3 rwait: hlt jmp rwait LABEL shutdown_return FAR

Регистр IDTR загружается нулями, следовательно, предел дескрипторной таблицы прерываний равен нулю. После этого мы выдаём команду программного прерывания. При обработке прерывания возникает исключение, так как регистр IDTR инициализирован неправильно. Но это исключение не может быть обработано по той же причине, что вызывает новое исключение. Теперь процессор переходит уже в состояние отключения и выполняет рестарт в реальном режиме. Что нам и требовалось получить!

Для удобства мы вынесли в отдельный файл tiny-os.inc все необходимые определения структур данных и констант (листинг 2). Файл tiny-os.asm содержит саму программу, текст которой приведён в листинге 3.

Листинг 2. Структуры данных и константы. ----------------------------------------------------------- ; ------------------------------------------------------------ ; Определения структур данных и констант ; ------------------------------------------------------------ STRUC desc_struc ; структура дескриптора limit dw 0 ; предел base_l dw 0 ; мл. слово физического адреса base_h db 0 ; ст. байт физического адреса access db 0 ; байт доступа rsrv dw 0 ; зарезервировано ENDS desc_struc STRUC idt_struc ; вентиль прерывания destoff dw 0 ; смещение обработчика destsel dw 0 ; селектор обработчика nparams db 0 ; кол-во параметров assess db 0 ; байт доступа rsrv dw 0 ; зарезервировано ENDS idt_struc STRUC idtr_struc ; регистр IDTR idt_lim dw 0 ; предел IDT idt_l dw 0 ; мл. слово физического адреса idt_h db 0 ; ст. байт физического адреса rsrv db 0 ; зарезервировано ENDS idtr_struc ; --------------------------------------------------------------- ; Биты байта доступа ACC_PRESENT EQU 10000000b ; сегмент есть в памяти ACC_CSEG EQU 00011000b ; сегмент кода ACC_DSEG EQU 00010000b ; сегмент данных ACC_EXPDOWN EQU 00000100b ; сегмент расширяется вниз ACC_CONFORM EQU 00000100b ; согласованный сегмент ACC_DATAWR EQU 00000010b ; разрешена запись ACC_INT_GATE EQU 00000110b ; вентиль прерывания ACC_TRAP_GATE EQU 00000111b ; вентиль исключения ; ------------------------------------------------------------ ; Типы сегментов ; сегмент данных DATA_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR ; сегмент кода CODE_ACC = ACC_PRESENT OR ACC_CSEG OR ACC_CONFORM ; сегмент стека STACK_ACC = ACC_PRESENT OR ACC_DSEG OR ACC_DATAWR OR ACC_EXPDOWN ; байт доступа сегмента таблицы IDT IDT_ACC = DATA_ACC ; байт доступа вентиля прерывания INT_ACC = ACC_PRESENT OR ACC_INT_GATE ; байт доступа вентиля исключения TRAP_ACC = ACC_PRESENT OR ACC_TRAP_GATE ; ------------------------------------------------------------ ; Константы STACK_SIZE EQU 0400 ; размер стека B_DATA_SIZE EQU 0300 ; размер области данных BIOS B_DATA_ADDR EQU 0400 ; адрес области данных BIOS MONO_SEG EQU 0b000 ; сегмент видеопамяти ; монохромного видеоадаптера COLOR_SEG EQU 0b800 ; сегмент видеопамяти ; цветного видеоадаптера CRT_SIZE EQU 4000 ; размер сегмента видеопамяти ; цветного видеоадаптера MONO_SIZE EQU 1000 ; размер сегмента видеопамяти ; монохромного видеоадаптера CRT_LOW EQU 8000 ; мл.


Начало  Назад  Вперед