6407
Комментарий:
|
13587
|
Удаления помечены так. | Добавления помечены так. |
Строка 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 |
Адрес инструкции, которая вызвала исключение (или во время выполнения которой произошло прерывание) |
Инструкции для работы с регистрами управляющего сопроцессора:
- mfc0 Rdest, C0src — загрузить содержимое управляющего регистра C0src в регистр общего назначения Rdest
- mtc0 Rsrc, C0dest — загрузить содержимое регистра общего назначения C0src в управляющий регистр Rdest
- eret — вернуться из обработчика исключительной ситуации Когда происходит исключение, сопроцессор совершает следующие действия:
- Устанавливает бит 1 управляющего регистра $12 (EXception Level, EXL).
- Устанавливает биты 2-6 управляющего регистра $13(причина) согласно типу исключения
- Устанавливает управляющий регистр $14 (EPC). В регистре сохраняется адрес инструкции, вызвавшей исключение.
Если исключение было вызвано обращением к неправильному адресу памяти, управляющий регистр $8 (BadVaddr) устанавливается на этот неверный адрес.
Поток выполнения переключается с текущей инструкции MIPS на адрес 0x8000180. Этот адрес в сегменте текста ядра (.kext) является стандартным для расположением обработчика исключений MIPS32.
Обработчик исключений может вернуть управление программе, используя команду 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