Производительность
Прерывания обеспечивают низкие издержки и хорошую задержку при низкой нагрузке, но значительно ухудшаются при высокой частоте прерываний, если не будут приняты меры для предотвращения нескольких патологий. Явление, когда общая производительность системы сильно снижается из-за чрезмерного количества времени обработки, затрачиваемого на обработку прерываний, называется штормом прерываний.
. Существуют различные формы живых блокировок, когда система тратит все свои время обработки прерываний за исключением других необходимых задач. В экстремальных условиях большое количество прерываний (например, очень высокий сетевой трафик) может полностью остановить работу системы. Чтобы избежать таких проблем, операционная система должна планировать обработку сетевых прерываний так же тщательно, как и выполнение процессов.
С многоядерными процессорами дополнительные улучшения производительности при обработке прерываний могут быть достигнуты с помощью масштабирование на стороне приема (RSS), когда используются сетевые карты с несколькими очередями. Такие сетевые адаптеры предоставляют несколько очередей приема , связанных с отдельными прерываниями; За счет маршрутизации каждого из этих прерываний к разным ядрам обработка запросов прерывания, инициированных сетевым трафиком, полученным одной сетевой картой, может быть распределена между несколькими ядрами. Распределение прерываний между ядрами может выполняться автоматически операционной системой, или маршрутизация прерываний (обычно называемая сходством IRQ) может быть настроена вручную.
Чисто программная реализация распределения принимаемого трафика, известное как управление принимаемыми пакетами (RPS), распределяет полученный трафик между ядрами на более поздних этапах пути данных, как часть функциональности обработчика прерываний. Преимущества RPS перед RSS включают отсутствие требований к конкретному оборудованию, более продвинутые фильтры распределения трафика и пониженную частоту прерываний, создаваемых сетевой картой. В качестве недостатка RPS увеличивает частоту межпроцессорных прерываний (IPI). Управление потоком приема (RFS) расширяет программный подход, учитывая местонахождение приложения ; дальнейшее повышение производительности достигается за счет обработки запросов прерывания теми же ядрами, на которых определенные сетевые пакеты будут потребляться целевым приложением.
IRQ: основные понятия и механизм работы
IRQ (Interrupt Request — запрос на прерывание) — это механизм, используемый в компьютерах для обработки прерываний от аппаратных устройств. Когда устройство нуждается в внимании центрального процессора, оно отправляет сигнал IRQ, чтобы прервать текущую операцию и позволить обработать прерывание.
IRQ-сигналы могут быть положительными или отрицательными, в зависимости от типа устройства. Когда сигнал IRQ активен, он заставляет процессор остановить свое текущее действие и передать управление обработчику прерывания, который определен для этого сигнала. Обработчик прерывания выполняет необходимые действия, отвечающие требованиям устройства, и затем возвращает управление процессору для продолжения своей работы.
IRQ-сигналы часто используются для обработки событий, требующих немедленного вмешательства процессора. Например, клавиатура может отправить сигнал IRQ, когда пользователь нажимает клавишу, чтобы операционная система считывала ввод и выполняла соответствующие действия.
Прерывания могут быть разделены на две категории: аппаратные и программные. Аппаратные прерывания возникают в результате физических действий аппаратных устройств, таких как нажатие кнопки или получение данных сетевым интерфейсом. Программные прерывания генерируются программно и могут использоваться для уведомления операционной системы о событиях или ошибках.
Существует предопределенный набор IRQ-сигналов, назначенных определенным устройствам в системе. Например, IRQ 0 обычно используется для системного таймера, IRQ 1 — для клавиатуры и так далее. Каждое устройство должно быть настроено на отдельный сигнал IRQ, чтобы избежать конфликтов и пересечений прерываний.
Операционные системы обычно имеют механизм обработки прерываний, который позволяет им перехватывать и обрабатывать сигналы IRQ от устройств. Они поддерживают таблицу прерываний, в которой каждому IRQ-сигналу назначен соответствующий обработчик прерывания. Когда сигнал IRQ получен, операционная система выбирает соответствующий обработчик и передает ему управление для выполнения необходимых действий.
Использование IRQ-сигналов позволяет эффективно использовать ресурсы компьютера, обрабатывая прерывания только при необходимости. Они позволяют устройствам взаимодействовать с операционной системой и центральным процессором, обеспечивая эффективную и надежную работу компьютера.
Makefile
Наконец, вот makefile для построения программы:
# makefile
all floppy.img boot_sector.lst
floppy.img boot_sector.bin
dd if=»/dev/zero» of=»floppy.img» bs=1024 count=1440
dd if=boot_sector.bin of=floppy.img conv=notrunc
boot_sector.bin boot_sector.asm bios_services.inc descriptor_macros.inc protected_mode.inc pm_utility_functions.inc keyboard.inc
fasm boot_sector.asm boot_sector.bin
boot_sector.lst boot_sector.fas
listing -a boot_sector.fas boot_sector.lst
boot_sector.fas boot_sector.asm bios_services.inc descriptor_macros.inc protected_mode.inc pm_utility_functions.inc keyboard.inc
fasm boot_sector.asm -s boot_sector.fas
Настройка Interrupt ReQuest
Для настройки прерывания нужно знать, какое прерывание используется каждым устройством. Обычно каждому устройству назначается определенный номер прерывания (IRQ), который указывается в его документации или драйвере. Настройка прерывания выполняется через BIOS или операционную систему.
Чтобы изменить настройки прерывания в Windows, можно воспользоваться меню «Устройства» в Панели управления. В этом меню можно просмотреть список устройств, зарегистрированных в системе, и указать номер прерывания для каждого устройства. Если устройства используют одно и то же прерывание, может возникнуть конфликт и необходимо будет поменять номер прерывания для одного из них.
Каждой прерывающей линии в системе компьютера соответствует свой канал прерывания. Прерывания 0-15 связаны с каналами 0-15, которые соответствуют линиям прерывания 0-15. Каналы прерывания обеспечивают автоматическое перенаправление прерывания к процессору.
IRQ-линии на шине ISA, используемой в старых компьютерах, делятся на две группы: IRQ 0-7 относятся к первой группе, а IRQ 8-15 — ко второй группе. Каждая группа имеет свой контроллер прерывания. В более новых компьютерах используется шина PCI, которая имеет более гибкие настройки прерываний.
При настройке прерывания важно знать, насколько прерывание активно. Если прерывание не используется, то можно выбрать неактивный режим, чтобы освободить данный IRQ для использования другим устройством
Также необходимо учитывать свойства устройства: некоторые устройства могут требовать свободного IRQ, а другие могут разделять IRQ с другими устройствами.
Обычно таблица прерываний содержит информацию о прерываниях, используемых различными устройствами. Эту таблицу можно просмотреть с помощью программы BIOS или специальной утилиты, которая отображает активные прерывания на компьютере.
IRQ | Устройства |
---|---|
Системный таймер | |
1 | Клавиатура |
2 | Прерывание каскада |
3 | COM2 и COM4 (серийные порты) |
4 | COM1 и COM3 (серийные порты) |
5 | Линия прерывания LPT2 (параллельный порт 2) |
6 | Дисковод гибких дисков |
7 | Принтерный порт (LPT1) |
8 | RTC (real-time clock) |
9 | ACPI / USB (настройки энергосбережения и порты USB) |
10 | Неиспользуется |
При настройке прерывания нужно быть внимательным, чтобы избежать конфликтов. Если два устройства используют одно и то же прерывание, то это может привести к ошибкам работы системы
Поэтому важно просмотреть таблицу прерываний и убедиться, что прерывания назначены правильно, чтобы избежать таких проблем
Заключение
Настройка прерываний является важной задачей при работе с аппаратными устройствами. Как правило, общие настройки прерываний в большинстве случаев отлично работают и не требуют изменений
Однако, при возникновении проблем, связанных с прерываниями, необходимо обратиться к документации и драйверам устройств, а также просмотреть таблицу прерываний, чтобы найти решение проблемы с помощью настроек прерываний.
Что такое IRQ и как он работает в компьютерах
IRQ (Interrupt Request) – это механизм, используемый в компьютерах для обработки прерываний от внешних устройств. Прерывания позволяют устройствам обратиться к процессору компьютера, чтобы передать ему информацию или запросить обработку определенной задачи.
В компьютерах существует ограниченное количество линий прерывания IRQ, обычно от 16 до 24. Каждая линия прерывания IRQ соответствует определенному устройству, например, сетевой карте, видеокарте или клавиатуре. Когда устройство хочет прервать работу процессора и передать ему информацию, оно активирует свою линию прерывания IRQ.
Процессор компьютера настраивает приоритеты линий прерывания IRQ, чтобы решать, какое устройство прервать в случае одновременных запросов. Когда происходит прерывание, процессор приостанавливает текущую работу и переключается на обработку прерывания. Обработчик прерывания определяет, какая линия прерывания была активирована и какое устройство ее вызвало, и затем выполняет соответствующие операции.
IRQ дает возможность устройствам общаться с процессором компьютера без необходимости постоянного опроса. Это позволяет значительно увеличить производительность системы и снизить нагрузку на процессор. Однако, неправильное использование или конфликты между линиями прерывания IRQ могут привести к сбоям системы или неправильной работе устройств.
Чтобы предотвратить конфликты линий прерывания IRQ в компьютере, операционные системы используют так называемые «распределенные линии», которые позволяют подключать несколько устройств к одной линии прерывания. В таком случае, каждому устройству присваивается уникальный идентификатор, который позволяет операционной системе правильно обрабатывать прерывания от каждого устройства.
Выводы:
- IRQ (Interrupt Request) – механизм обработки прерываний от устройств;
- Компьютер имеет ограниченное количество линий прерывания IRQ;
- Процессор настраивает приоритеты линий прерывания IRQ;
- Прерывание позволяет процессору обрабатывать запросы от устройств без опроса;
- Конфликты линий прерывания IRQ могут привести к сбоям системы или неправильной работе устройств;
- Операционные системы используют «распределенные линии» для предотвращения конфликтов.
Как IRQ используется для связи между устройствами
IRQ (Interrupt Request) — это механизм, который используется в компьютерах для обеспечения связи между центральным процессором и периферийными устройствами. Каждое устройство подключено к своему собственному прерыванию, которое обрабатывается процессором при наступлении определенного события.
IRQ используется для передачи сигнала от устройства к процессору. Когда устройство готово к взаимодействию с процессором (например, запрос на передачу данных), оно отправляет прерывание процессору. Процессор, в свою очередь, останавливает текущую работу и переключается на обработку прерывания. Это позволяет устройству быстро получить ответ от процессора и продолжить дальнейшую работу.
Каждое устройство имеет определенный номер прерывания (IRQ), который позволяет процессору определить, какое устройство запросило обработку. Прерывание с наивысшим приоритетом обрабатывается первым. Прерывания с более низким приоритетом могут быть отложены до более позднего времени.
Для установки соответствия между устройством и номером прерывания, используется специальный контроллер прерываний (Interrupt Controller). Он преобразует запросы от устройств в формат, понятный процессору, и передает их в соответствии с приоритетом.
IRQ является критическим компонентом мультизадачной системы. Благодаря прерываниям процессор может эффективно обрабатывать запросы от различных устройств, не прерывая течение основных задач. Корректная настройка и использование IRQ позволяет повысить производительность системы и уменьшить задержки в отклике устройств.
Важно отметить, что в современных компьютерах IRQ сложно настроить и изменить, так как большинство устройств имеют фиксированные прерывания. Однако, операционные системы предоставляют возможность управления IRQ для определенных устройств и резервирования прерываний для конкретных задач
4.3. Маскирование прерываний
Часто при выполнении критических участков программ, для того чтобы
гарантировать выполнение определенной последовательности команд целиком,
приходится запрещать прерывания. Это можно сделать командой CLI. Ее нужно
поместить в начало критической последовательности команд, а в конце расположить
команду STI, разрешающую процессору воспринимать прерывания. Команда CLI
запрещает только маскируемые прерывания, немаскируемые всегда обрабатываются
процессором.
Если вы используете запрет прерываний с помощью команды CLI, следите за тем,
чтобы прерывания не отключались на длительный период времени, так как это может
привести к нежелательным последствиям. Например, будут отставать часы.
Если вам надо запретить не все прерывания, а только некоторые, например, от
клавиатуры, то для этого надо воспользоваться услугами контроллера прерываний.
Подробно об этом немного ниже, сейчас отметим только, что выдачей в этот
контроллер определенной управляющей информации можно замаскировать прерывания
от отдельных устройств.
Интерфейс /proc
Всякий раз, когда аппаратное прерывание достигает процессора, увеличивается внутренний счётчик, предоставляя возможность проверить, работает ли устройство так, как ожидалось.
Полученные прерывания показываются в /proc/interrupts. Следующий снимок был получен на двухпроцессорной системе Pentium:
root@montalcino:/bike/corbet/write/ldd3/src/short# cat /proc/interrupts
CPU0 CPU1
0: 4848108 34 IO-APIC-edge timer
2: 0 0 XT-PIC cascade
8: 3 1 IO-APIC-edge rtc
10: 4335 1 IO-APIC-level aic7xxx
11: 8903 0 IO-APIC-level uhci_hcd
12: 49 1 IO-APIC-edge i8042
NMI: 0 0
LOC: 4848187 4848186
ERR: 0
MIS: 0
Первая колонка — это число прерываний. Вы можете видеть, что судя по отсутствующим прерываниям, этот файл показывает только прерывания, соответствующие установленным обработчикам. Например, первый последовательный порт (который использует прерывание номер 4) не показан, это свидетельствует, что модем не используется. В самом деле, даже если модем был использован ранее, но не использовался во время снимка, он не будет отображаться в файле; последовательные порты хорошо себя ведут и отключают свои обработчики прерываний при закрытом устройстве.
Распечатка /proc/interrupts показывает, как много прерываний было доставлено каждому процессору в системе. Как можно видеть из вывода, ядро Linux обычно обрабатывает прерывания на первом процессоре, как способ улучшения использования кэша. (* Хотя некоторые крупные системы явно используют схемы балансирования прерываний для распределения нагрузки по обработке прерываний в системе). Последние два столбца предоставляют информацию о том программируемом контроллере прерываний, который обрабатывает прерывание (и о котором автору драйвера беспокоиться нет необходимости) и имя (имена) устройств(а), которые имеют зарегистрированные обработчики прерывания (указанные в аргументе dev_name для request_irq).
Дерево /proc содержит другой относящийся к прерываниям файл, /proc/stat; иногда вы будете находить один файл более полезными, иногда вы предпочтёте другой. /proc/stat ведёт запись некоторой низкоуровневой статистики о системной активности, включая (но не ограничиваясь ими) число прерываний, полученных после загрузки системы. Каждая строка stat начинается с текстовой строки, которая является ключом к строке; метка intr — то, что мы ищем. Следующий (усечённый) снимок был сделан вскоре после предыдущего:
intr 5167833 5154006 2 0 2 4907 0 2 68 4 0 4406 9291 50 0 0
Первое число — это общая сумма всех прерываний, а каждое из остальных представляет одну линию прерывания, начиная с прерывания 0. Все счётчики суммируются по всем процессорам в системе. Это снимок показывает, что прерывание номер 4 было использовано 4907 раз, хотя обработчик и не установлен. Если тестируемый вами драйвер получает и освобождает прерывания в каждом цикле открытия и закрытия, вы можете найти /proc/stat более полезным, чем /proc/interrupts.
Ещё одно различие между этими двумя файлами в том, что interrupts является архитектурно-независимым (за исключением, быть может, нескольких строчек в конце), а stat является; число полей зависит от оборудования, на котором работает ядро. Количество доступных прерываний варьируется от небольшого, как 15 на SPARC, до значительного, как 256 на IA-64 и нескольких других системах. Интересно отметить, что число прерываний, определённых на x86, в настоящее время 224, а не 16, как могло ожидаться; это, как описано в include/asm-i386/irq.h, зависит от использования Linux архитектурного предела, а не предела определённого реализацией (такого, как 16 источников прерываний на старомодном контроллере прерываний ПК).
Следующий снимок /proc/interrupts сделан на системе IA-64. Как вы можете видеть, помимо другой аппаратной маршрутизации обычных источников прерываний, вывод очень похож на показанный ранее из 32-х разрядной системы.
CPU0 CPU1
27: 1705 34141 IO-SAPIC-level qla1280
40: 0 0 SAPIC perfmon
43: 913 6960 IO-SAPIC-level eth0
47: 26722 146 IO-SAPIC-level usb-uhci
64: 3 6 IO-SAPIC-edge ide0
80: 4 2 IO-SAPIC-edge keyboard
89: 0 0 IO-SAPIC-edge PS/2 Mouse
239: 5606341 5606052 SAPIC timer
254: 67575 52815 SAPIC IPI
NMI: 0 0
ERR: 0
Как настроить прерывания irq в BIOS
BIOS (Basic Input/Output System) является программным обеспечением, установленным на материнской плате компьютера, которое обеспечивает его базовые функции. Настройка прерываний irq (Interrupt Request) в BIOS позволяет управлять разделением ресурсов и распределением прерываний между устройствами в системе.
Чтобы настроить прерывания irq в BIOS, вам нужно войти в настройки BIOS. Обычно это делается путем нажатия определенной клавиши при загрузке компьютера (например, Delete или F2) — точная клавиша зависит от производителя материнской платы. После входа в настройки BIOS найдите раздел, отвечающий за управление прерываниями.
В разделе управления прерываниями irq вы можете просмотреть текущую конфигурацию прерываний и внести необходимые изменения. Возможности настройки могут варьироваться в зависимости от производителя материнской платы и версии BIOS.
Для настройки прерываний irq в BIOS обычно предоставляется следующие опции:
- Разрешение/запрет прерывания для конкретного устройства.
- Изменение приоритета прерывания для устройств.
- Изменение режима работы IRQ (например, векторного или линейного).
- Настройка автоматического распределения прерываний.
При настройке прерываний irq в BIOS важно следовать инструкциям производителя и быть внимательным, чтобы не изменить неправильно настройки, которые могут привести к неполадкам в работе компьютера. После внесения необходимых изменений в настройки прерываний irq, сохраните изменения и перезагрузите компьютер, чтобы они вступили в силу
Настройка прерываний irq в BIOS может быть полезной при решении проблем совместного использования ресурсов между устройствами или оптимизации производительности системы. Однако, если у вас нет необходимости изменять настройки прерываний, рекомендуется оставить их в значениях по умолчанию.
Программное обеспечение для контроля IRQ присваивания
Для более эффективного контроля и настройки присваивания прерываний (IRQ) на материнской плате можно использовать специальное программное обеспечение.
Такие программы обладают рядом полезных функций. Во-первых, они позволяют определить, какое устройство или аппаратное обеспечение занимает конкретное IRQ. Такой мониторинг особенно важен при возможных конфликтах между разными устройствами, вызванными присваиванием одной и той же прерыва.
Во-вторых, программное обеспечение для контроля IRQ присваивания предоставляет возможность изменить прерывание, занимаемое устройством. Если, например, вы обнаружили конфликт между двумя устройствами, вы можете переназначить одно из них на другой IRQ. Это позволит избежать возникновения проблем совместной работы и обеспечит стабильную работу всех подключенных устройств.
Кроме того, некоторые программы для контроля IRQ присваивания предоставляют возможность настройки автоматического присваивания прерываний. Это может быть полезно в случаях, когда у вас есть несколько свободных IRQ, а вы хотите, чтобы система сама выбрала наиболее оптимальные прерывания для каждого нового устройства.
Необходимо отметить, что специализированное программное обеспечение для контроля IRQ присваивания обычно предназначено для работы на операционных системах, таких как Windows или Linux. Другими словами, вы можете найти поддерживаемые программы, специфичные для вашей ОС, и использовать их для более эффективного управления прерываниями на вашей материнской плате.
Для определения и настройки IRQ можно воспользоваться различными инструментами, такими как BIOS, утилиты операционной системы или специальные программы
Важно следить за обновленностью драйверов устройств, так как они также могут влиять на IRQ присваивание
Если возникают проблемы с IRQ присваиванием, могут помочь следующие шаги:
- Перераспределить IRQ с помощью BIOS или операционной системы;
- Отключить ненужные устройства или заменить их на другие, с меньшим потреблением IRQ;
- Установить последние версии драйверов устройств;
- Обновить BIOS материнской платы;
Следуя этим рекомендациям, можно достичь оптимальной настройки IRQ присваивания и обеспечить стабильную и эффективную работу компьютера.
Распределение номеров IRQ средствами Windows
Второй раз номера прерываний распределяются операционной системой. Как показали
проведенные мной эксперименты, Windows’98 начинает вмешиваться в произведенные
BIOS’ом действия только в крайних случаях. При наличии нормального BIOS описанные
здесь приемы не понадобятся.
Следует заметить, что для правильной работы механизмов совместного использования
IRQ и динамического распределения необходимо, чтобы Windows распознала чипсет
материнской платы и загрузила IRQ Miniport. Чем более свежая версия у Windows,
тем больше чипсетов поддерживает ее собственный минипорт (PCIIMP.PCI). Однако
всегда лучше перестраховаться и установить самые свежие драйверы чипсета.
В Windows 98 управление системой распределения IRQ осуществляется с помощью
стандартного менеджера устройств. В списке системных устройств нужно найти шину
PCI. В ее свойствах есть особая закладка (см. скриншот).
Если все настроено правильно, там будет упомянут минипорт («успешно загружен»),
а управление шиной PCI (Steering) будет включено. Таким образом, Windows’98 имеет
средства для управления распределением номеров прерываний между физическими линиями.
Но поскольку и BIOS чаще всего с этим хорошо справляется, этот механизм не задействуется.
Но иногда он просто необходим. Как я уже говорил, PCI-устройства не должны
конфликтовать в случае, если они используют одно и то же логическое прерывание.
Другое дело — ISA-устройства, к которым относятся также и COM- и LPT-порты. Если
устройство не-Plug&Play, BIOS может его и не заметить, отдав занятое им прерывание
PCI-устройству. Тогда нужно прерывание зарезервировать. Это делается в диспетчере
устройств Windows’98: выбираем устройство «Компьютер», вызываем его свойства,
переключаемся на вторую закладку. Дальше все понятно.
Кроме резервирования, можно непосредственно задать номер прерывания для устройства.
Для этого нужно в его свойствах найти закладку «Ресурсы», отключить автоматическую
настройку и попытаться изменить назначенный номер прерывания. К сожалению, это
работает далеко не всегда.
Windows 2000 — система особая. Если у вас современный компьютер, то он наверняка
поддерживает интерфейс конфигурирования ACPI. Windows 2000 в таком случае вообще
проигнорирует действия BIOS и «повесит» все PCI-устройства на одно логическое
прерывание. В общем случае это будет отлично работать (когда нет ISA), но иногда
случаются проблемы. Чтобы получить возможность изменять номера прерываний, нужно
либо поменять HAL-ядро, либо переустановить Windows 2000 с отключенным в BIOS
ACPI. Замена ядра производится так: в диспетчере устройств выбирайте «Компьютер»/»Компьютер
с ACPI», меняйте драйвер на «Стандартный компьютер», перезагружайтесь. Если это
не поможет, придется переустановить Windows 2000 заново.
Надеюсь, приведенная выше информация поможет вам в борьбе с глюками «железа».
И помните: большинство возникающих проблем связано с низким уровнем компьютерной
грамотности хозяина компьютера. Поэтому нужно всегда стремиться к самообразованию,
тогда и проблем будет поменьше, а те, что все-таки возникнут — не будут казаться
неразрешимыми.
Для чего нужны IRQ
Что же такое IRQ и для чего оно нужно?
Аббревиатура IRQ расшифровывается как Interrupt ReQuest (запрос на прерывание). Для того, чтобы понять, для чего оно нужно, следует вспомнить подробности организации работы персонального компьютера.
Кровеносной системой компьютера, по которой обмениваются информацией процессор и прочие устройства, является системная шина. Но как вообще процессор способен отличить запросы на обработку информации, поступающие по шине от различных устройств?
Для этого и существует система аппаратных прерываний (IRQ). Каждое прерывание имеет определенный номер (нумерация начинается с 0) и закреплено за определенным устройством. Так, за клавиатурой закреплено прерывание под номером 1, отсюда и обозначение IRQ 01.
При поступлении запроса от устройства компьютер прерывает (отсюда и появился сам термин «прерывание») обработку текущей информации и начинает обработку вновь поступившего. Если прерываний несколько, то они обрабатывается в порядке приоритетов, закрепленных за каждым из них. Как правило, чем меньше номер прерывания, тем больший приоритет для процессора имеет устройство, закрепленное за этим прерыванием, но это правило соблюдается далеко не всегда.
Обслуживает обработку IRQ специальный чип, который носит название контроллера прерываний. Как правило, эта микросхема является частью центрального процессора, а иногда выделяется в отдельный чип на материнской плате. Для обработки каждого прерывания в BIOS существует специальная микропрограмма, называемая обработчиком прерывания. Адреса всех обработчиков хранятся в так называемой таблице векторов прерываний.
Раньше, в первых компьютерах семейства XT была распространена 8-разрядная шина ISA, поэтому всего устройствам было доступно 8 прерываний. С появлением 16-разрядной шины ISA их количество увеличилось до 16.
Обработка прерываний в архитектуре x86
В этом разделе нашей статьи будет рассмотрено, как процессор обрабатывает прерывания в архитектуре x86.
Таблица дескрипторов прерываний
Таблица дескрипторов прерываний (IDT) связывает каждый идентификатор прерывания или исключения с дескриптором инструкций, которые обслуживают соответствующее событие. Мы назовем идентификатор номером вектора, а соответствующие инструкции — обработчиком прерываний/исключений.
IDT имеет следующие характеристики:
- он используется ЦП в качестве таблицы переходов при запуске данного вектора
- это массив записей размером 256 x 8 байт.
- может находиться где угодно в физической памяти
- процессор находит IDT с помощью IDTR
Ниже мы можем найти векторную схему Linux IRQ. Первые 32 записи зарезервированы для исключений, вектор 128 используется для интерфейса системных вызовов, а остальные в основном используются для обработчиков аппаратных прерываний.
В x86 запись IDT имеет 8 байт и называется воротами. Ворота могут быть 3-х типов:
- Ворота прерывания содержат адрес обработчика прерывания или исключения. Переход к обработчику отключает маскируемые прерывания (флаг IF сбрасывается).
- Шлюзы-ловушки, похожие на шлюзы прерываний, но они не отключают маскируемые прерывания при переходе к обработчику прерываний/исключений.
- Шлюзы задач (не используются в Linux).
Давайте посмотрим на несколько полей записи IDT:
- селектор сегмента, индексируйте GDT/LDT, чтобы найти начало сегмента кода, в котором находятся обработчики прерываний
- смещение, смещение внутри сегмента кода
- T представляет тип ворот
DPL, минимальные права, необходимые для использования содержимого сегментов.
Адрес обработчика прерываний
Чтобы найти адрес обработчика прерывания, нам сначала нужно найти начальный адрес сегмента кода, в котором находится обработчик прерывания. Для этого мы используем селектор сегмента для индексации в GDT/LDT, где мы можем найти соответствующий дескриптор сегмента. Это обеспечит начальный адрес, хранящийся в поле «база». Используя базовый адрес и смещение, мы теперь можем перейти к началу обработчика прерывания.
Стек обработчика прерываний
Подобно передаче управления обычной функции, передача управления обработчику прерывания или исключения использует стек для хранения информации, необходимой для возврата к прерванному коду.
Как видно на рисунке ниже, прерывание помещает в регистр EFLAGS перед сохранением адреса прерванной инструкции. Определенные типы исключений также вызывают помещение кода ошибки в стек, чтобы помочь отладить исключение.
Обработка запроса на прерывание
После генерации запроса на прерывание процессор запускает последовательность событий, которые в конечном итоге заканчиваются запуском обработчика прерываний ядра:
- ЦП проверяет текущий уровень привилегий
- если нужно изменить уровень привилегий
- изменить стек на тот, который связан с новой привилегией
- сохранить информацию старого стека в новом стеке
- сохранить EFLAGS, CS, EIP в стеке
- сохранить код ошибки в стеке на случай прерывания
- выполнить обработчик прерываний ядра
Возврат из обработчика прерывания
Большинство архитектур предлагают специальные инструкции для очистки стека и возобновления выполнения после выполнения обработчика прерывания. В x86 IRET используется для возврата из обработчика прерывания. IRET аналогичен RET, за исключением того, что IRET увеличивает ESP на дополнительные четыре байта (из-за флагов в стеке) и перемещает сохраненные флаги в регистр EFLAGS.
Для возобновления выполнения после прерывания используется следующая последовательность (x86):
- выведать код ошибки (в случае прерывания)
- вызов в IRET
- извлекает значения из стека и восстанавливает следующий регистр: CS, EIP, EFLAGS
- если уровень привилегий изменен, возвращается к старому стеку и старому уровню привилегий