Различия между версиями 2 и 3
Версия 2 от 2019-04-05 15:57:49
Размер: 6407
Редактор: FrBrGeorge
Комментарий:
Версия 3 от 2019-04-05 16:00:54
Размер: 13587
Редактор: FrBrGeorge
Комментарий:
Удаления помечены так. Добавления помечены так.
Строка 58: Строка 58:
=== Обработка исключний в MIPS ===
Следит за аппаратурой, устанавливает и хранит дополнительные данные о событиях специальный ''управляющий сопроцессор'' MIPS (coprocessor0).

 . MARS имитирует основные элементы механизма MIPS32 исключений Регистры сопроцессора 0 MARS:

||'''Название''' ||'''Номер''' ||'''Назначение''' ||
||BadVAddr ||8 ||Адрес, при обращении к которому произошло исключение (при записи/чтении по защищённому адресу) ||
||Status ||12 ||Состояние: маска прерываний, биты разрешений, ... ||
||Cause ||13 ||Тип («причина») исключения и биты отложенных прерываний ||
||EPC ||14 ||Адрес инструкции, которая вызвала исключение (или во время выполнения которой произошло прерывание) ||


Инструкции для работы с регистрами управляющего сопроцессора:

 1. mfc0 Rdest, C0src — загрузить содержимое управляющего регистра C0src в регистр общего назначения Rdest
 1. mtc0 Rsrc, C0dest — загрузить содержимое регистра общего назначения C0src в управляющий регистр Rdest
 1. eret — вернуться из обработчика исключительной ситуации Когда происходит исключение, сопроцессор совершает следующие действия:

 1. Устанавливает бит 1 управляющего регистра $12 (EXception Level, EXL).
 1. Устанавливает биты 2-6 управляющего регистра $13(причина) согласно типу исключения
 1. Устанавливает управляющий регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
 1. Если исключение было вызвано обращением к неправильному адресу памяти, управляющий регистр $8 (BadVaddr) устанавливается на этот неверный адрес.
 1. Поток выполнения переключается с текущей инструкции MIPS на адрес '''0x8000180'''. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположением обработчика исключений MIPS32.
 1. Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Кроме того, '''eret''' очищает бит EXL (см. далее)
 '''Замечание''': Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.

Лень и надувательство (см. спойлер): /*(если MARS ничего не записывает при трансляции в .ktext 0x8000180, он сам будет обрабатывать исключения и завершит работу программы MIPS с соответствующим сообщением об ошибке. В более аккуратных имитациях MIPS и в настоящих MIPS .ktext (и в первую очередь — 0x8000180) заполнены программным кодом ядра, но в MARS там по умолчанию ничего нет!)*/

Регистр '''Status''':
||bits ||31-16 ||15-8 ||7-5 ||4 ||3,2 ||1 ||0 ||
||target ||unused ||Int. mask ||unused ||K/U ||unused ||Exception level ||Int enable ||




 * Interrupt mask - Mаска прерываний. Соответствующий прерыванию бит равен 1, если данное прерывание разрешено. Если бит равен 0, соответствующее прерывание не обрабатывается (запрещено)
 * K/U - Kernel Mode / User Mode. User mode не эмулируется Mars; всегда 1.
 * Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
 * Interrupt enable - глобальное разрешение прерываний (0 - отключить). В других версиях MIPS биты 0-5 регистра Status используются по-иному:

 * бит 1 отображает состояние Kernel(=0)/User(=1) mode (то есть работает ли в данный момент процессор в режиме Kernel mode или в режиме User mode)
 * бит 0 отображает резрешение (=1) прерываний
 * когда происходит обработка исключений, биты 3-2 записываются в биты 5-4, биты 1-0 — в биты 3-2, а в биты 1-0 записывается текущее состояние процессора
 * когда происходит выход из обработчика исключений, восстанавливаются предыдущие значения: 3-2 → 1-0, 5-4 → 3-2

Таким образом, в регистре Status формируется трёхуровневый стек для хранения состояний. Если обработка [[https://moodle.cs.msu.ru/mod/lesson/view.php?id=1950|прерывания]] в прерывании запрещена, достаточно двух уровней, но есть, например, программные ловушки (trap).

Регистр '''Cause''':
||31 ||30-16 ||15-8 ||7 ||6-2 ||1-0 ||
||Br ||unused ||Pending interrupts ||unused ||Exception code ||unused ||




 * Br = 1, если исключение произошло на инструкции в слоте задержки перехода (это деталь конвейера, не обращайте внимания пока:)
 * Pending interrupts - ожидающие [[https://moodle.cs.msu.ru/mod/lesson/view.php?id=1950|прерывания]]. [[https://moodle.cs.msu.ru/mod/lesson/view.php?id=1950|Прерывания]] ''асинхронны'' и вызываются ''внешними'' причинами, так что одновременно их вполне может произойти несколько.
 * Exception code - код исключения.

Исключения и многофайловые проекты

Демонстрация calltrace с помощью macros.inc

Программные исключения

Базовая лекция

Обработка событий в ЭВМ

Что такое «событие»?

  • Происходит в процессе работы (какой-либо программы)
  • Происходит по какой-то причине, явно в программе не заданной

    • дополнительно: программная имитация события

  • Вызывает изменение потока вычислений
    • Вариант реализации: меняется значение счётчика команд
    • Скорее всего, обрабатывается ядром ОС

    Свойства события
  • Асинхронное / активированное синхронно
  • Неожиданное / предполагаемое
  • Требующее возврата к прежнему вычислительному процессу / финальное Терминология плавающая. В архитектуре Intel принято все события называть «прерываниями» В MIPS:
  • прерывания — это события, вызванные внешними причинами (аппаратные)

  • исключения — события, вызванные внутренними причинами (программные)

Тип события

Место в программе известно

Предусмотрено
программой

Источник

Термин

Нештатная ситуация вычислительного процесса (деление на 0, переполнение, защита памяти, нет такой инструкции и т. п.)

да

нет

Внутренний

Исключение (exception)

Имитация нештатной ситуации («система, разбирайся»). В MIPS — исключение TRAP_EXCEPTION

да

да

Внутренний

Ловушка (trap)

Обращение к функции операционной системы

да

да

Внутренний

Системный вызов (system call)

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

нет

нет

Внешний

Прерывание (interrupt)

Сбой внешнего устройства

иногда

нет

Внешний

Прерывание (interrupt)

Строго говоря, системный вызов — не событие, т. к. всегда явно вызывается программой, но также требует обработки ядром. Общая идея обработки событий.

  • Аппаратура процессора обнаруживает событие и осуществляет передачу управления.
    • на фиксированный адрес (как в MIPS, адрес обработчика 0x80000180)
    • с помощью «вектора прерываний» (он же таблица переходов) — аппаратно поддерживаемая таблица адресов. Предположим, что она находится по адресу 0x80000100

Адрес

Содержимое

Пояснение

0x80000100

0x80000180

адрес обработчика исключения № 0

0x80000104

0x800007ac

адрес обработчика исключения № 1

0x80000108

0x800015b0

адрес обработчика исключения № 2

0x80000120

0x80000e54

адрес обработчика исключения № 8

  • Таблица переходов в MIPS отсутствует:

    • Аппаратная поддержка: двойная косвенность.
    • При получении исключения вычисляется адрес ячейки, из неё берётся адрес обработчика (+операция доступа к памяти).
  • Программная обработка события
    • Аппаратная поддержка: запрет и/или дисциплина обработки повторных событий (событие внутри события); возможно, специальный режим работы процессора

    • Аппаратная поддержка: тип события (выставляется следящей аппаратурой)
  • Возврат к нормальному порядку исполнения инструкций
    • Аппаратная поддержка: адрес возврата запоминается аппаратурой
    • Возможны сложности с конвейером (см. лекцию про конвейер)

Обработка исключний в MIPS

Следит за аппаратурой, устанавливает и хранит дополнительные данные о событиях специальный управляющий сопроцессор MIPS (coprocessor0).

  • MARS имитирует основные элементы механизма MIPS32 исключений Регистры сопроцессора 0 MARS:

Название

Номер

Назначение

BadVAddr

8

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

Status

12

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

Cause

13

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

EPC

14

Адрес инструкции, которая вызвала исключение (или во время выполнения которой произошло прерывание)

Инструкции для работы с регистрами управляющего сопроцессора:

  1. mfc0 Rdest, C0src — загрузить содержимое управляющего регистра C0src в регистр общего назначения Rdest
  2. mtc0 Rsrc, C0dest — загрузить содержимое регистра общего назначения C0src в управляющий регистр Rdest
  3. eret — вернуться из обработчика исключительной ситуации Когда происходит исключение, сопроцессор совершает следующие действия:
  4. Устанавливает бит 1 управляющего регистра $12 (EXception Level, EXL).
  5. Устанавливает биты 2-6 управляющего регистра $13(причина) согласно типу исключения
  6. Устанавливает управляющий регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
  7. Если исключение было вызвано обращением к неправильному адресу памяти, управляющий регистр $8 (BadVaddr) устанавливается на этот неверный адрес.

  8. Поток выполнения переключается с текущей инструкции MIPS на адрес 0x8000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположением обработчика исключений MIPS32.

  9. Обработчик исключений может вернуть управление программе, используя команду eret. Это поместит значение из "EPC" (регистр $14) в счетчик команд("PC"). Кроме того, eret очищает бит EXL (см. далее) Замечание: Увеличение регистра $14 на 4 перед возвращением позволит пропустить инструкцию, вызвавшую исключение.

Лень и надувательство (см. спойлер): /*(если MARS ничего не записывает при трансляции в .ktext 0x8000180, он сам будет обрабатывать исключения и завершит работу программы MIPS с соответствующим сообщением об ошибке. В более аккуратных имитациях MIPS и в настоящих MIPS .ktext (и в первую очередь — 0x8000180) заполнены программным кодом ядра, но в MARS там по умолчанию ничего нет!)*/

Регистр Status:

bits

31-16

15-8

7-5

4

3,2

1

0

target

unused

Int. mask

unused

K/U

unused

Exception level

Int enable

  • Interrupt mask - Mаска прерываний. Соответствующий прерыванию бит равен 1, если данное прерывание разрешено. Если бит равен 0, соответствующее прерывание не обрабатывается (запрещено)
  • K/U - Kernel Mode / User Mode. User mode не эмулируется Mars; всегда 1.
  • Exception level - устанавливается автоматически при исключении; предотвращает повторный вход.
  • Interrupt enable - глобальное разрешение прерываний (0 - отключить). В других версиях MIPS биты 0-5 регистра Status используются по-иному:
  • бит 1 отображает состояние Kernel(=0)/User(=1) mode (то есть работает ли в данный момент процессор в режиме Kernel mode или в режиме User mode)
  • бит 0 отображает резрешение (=1) прерываний
  • когда происходит обработка исключений, биты 3-2 записываются в биты 5-4, биты 1-0 — в биты 3-2, а в биты 1-0 записывается текущее состояние процессора
  • когда происходит выход из обработчика исключений, восстанавливаются предыдущие значения: 3-2 → 1-0, 5-4 → 3-2

Таким образом, в регистре Status формируется трёхуровневый стек для хранения состояний. Если обработка прерывания в прерывании запрещена, достаточно двух уровней, но есть, например, программные ловушки (trap).

Регистр Cause:

31

30-16

15-8

7

6-2

1-0

Br

unused

Pending interrupts

unused

Exception code

unused

  • Br = 1, если исключение произошло на инструкции в слоте задержки перехода (это деталь конвейера, не обращайте внимания пока:)
  • Pending interrupts - ожидающие прерывания. Прерывания асинхронны и вызываются внешними причинами, так что одновременно их вполне может произойти несколько.

  • Exception code - код исключения.

Многофайловая сборка

базовая часть лекции

Д/З

TODO

LecturesCMC/ArchitectureAssembler2019/07_Exceptions (последним исправлял пользователь FrBrGeorge 2019-05-17 15:23:15)