Исключения и системные вызовы
- Исключения - события, которые, помимо условных и безусловных переходов, изменяют нормальный порядок исполнения инструкций.
NB Терминология не устоялась. Так intel использует только термин "прерывание". В традиции mips(risc) принято использовать термин "исключение" для обозначения любого неожиданного изменения в алгоритме управления. Термин "прерывание" будет использоваться только для обозначения внешних событий.
- Возможная классификация:
Тип события
Источник
Термин MIPS
Переполнение
Внутренний
Исключение
Нет инструкции
Внутренний
Исключение
Системный вызов
Внутренний
Исключение
Запрос внешнего устройства
Внешний
Прерывание
Отказ оборудования
Внутренний/Внешний
Исключение/Прерывание
- Общая идея обработки исключения.
- Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
- переход на фиксированный адрес
- вектор прерываний
- Программная обработка
- Возврат к нормальному порядку исполнения инструкций.
- Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
- Еще одна возможная классификация:
Класс
Причина
Синхронное/Асинхронное
Поведение при возврате
Аварийное завершение(abort)
Фатальная ошибка
Да
Нет возврашения
Сбой(fault)
Потенциально восстановимая ошибка
Да
Возможен возврат к следующей инструкции
Системное прерывание(trap)
Предусмотренное исключение
Да
Возврат к следующей инструкции
Аппаратное прерывание(interrupt)
Сигнал устройства ввода/вывода
Нет
Возврат к следующей инструкции
- Обработка исключений в MIPS на примере эмулятора Mars.
- MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
- ten, teqi (ловушки если равно), tne, tnei (ловушки, если не равны), tge, tgeu, tgei, tgeiu (ловушкой, если больше или равно), tlt, tltu, tlti, tltiu (ловушка, если меньше).
- MARS содержит сопроцессор управления(сопроцессор 0). Инструкции mfc0 и mtc0 используются для чтения и записи данных в сопроцессор 0.
- Когда происходит исключение процессор совершает следующие действия:
- Устанавливает бит 1 регистра $12 (статус).
- Устанавливает биты 2-6 регистра $13(причина) согласно типу исключения (коды ниже).
- Устанавливает регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
- Если исключение было вызвано обращением к неправильному адресу памяти, регистр $8 (vaddr) устанавливается на этот неверный адрес.
Поток выполнения переключается с текущей инструкции MIPS на адрес 0x800000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположение обработчика исключений MIPS32.
- Если нет инструкции по месту 0x800000180, Mars завершит работу программы MIPS с соответствующим сообщением об ошибке.
- Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.
- Типы исключений (не обязательно реализованы):
- ADDRESS_EXCEPTION_LOAD (4)
- ADDRESS_EXCEPTION_STORE (5)
- SYSCALL_EXCEPTION (8),
- BREAKPOINT_EXCEPTION (9),
- RESERVED_INSTRUCTION_EXCEPTION (10),
- ARITHMETIC_OVERFLOW_EXCEPTION (12),
- TRAP_EXCEPTION ( 13),
- DIVIDE_BY_ZERO_EXCEPTION (15),
- FLOATING_POINT_OVERFLOW (16),
- FLOATING_POINT_UNDERFLOW (17).
NB Int(0) неявно.(хак MARS)
- Регистры $k0 и $k1 по соглашениям могут быть использованы свободно.
- Простой пример:
1 .text 2 main: 3 teqi $t0,0 # immediately trap because $t0 contains 0 4 li $v0, 10 # After return from exception handler, specify exit service 5 syscall # terminate normally 6 7 # Trap handler in the standard MIPS32 kernel text segment 8 9 .ktext 0x80000180 10 move $k0,$v0 # Save $v0 value 11 move $k1,$a0 # Save $a0 value 12 la $a0, msg # address of string to print 13 li $v0, 4 # Print String service 14 syscall 15 move $v0,$k0 # Restore $v0 16 move $a0,$k1 # Restore $a0 17 mfc0 $k0,$14 # Coprocessor 0 register $14 has address of trapping instruction 18 addi $k0,$k0,4 # Add 4 to point to next instruction 19 mtc0 $k0,$14 # Store new address back into $14 20 eret # Error return; set PC to value in $14 21 .kdata 22 msg: 23 .asciiz "Trap generated"
- MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
- Приложение
- Coprocessor_0 Mars
Название
Номер
Назначение
BadVAddr
8
Адрес при обращении к которому произошло исключение
Status
12
Состояние: маска прерываний, биты разрешений, ...
Cause
13
Тип исключения и биты отложенных прерываний
EPC
14
Адрес инструкции, которая вызвала исключение
- Инструкции для работы с регистрами Cop_0:
- mfc0 Rdest, C0src
- mtc0 Rsrc, C0dest
- eret
Регистр Status:
bits
31-16
15-8
7-5
4
3,2
1
0
target
unused
Int. mask
unuse
K/U
unused
Exception level
Int enable
- Interrupt mask - Mаска прерываний. Бит равен 1, если соответствующее прерываний разрешено.
- K/U - не стимулируется Mars; всегда 1.
- Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
- Interrupt enable - глобальное разрешение прерываний (0 - отключить).
Регистр Cause:
bits
31
30-16
15-8
7
6-2
1-0
target
Br
unused
Pending interrupts
unused
Exception code
unused
- Br - 1 если исключение произошло на инструкции в слоте задержки перехода.
- Pending interrupts - ожидающие прерывания.
- Exception code - код исключения.
- Coprocessor_0 Mars