Я прочитал (и изучил) информацию об обработке прерываний.
Что я всегда не понимаю, откуда мы знаем, куда вернуться (PC/IP) из обработчика прерываний.
Как я понимаю:Где вернуться с прерывания
- на прерывание вызвано устройством (скажем, клавиатуру)
- Соответствующий обработчик вызывается - при запущенном процессе. То есть, никакой контекст не переключается на ОС.
- Обработчик прерываний завершает работу и передает управление обратно в запущенное приложение.
Процесс, изображенный выше, который является моим пониманием обработки прерываний, имеет место в контексте текущего текущего процесса. Таким образом, это похоже на вызов метода, а не на контекстный переключатель.
Однако, поскольку мы фактически не делали CALL для обработчика прерываний, у нас не было возможности вставить текущий IP-адрес в стек.
Итак, как мы узнаем, куда отскакивать от прерывания. Я смущен.
Порадовал бы любые объяснения, в том числе однострочные, которые просто указывают на хороший pdf/ppt, рассматривающий этот вопрос конкретно.
[Я обычно ссылаюсь на описанный выше процесс под Linux и кодом C, но приветствуются все хорошие ответы)
Немного педантичный, но точка (2) выше не совсем так сказать. При прерывании ядро определенно переключает «на ОС» в код ядра ring 0. Ядро может обслуживать прерывание без изменения указателя таблицы страниц CR3, поэтому в этом смысле нет контекстного переключателя. По этой причине пользователь обрабатывает все карты глобальных таблиц страниц ядра. – srking
@srking: я буду педантичным заново - ясно, что обработчик зарегистрирован в ОС. Также в любом нормальном сценарии сам обработчик будет находиться в адресном пространстве ядра. Тем не менее, текущий процесс будет продолжаться - так что yup, без контекстного переключателя. Более того, любые отработанные циклы ЦП будут учитываться при учете этого процесса. – Trevor