Исключения и системные вызовы

  1. Исключения - события, которые, помимо условных и безусловных переходов, изменяют нормальный порядок исполнения инструкций.
    • NB Терминология не устоялась. Так intel использует только термин "прерывание". В традиции mips(risc) принято использовать термин "исключение" для обозначения любого неожиданного изменения в алгоритме управления. Термин "прерывание" будет использоваться только для обозначения внешних событий.

  2. Возможная классификация:
    • Тип события

      Источник

      Термин MIPS

      Переполнение

      Внутренний

      Исключение

      Нет инструкции

      Внутренний

      Исключение

      Системный вызов

      Внутренний

      Исключение

      Запрос внешнего устройства

      Внешний

      Прерывание

      Отказ оборудования

      Внутренний/Внешний

      Исключение/Прерывание

  3. Общая идея обработки исключения.
    • Аппаратура процессора обнаруживает исключения и осуществляет передачу управления.
      • переход на фиксированный адрес
      • вектор прерываний
    • Программная обработка
    • Возврат к нормальному порядку исполнения инструкций.
  4. Еще одна возможная классификация:
    • Класс

      Причина

      Синхронное/Асинхронное

      Поведение при возврате

      Аварийное завершение(abort)

      Фатальная ошибка

      Да

      Нет возврашения

      Сбой(fault)

      Потенциально восстановимая ошибка

      Да

      Возможен возврат к следующей инструкции

      Системное прерывание(trap)

      Предусмотренное исключение

      Да

      Возврат к следующей инструкции

      Аппаратное прерывание(interrupt)

      Сигнал устройства ввода/вывода

      Нет

      Возврат к следующей инструкции

  5. Обработка исключений в MIPS на примере эмулятора Mars.
    1. MARS имитирует основные элементы механизма MIPS32 исключений. Набор инструкций MIPS включает в себя ряд инструкций, которые вызывают исключение ловушки на основе относительных значений двух регистров или непосредственного значения и регистра:
      • ten, teqi (ловушки если равно), tne, tnei (ловушки, если не равны), tge, tgeu, tgei, tgeiu (ловушкой, если больше или равно), tlt, tltu, tlti, tltiu (ловушка, если меньше).
      • MARS содержит сопроцессор управления(сопроцессор 0). Инструкции mfc0 и mtc0 используются для чтения и записи данных в сопроцессор 0.
    2. Когда происходит исключение процессор совершает следующие действия:
      • Устанавливает бит 1 регистра $12 (статус).
      • Устанавливает биты 2-6 регистра $13(причина) согласно типу исключения (коды ниже).
      • Устанавливает регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
      • Если исключение было вызвано обращением к неправильному адресу памяти, регистр $8 (vaddr) устанавливается на этот неверный адрес.
      • Поток выполнения переключается с текущей инструкции MIPS на адрес 0x800000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположение обработчика исключений MIPS32.

      • Если нет инструкции по месту 0x800000180, Mars завершит работу программы MIPS с соответствующим сообщением об ошибке.
      • Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.
    3. Типы исключений (не обязательно реализованы):
      • 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)

    4. Регистры $k0 и $k1 по соглашениям могут быть использованы свободно.
    5. Простой пример:
      •    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"
        
  6. Приложение
    1. Coprocessor_0 Mars

      Название

      Номер

      Назначение

      BadVAddr

      8

      Адрес при обращении к которому произошло исключение

      Status

      12

      Состояние: маска прерываний, биты разрешений, ...

      Cause

      13

      Тип исключения и биты отложенных прерываний

      EPC

      14

      Адрес инструкции, которая вызвала исключение

    2. Инструкции для работы с регистрами Cop_0:
      • mfc0 Rdest, C0src
      • mtc0 Rsrc, C0dest
      • eret
    3. Регистр Status:

      bits

      31-16

      15-8

      7-5

      4

      3,2

      1

      0

      target

      unuse

      int. mask

      unuse

      K/U

      unuse

      Exception level

      Int enable

    4. Interrupt mask - Mаска прерываний. Бит равен 1, если соответствующее прерываний разрешено.
    5. K/U - не стимулируется Mars; всегда 1.
    6. Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
    7. Interrupt enable - глобальное разрешение прерываний (0 - отключить).