Выполнение исключения выполняется следующим образом:
- Сохраняет регистры, которые могут использоваться высокоуровневой функцией C в стеке.
Выпускает cld
инструкция для очистки флага направления DF
из eflags
, таким образом гарантируя, что автоматическое увеличение регистров edi
и esi
будет использоваться со строковыми инструкциями.[*]
[*] «Строковая инструкция» на одном языке ассемблера, такая как rep;movsb
, способна воздействовать на весь блок данных (строку).
- Копирует код аппаратной ошибки, сохраненный в стеке, по адресу
esp+36
в edx
.Сохраняет значение -1
в том же месте стека.Как мы увидим в разделе «Повторное выполнение системных вызовов» в главе 11, это значение используется для отделения 0x80
исключений от других исключений. - Загружает
edi
с адресом старшего-уровень do_handler_name( )
Функция C сохранена в стеке в расположении esp+32
;записывает содержимое es
в эту ячейку стека. - Загрузки в
eax
регистрируют текущую верхнюю ячейку стека режима ядра.Этот адрес идентифицирует ячейку памяти, содержащую последнее значение регистра, сохраненное на шаге 1. - Загружает селектор пользовательских данных в регистры
ds
и es
. - Вызывает высокий уровеньФункция C, адрес которой теперь хранится в
edi
.
На этом шаге 6> почему в этом контексте требуется загрузка селектора сегмента данных и какова роль шлюзов в этом контексте?
также для прерываний, код ->
for (i = 0; i < NR_IRQS; i++)
if (i+32 != 128)
set_intr_gate(i+32,interrupt[i]);