Rambler's
Top100

Пример обработки прерываний в защищенном режиме

Автор: lonesome TSH/Digital Daemons
Дата: .01.2003
Раздел: Низкоуровневое программирование в Linux

Ниже приведен код функции, которая выполняет настройку таблицы прерываний (объявляя обработчиком всех прерываний процедуру ignore_int) и разрешает их обработку


[BITS 32]


;По этому адресу будет размещена таблица
%define id_table 0x100000

;Экспортируемая функция
global enable_interrupts


enable_interrupts:
push ebp
mov ebp, esp

;Первая половина смещения должна быть записана в первые два байта
;а вторая половина - в последние два байта

lea edx, [ignore_int]

;Старшие два байта - селектор сегмента:
mov eax, 0x00100000

;Выполняется перестановка:
mov ax, dx

;Уровень привилегий - 0
;тип дескриптора - 32 битный шлюз прерывания
mov dx, 0x8e00
lea edi, [id_table]

;Заполнение 256 дескрипторов:
mov ecx, 256
.loop:
mov [edi], eax
mov [edi+4], edx
add edi, 8
dec ecx
jne .loop

;Загрузка таблицы в регистр IDTR
lidt [id_reg]

;Разрешение обработки прерываний:
sti

pop ebp
ret
;===========================================================;

ignore_int:
push eax

;Аппаратное прерывание должно выполнить это:
mov al, 0x20
out 0x20, al

pop eax
iret

id_reg:
dw 256*8 - 1	;Количество прерываний в таблице
dd id_table	;Линейный адрес таблицы


Rambler's Top100