Автор: 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 ;Линейный адрес таблицы