Прерывание irq. Компьютерная помощь

Хорошо, когда после сборки или плановой модернизации компьютер с первого раза запускается и работает устойчиво и без глюков. Гораздо хуже, если возникают неожиданные проблемы - спонтанные перезагрузки и зависания, сбои программ, неработоспособность или "невидимость" устройств и т.п. Первая причина, которая обычно приходит в голову в таком случае, - конфликт прерываний. А хорошо ли мы знаем природу этого явления, достаточно ли подготовлены к борьбе с ним?

Что такое IRQ


Прерывания - это базовый механизм реакции системы на возникающие события. Аппаратные прерывания, называемые обычно IRQ (Interrupt ReQuest) - это физические сигналы, с помощью которых контроллер устройства информирует процессор о необходимости обработать некоторый запрос. Условно схема обработки прерывания выглядит следующим образом:
1) процессор получает сигнал прерывания и его номер;
2) по специальной таблице отыскивается адрес программы, ответственной за обработку прерывания с данным номером - обработчика прерывания;
3) процессор приостанавливает текущую работу и переключается на выполнение обработчика (в общем случае это некоторый драйвер);
4) драйвер получает доступ к устройству и проверяет причину возникновения прерывания;
5) запускаются запрошенные действия - инициализация, конфигурирование устройства, обмен данными и др.
6) драйвер завершает работу, и процессор возвращается к прерванной задаче.
Очевидно, что для корректной работы механизма прерываний необходимо выполнение двух условий: во-первых, сигнал запроса должен доходить до процессора и, во-вторых, драйвер-обработчик должен правильно реагировать на этот сигнал. В случае конфликта не соблюдается второе условие: сигнал прерывания приходит, но реакция на него оказывается неправильной, в результате чего мы имеем (в лучшем случае) неработоспособное устройство.

Конфликт

Можно сказать, что конфликт - это ситуация, при которой несколько объектов одновременно пытаются получить доступ к ресурсу, который предназначен только для одного из них. Конфликт прерываний возникает в том случае, если несколько устройств используют одну и ту же линию прерывания для посылки сигнала запроса и нет механизма, позволяющего обрабатывать конкурирующие запросы. Если драйвер, получая управление, работает не с тем устройством, которое послало запрос, то либо происходит сбой, либо одно из устройств попросту не работает.
Возникает вопрос: могут ли несколько устройств использовать одну и ту же линию прерывания, или это в принципе невозможно? Ведь если драйвер сможет определить, от кого именно пришел запрос, то он будет реагировать на сигналы только "своего" устройства, игнорируя все остальные. Но это должно быть каким-либо образом заранее оговорено, иначе конфликт неизбежен.
Локальная шина PCI была спроектирована с учетом совместного использования прерываний. Каждое устройство PCI должно корректно работать на одной линии прерывания с другими PCI-устройствами. Это сделано следующим образом: факт наличия сигнала на линии прерывания определяется не по фронту, т.е. изменению уровня напряжения, а по самому факту наличия определенного напряжения. Изменять напряжение в линии может сразу несколько устройств, становясь как бы в очередь на обслуживание.
Таким образом, совместное использование одного IRQ несколькими PCI-устройствами не является конфликтом по определению. Однако иногда проблемы все-таки возникают. Во-первых, не все устройства PCI корректно работают на одной линии прерывания с другими. Во-вторых, иногда драйверы имеют ошибки, из-за которых они не могут правильно определять источник сигнала, мешая другим драйверам. В-третьих, далеко не все устройства работают на шине PCI; например, ISA-устройства, к которым относятся, например, контроллеры COM/LPT-портов, делить прерывания с другими не умеют. Чтобы четко представлять себе, как можно избежать конфликтов или устранить их, нужно разобраться в механизме управления IRQ.

Организация аппаратных прерываний в персональном компьютере


Как вы знаете, персональные компьютеры начались с IBM PC. Его архитектура предусматривала восемь линий аппаратных прерываний (IRQ), которыми управлял специальный контроллер. Каждой из них назначался номер, который определял приоритет прерывания и адрес его обработчика (так называемый вектор прерывания). Новая архитектура, IBM PC AT, предусматривала еще восемь линий прерываний, для которых использовался второй контроллер, подключаемый к одной из линий прерывания первого контроллера. К сожалению, данная архитектура стала последней после того, как фирма IBM потеряла возможность управлять развитием созданной ею платформы, поэтому все современные компьютеры по-прежнему имеют только шестнадцать прерываний, одно из которых используется вторым контроллером.
У компьютера IBM PC AT была только одна шина, по которой устройства могли общаться с процессором и памятью - ISA. Большинство линий прерываний были закреплены за стандартными ISA-устройствами, оставшиеся были зарезервированы на будущее. Когда это будущее наступило, выяснилось, что новой универсальной шине PCI досталось всего четыре свободных прерывания. Поэтому и был придуман хитрый механизм совместного использования прерываний (IRQ Sharing) и динамического переопределения номеров (IRQ Steering или Mapping).
Суть механизма управления прерываниями PCI-устройств в следующем. В общем случае существует четыре физических линии PCI-прерываний, называемых PIRQ0, PIRQ1, PIRQ2 и PIRQ3. Они подключены к контроллеру прерываний. Каждое PCI-устройство со своей стороны как бы имеет четыре разъема, называемые INT A, INT B, INT C и INT D. Подключать линии к разъемам можно в любом порядке. Например, для первого PCI-слота можно сделать такую разводку: PIRQ0 - INT A, PIRQ1 - INT B, PIRQ2 - INT C, PIRQ3 - INT D. А для второго - по-другому: PIRQ0 - INT B, PIRQ1 - INT C, PIRQ2 - INT D, PIRQ3 - INT A. Обычно устройство требует только одну линию прерывания, подключенную к INT A. Будучи установленным в первый слот, устройство использует линию PIRQ0, а во втором слоте на том же контакте будет линия PIRQ1. Тем самым устройства в разных слотах будут использовать разные физические линии прерываний. Аппаратный конфликт между ними будет исключен.
Шина AGP, являясь по сути специализированной модификацией PCI, тоже использует одну из линий PIRQ - обычно PIRQ0.
Для современных систем четырех линий оказывается недостаточно, поэтому в новых чипсетах часто применяются восемь линий PIRQ, которые точно так же в разных комбинациях подключаются к слотам PCI и встроенным в плату устройствам.
Линии PIRQ подключаются к контроллеру прерываний. Им, как и другим линиям, назначаются логические IRQ-номера. Если на одной физической линии находятся несколько устройств (а это допустимо), то все они будут иметь один и тот же номер IRQ. Если устройства находятся на разных физических линиях, они все равно могут получить одинаковые номера IRQ. Нормальные драйверы позволят им свободно работать без потери производительности, так как шина PCI все равно может захватываться только одним устройством. Главное - распознать, от какого устройства пришел сигнал.
Номера линиям PIRQ назначаются автоматически благодаря пресловутому механизму Plug&Play. Но ведь есть и ISA-устройства, поддерживающие Plug&Play. Они тоже имеют возможность автоматически получить номер IRQ. Но их линия прерывания принадлежит им монопольно, и если такой же номер получит одна из линий PIRQ, возникнет неразрешимый конфликт.
Итак, мы выяснили, что устройства PCI должны быть лишены проблем с конфликтами IRQ. Если они, конечно, правильно работают, а так бывает не всегда. К тому же драйверы должны поддерживать механизм совместного использования прерываний. Устройства ISA не умеют делиться линиями прерываний и потому являются провокаторами конфликтов. Следовательно, задача устранения конфликтов сводится к правильному распределению номеров (источник проблем - ISA-устройства и "кривые" драйверы) или к разведению по разным физическим линиям ("кривые" PCI-контроллеры).
Давайте рассмотрим, каким образом в системе происходит распределение номеров и как мы можем повлиять на этот процесс.

Карта прерываний

Как я уже говорил, большинство номеров IRQ уже заняты стандартными устройствами, точнее, назначены их линиям прерываний. Пройдемся по порядку:
0 - системный таймер (номер всегда занят);
1 - клавиатура (номер всегда занят);
2 - второй контроллер прерываний (всегда занят);
3 - порт COM2 (может быть отключен, а номер - освобожден);
4 - порт COM1 (может быть отключен, а номер - освобожден);
5 - порт LPT2 (обычно номер свободен);
6 - контроллер гибких дисков (может быть отключен, а номер - освобожден);
7 - порт LPT1 (если не в режиме EPP или ECP, то номер свободен);
8 - часы реального времени (всегда занят);
9 - свободен;
10 - свободен;
11 - свободен;
12 - мышь PS/2 (может быть свободен, если нет такой мыши);
13 - сопроцессор (всегда занят);
14 и 15 - контроллер жестких дисков (может быть отключен, а номер - освобожден).
В типичной системе свободны номера 5, 7, 9-11, то есть пять из пятнадцати. Кроме того, можно смело отключить COM2 и LPT1-порты, увеличив число свободных номеров до семи. Свободны - не значит, что не заняты, просто между ними возможна свободная перетасовка.
В любой системе имеется три стандартных PCI-устройства - ACPI-, USB-контроллеры и видеокарта, каждое из которых займет по одному номеру. Сложное устройство (например, звуковая карта) может потребовать несколько линий - INT A, INT B и т.д. для своих компонентов, которые между собой не будут конфликтовать (как-никак разные физические линии), а вот с другими устройствами - запросто.
Узнать, как в данный момент распределены номера прерываний, можно несколькими способами. В самом начале загрузки компьютера появляется текстовая таблица конфигурации. Сразу после нее идет перечень PCI-устройств с указанием назначенного им номера IRQ (см. скриншот). Другой способ работает в Windows 9x. В панели управления есть иконка "Система", в вызываемом апплете - закладка "Устройства". Выбираем свойства устройства "Компьютер", и там будут перечислены все устройства с указанием их IRQ (см. скриншот).
В Windows 2000 у нас нет доступа к управлению прерываниями, поэтому для просмотра списка IRQ нужно воспользоваться стандартной информационной утилитой (Панель управления/Администрирование/Управление компьютером/Сведения о системе/Ресурсы аппаратуры).

Распределение номеров IRQ средствами BIOS

В системе номера IRQ распределяются между физическими линиями дважды. Первый раз это делает системный BIOS при начальной загрузке системы. Каждому Plug&Play-устройству (все PCI, современные ISA, интегрированные устройства), а точнее, его линии прерывания, назначается один номер из десяти возможных. Если номеров не хватает, несколько линий получают один общий. Если это линии PIRQ, то ничего страшного - при наличии нормальных драйверов и поддержки со стороны операционной системы (об этом см. ниже) все будет работать. А если один номер получают несколько ISA-устройств или PCI- и ISA-устройства, то конфликт просто неизбежен, и тогда нужно вмешиваться в процесс распределения.
Прежде всего, нужно отключить все неиспользуемые ISA-устройства (в системах без слотов ISA они тоже присутствуют) - порты COM1, COM2 и дисковод. Также можно отключить режимы EPP и ECP порта LPT, тогда прерывание IRQ7 станет доступно.
В BIOS Setup нам понадобится раздел "PCI/PNP Configuration". Есть два базовых способа повлиять на распределения номеров IRQ: заблокировать конкретный номер и напрямую назначить номер линии PIRQ.
Первый способ доступен для всех BIOS: найдите список пунктов "IRQ x used by:" (в новых BIOS скрывается в подменю "IRQ Resources"). Тем прерываниям, которые должны быть назначены исключительно ISA-устройствам, нужно поставить "Legacy ISA". Тем самым при раздаче номеров PCI-устройствам данные прерывания будут пропущены. Поступать так следует в том случае, если какое-либо ISA-устройство упорно становится на одно прерывание с PCI-устройством, из-за чего оба не работают. Тогда мы находим номер этого IRQ и блокируем его в BIOS Setup. PCI-устройство переходит на новый номер IRQ, а ISA-устройство остается. Конфликт разрешен.
Второй, более удобный способ управления номерами IRQ - прямое назначение. В том же подменю BIOS Setup могут быть пункты вида "Slot X use IRQ" (другие названия: "PIRQx use IRQ", "PCI Slot x priority", "INT Pin x IRQ").
С их помощью каждой из четырех линии PIRQ можно назначить конкретный номер. Кстати, в новых AwardBIOS 6.00 можно наблюдать, какие именно устройства (включая встроенные) используют ту или иную линию. Просто посмотрите на правую часть экрана BIOS Setup: на фото показано, как я навел курсор на пункт "Slot 1/5 use IRQ no.", а справа появилась надпись "Display Contr.". То есть первая линия PIRQ используется видеокартой. Если я сейчас поставлю какой-либо определенный номер вместо "Auto", видеокарта будет переведена на это прерывание.

Распределение номеров 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 заново.
Надеюсь, приведенная выше информация поможет вам в борьбе с глюками "железа". И помните: большинство возникающих проблем связано с низким уровнем компьютерной грамотности хозяина компьютера. Поэтому нужно всегда стремиться к самообразованию, тогда и проблем будет поменьше, а те, что все-таки возникнут - не будут казаться неразрешимыми.

Для обработки событий, происходящих асинхронно по отношению к выполнению программы, лучше всего подходит механизм прерываний .

Прерывание можно рассматривать как некоторое особое событие в системе, требующее моментальной реакции. Например, хорошо спроектированные системы повышенной надежности используют прерывание по аварии в питающей сети для выполнения процедур записи содержимого регистров и оперативной памяти на магнитный носитель, с тем чтобы после восстановления питания можно было продолжить работу с того же места.

Кажется очевидным, что возможны самые разнообразные прерывания по самым различным причинам. Поэтому прерывание рассматривается не просто как таковое, с ним связывают число, называемое номером типа прерывания или просто номером прерывания. С каждым номером прерывания связывается то или иное событие. Система умеет распознавать, какое прерывание, с каким номером произошло и запускает соответствующую этому номеру процедуру.

Программы могут сами вызывать прерывания с заданным номером. Для этого они используют команду INT. Это так называемые программные прерывания. Программные прерывания не являются асинхронными, так как вызываются из программы (а она-то знает, когда она вызывает прерывание!).

Программные прерывания удобно использовать для организации доступа к отдельным, общим для всех программ модулям. Например, программные модули операционной системы доступны прикладным программам именно через прерывания, и нет необходимости при вызове этих модулей знать их текущий адрес в памяти. Прикладные программы могут сами устанавливать свои обработчики прерываний для их последующего использования другими программами. Для этого встраиваемые обработчики прерываний должны быть резидентными в памяти.

Аппаратные прерывания вызываются физическими устройствами и приходят асинхронно. Эти прерывания информируют систему о событиях, связанных с работой устройств, например о том, что наконец-то завершилась печать символа на принтере и неплохо было бы выдать следующий символ, или о том, что требуемый сектор диска уже прочитан его содержимое доступно программе. Использование прерываний при работе с медленными внешними устройствами позволяют совместить ввод/вывод с обработкой данных в центральном процессоре и в результате повышает общую производительность системы. Некоторые прерывания (первые пять в порядке номеров) зарезервированы для использования самим центральным процессором на случай каких-либо особых событий вроде попытки деления на ноль, переполнения и т.п.

Иногда желательно сделать систему нечувствительной ко всем или отдельным прерываниям. Для этого используют так называемое маскирование прерываний . Но некоторые прерывания замаскировать нельзя, это немаскируемые прерывания.

Заметим еще, что обработчики прерываний могут сами вызывать программные прерывания, например, для получения доступа к сервису BIOS или DOS (сервис BIOS также доступен через механизм программных прерываний).

Составление собственных программ обработки прерываний и замена стандартных обработчиков DOS и BIOS является ответственной и сложной работой. Необходимо учитывать все тонкости работы аппаратуры и взаимодействия программного и аппаратного обеспечения. При отладке возможно разрушение операционной системы с непредсказуемыми последствиями, поэтому надо очень внимательно следить за тем, что делает Ваша программа.

Для того чтобы связать адрес обработчика прерывания с номером прерывания, используется таблица векторов прерываний , занимающая первый килобайт оперативной памяти - адреса от 0000:0000 до 0000:03FF. Таблица состоит из 256 элементов - FAR-адресов обработчиков прерываний. Эти элементы называются векторами прерываний . В первом слове элемента таблицы записано смещение, а во втором - адрес сегмента обработчика прерывания.

Прерыванию с номером 0 соответствует адрес 0000:0000, прерыванию с номером 1 - 0000:0004 и т.д.

Инициализация таблицы происходит частично BIOS после тестирования аппаратуры и перед началом загрузки операционной системой, частично при загрузке DOS. DOS может переключить на себя некоторые прерывания BIOS.

Рассмотрим содержимое таблицы векторов прерываний. Приведем назначение некоторых наиболее важных векторов:

Описание

Ошибка деления. Вызывается автоматически после выполнения команд DIV или IDIV, если в результате деления происходит переполнение (например, при делении на 0). DOS обычно при обработке этого прерывания выводит сообщение об ошибке и останавливает выполнение программы. Для процессора 8086 при этом адрес возврата указывает на следующую после команды деления команду, а в процессоре 80286 - на первый байт команды, вызвавшей прерывание.

Прерывание пошагового режима. Вырабатывается после выполнения каждой машинной команды, если в слове флагов установлен бит пошаговой трассировки TF. Используется для отладки программ. Это прерывание не вырабатывается после выполнения команды MOV в сегментные регистры или после загрузки сегментных регистров командой POP.

Аппаратное немаскируемое прерывание. Это прерывание может использоваться по-разному в разных машинах. Обычно вырабатывается при ошибке четности в оперативной памяти и при запросе прерывания от сопроцессора.

Прерывание для трассировки. Это прерывание генерируется при выполнении однобайтовой машинной команды с кодом CCh и обычно используется отладчиками для установки точки прерывания.

Переполнение. Генерируется машинной командой INTO, если установлен флаг OF. Если флаг не установлен, то команда INTO выполняется как NOP. Это прерывание используется для обработки ошибок при выполнении арифметических операций.

Печать копии экрана. Генерируется при нажатии на клавиатуре клавиши PrtScr. Обычно используется для печати образа экрана. Для процессора 80286 генерируется при выполнении машинной команды BOUND, если проверяемое значение вышло за пределы заданного диапазона.

Неопределенный код операции или длина команды больше 10 байт (для процессора 80286).

Особый случай отсутствия математического сопроцессора (процессор 80286).

IRQ0 - прерывание интервального таймера, возникает 18,2 раза в секунду.

IRQ1 - прерывание от клавиатуры. Генерируется при нажатии и при отжатии клавиши. Используется для чтения данных от клавиатуры.

IRQ2 - используется для каскадирования аппаратных прерываний в машинах класса AT.

IRQ3 - прерывание асинхронного порта COM2.

IRQ4 - прерывание асинхронного порта COM1.

IRQ5 - прерывание от контроллера жесткого диска для XT.

IRQ6 - прерывание генерируется контроллером флоппи-диска после завершения операции.

IRQ7 - прерывание принтера. Генерируется принтером, когда он готов к выполнению очередной операции. Многие адаптеры принтера не используют это прерывание.

Обслуживание видеоадаптера.

Определение конфигурации устройств в системе.

Определение размера оперативной памяти в системе.

Обслуживание дисковой системы.

Последовательный ввод/вывод.

Расширенный сервис для AT-компьютеров.

Обслуживание клавиатуры.

Обслуживание принтера.

Запуск BASIC в ПЗУ, если он есть.

Обслуживание часов.

Обработчик прерывания Ctrl-Break.

Прерывание возникает 18.2 раза в секунду, вызывается программно обработчиком прерывания таймера.

Адрес видеотаблицы для контроллера видеоадаптера 6845.

Указатель на таблицу параметров дискеты.

Указатель на графическую таблицу для символов с кодами ASCII 128-255.

Используется DOS или зарезервировано для DOS.

Прерывания, зарезервированные для пользователя.

Не используются.

IRQ8 - прерывание от часов реального времени.

IRQ9 - прерывание от контроллера EGA.

IRQ10 - зарезервировано.

IRQ11 - зарезервировано.

IRQ12 - зарезервировано.

IRQ13 - прерывание от математического сопроцессора.

IRQ14 - прерывание от контроллера жесткого диска.

IRQ15 - зарезервировано.

Не используются.

Зарезервированы для BASIC.

Используются интерпретатором BASIC.

Начнем с понятия «прерывание».
Прерывание - это событие, которое говорит системе, что что-то произошло, и требует вмешательства.
Такими событиями могут быть: нажатая клавиша на клавиатуре, сигнал от модема, всевозможные ошибки (вроде деления на нуль) и тому подобное.

Как вы наверняка уже слышали, существуют аппаратные и программные прерывания.
Аппаратные (IRQ - Interrupt ReQuest) - те, которые инициируются железом, а программные - софтом, причем механизмы вызова аппаратного или программного прерывания немного различаются, хотя для процессора это в принципе одно и то же.

С программными прерываниями (INT - Interrupt) просто - программа вызывает запрос на прерывание (на языке ассемблера это INT xx, где xx - номер прерывания), после чего процессор сохраняет адрес возврата в программу и флаги состояния процессора, и переходит к обработчику прерывания.
Найти адрес программы-обработчика процессору очень просто (даже думать не приходится) - первый килобайт оперативной памяти содержит адреса этих программ.

Адрес обработчика нулевого прерывания (прерывания нумеруются с нуля) расположен в самом начале, сразу за ним - адрес обработчика первого прерывания, и так далее до 255-го прерывания.
Выход из обработчика прерывания производится программой-обработчиком, причем управление передается команде, следующей за процедурой вызова прерывания.

Аппаратные прерывания организуются немного сложнее - у каждой шины (PCI, ISA и т. д.) существуют определенные линии (читай - контакты), которые отвечают за прерывания, вызываемые устройствами.
Номера аппаратных прерываний не прямо соответствуют адресам программных, то есть аппаратному IRQ 0 соответствует INT 8, и так далее по таблице.

Зачем, спрашивается, нужны эти IRQ?
Во-первых - постоянно опрашивать все устройства на предмет «а не желаете ли Вы нам что-нибудь этакое передать?» просто непозволительно с точки зрения производительности.

Процессор просто утомится это делать - гораздо легче дать устройству какие-то права, и пусть оно командует.
Во-вторых, сам механизм позволяет программам и процессору абсолютно наплевательски относиться ко всем выступлениям со стороны устройств.

То есть программа даже не замечает, что, пока она работала, произошло 843 IRQ от жестких дисков, клавиатуры, таймера и прочего неотъемлемого барахла из мира внутренностей компьютера.
К тому же, очень важен тот факт, что устройство теоретически может быть обслужено именно в тот момент, когда оно готово что-то сделать или что-то сообщить системе.

Представьте себе, что на двух разных прерываниях «висят» два устройства - радар слежения за ракетами дальнего действия и чайник.
И вдруг они одновременно вызывают свои прерывания.
Что важнее для вас - чайник или сноп ракет, который может через минуту опуститься вам на голову?
То-то же!

Для разрешения таких ситуаций и существует система приоритетов, исходя из которых процессор выбирает, какое прерывание ему обслужить в первую очередь.

Вот список аппаратных прерываний, которые обычно используются в системе, которая не настроена каким-то особым образом:

0 (INT 08h) - системный таймер
. 1 (INT 09h) - контроллер клавиатуры
. 2 (INT 0Ah) - сопряжен с видеокартой на XT; на AT и выше используется для каскадирования второй микросхемы контроллера прерываний
. 3 (INT 0Bh) - стандартный для COM2/COM4
. 4 (INT 0Ch) - стандартный для COM1/COM3
. 5 (INT 0Dh) - обычно свободен, но на XT на этом IRQ находился контроллер жесткого диска
. 6 (INT 0Eh) - контроллер FDD
. 7 (INT 0Fh) - прерывание параллельного порта (LPT), однако многими LPT-контроллерами не используется
. 8 (INT 70h) - часы реального времени (RTC - Real Time Clock), прерывание вызывается 18,2 раза в секунду
. 9 (INT 71h) - эмуляция IRQ2 (для совместимости)
. 10 (INT 72h) - свободен
. 11 (INT 73h) - свободен
. 12 (INT 74h) - контроллер PS/2 мыши
. 13 (INT 75h) - математический сопроцессор
. 14 (INT 76h) - первый канал контроллера IDE HDD
. 15 (INT 77h) - второй канал контроллера IDE HDD

Что же это за звери - IRQ2 и IRQ9, которые связаны каким-то непонятным образом?
Дело в том, что на компьютерах XT (помните еще такие?) была всего одна микросхема, отвечающая за обработку аппаратных прерываний.
Возможности этой микросхемы были, мягко скажем, скудны - она могла обслуживать только аппаратные прерывания.

Но в нее был заложен потенциал - при каскадировании одного из прерываний на другую микросхему можно было подключить еще несколько таких наборов логики, и на компьютерах IBM AT таких микросхем было уже две, а аппаратных прерываний - 16.
Так как доступ ко второй микросхеме на аппаратном уровне осуществлялся через IRQ 2 первой (мост IRQ2-IRQ9), то использование в своих нуждах IRQ 2 или IRQ9 имело ряд особенностей.

Когда устройство, работающее на IRQ2, вызывало прерывание, новая логика AT аппаратно отправляла его на IRQ9, после чего BIOS, в свою очередь, перенаправлял сигнал на IRQ2 - чтобы программное обеспечение, рассчитанное на работу с IRQ2, имело возможность нормально работать с девайсом.

Именно поэтому в современных материнских платах, где вся логика работы с аппаратными прерываниями уже встроена в чипсет, для совместимости со старым программным и аппаратным обеспечением оставлен тандем IRQ2-IRQ9.
Сейчас можно совершенно спокойно использовать IRQ9 в своих целях.

Ну, хорошо, получили мы сигнал о том, что устройство нам что-то желает поведать, а дальше-то что?
Ведь нужно данные получить и как-то обработать.
Для этого организуется участок оперативной памяти, в котором устройство располагает данные для обработки, а драйвер, соответственно, ими оперирует.

Обычно эту область памяти называют адресами ввода-вывода.
Для того, чтобы не загружать каждый раз процессор передачей данных от устройства к памяти, используется DMA (Direct Memory Access - прямой доступ к памяти).

Передача данных ведется по так называемым каналам, которых всего семь:

0 - используется для регенерации памяти в некоторых системах
. 1 - свободен
. 2 - обслуживает контроллер FDD
. 3 - свободен (на XT - контроллер жесткого диска)
. 5 - свободен
. 6 - свободен
. 7 - свободен

Следует учитывать, что каналы 0-3 - восьмиразрядные, а каналы 5-7 - шестнадцатиразрядные.
Именно поэтому старый добрый SB 16 требовал два канала DMA - один (обычно первый) восьмибитный, а второй - шестнадцатибитный.

Драйвер AMD Radeon Software Adrenalin Edition 19.9.2 Optional

Новая версия драйвера AMD Radeon Software Adrenalin Edition 19.9.2 Optional повышает производительность в игре «Borderlands 3» и добавляет поддержку технологии коррекции изображения Radeon Image Sharpening.

Накопительное обновление Windows 10 1903 KB4515384 (добавлено)

Конфликт - это ситуация, при которой несколько объектов одновременно пытаются получить доступ к ресурсу, который предназначен только для одного из них. Конфликт прерываний возникает в том случае, если несколько устройств используют одну и ту же линию прерывания для посылки сигнала запроса, и нет механизма, позволяющего обрабатывать конкурирующие запросы. Если драйвер, получая управление, работает не с тем устройством, которое послало запрос, то либо происходит сбой, либо одно из устройств попросту не работает.

Возникает вопрос: могут ли несколько устройств использовать одну и ту же линию прерывания, или это в принципе невозможно? Ведь если драйвер сможет определить, от кого именно пришел запрос, то он будет реагировать на сигналы только "своего" устройства, игнорируя все остальные. Но это должно быть каким-либо образом заранее оговорено, иначе конфликт неизбежен.

Локальная шина PCI была спроектирована с учетом совместного использования прерываний. Каждое устройство PCI должно корректно работать на одной линии прерывания с другими PCI-устройствами. Это сделано следующим образом: факт наличия сигнала на линии прерывания определяется не по фронту, т.е. изменению уровня напряжения, а по самому факту наличия определенного напряжения. Изменять напряжение в линии может сразу несколько устройств, становясь как бы в очередь на обслуживание.

Таким образом, совместное использование одного IRQ несколькими PCI-устройствами не является конфликтом по определению (рис.). Однако иногда проблемы все-таки возникают. Во-первых, не все устройства PCI корректно работают на одной линии прерывания с другими. Во-вторых, иногда драйверы имеют ошибки, из-за которых они не могут правильно определять источник сигнала, мешая другим драйверам. В-третьих, далеко не все устройства работают на шине PCI; например, ISA-устройства, к которым относятся, например, контроллеры COM/LPT-портов, делить прерывания с другими не умеют.

Рис. Win2000 Device Manager IRQ Map - IO PIC Intel 440BX Chipset

Рис. Win2000 IRQ MAP - IO APIC - Via KT266a Chipset

В результате возможны ситуации, когда компьютер начинает часто зависать, отказывается выполнять какие-либо функции, а то и просто вываливается в так называемый «синий экран смерти».

Apic (Advanced Programmable Interrupt Controller, Улучшенный программируемый контроллер прерываний)

Как было показано выше, линия прерывания – очень дефицитный ресурс для компьютера. Однако, с развитием компьютерной индустрии количество различных внешних устройств в компьютере постоянно увеличивается. Например, на одной материнской плате могут присутствовать 5-6 слотов PCI, слот AGP, встроенный IDE-контроллер, встроенный SCSI-контроллер, встроенный 1/2-портовый сетевой адаптер и пр. И всем этим устройствам необходимы прерывания. 16 линий IRQпостепенно стало не хватать.

APIC – это контроллер прерываний (interrupt), позволяющий использовать 24 аппаратных прерывания вместо 16. Ограничение в 16 аппаратных прерываний, не менявшееся с 1982 года, сдерживало установку в персональный компьютер дополнительных устройств. В конце 2001 года появились первые материнские платы с APIC.

Рис. Система прерываний в многопроцессорной среде.

Предыдущее описание относилось к PIC, разработанным для однопроцессорных систем. Если система включает два и более процессоров, этот подход уже непозволителен и требуются более сложные PIC.

Все современные процессоры x86 включают в себя локальный APIC (local APIC). Каждый local APIC имеет 32-разрядные регистры, внутренние часы, локальный таймер и две дополнительные линии IRQ: LINT0 и LINT1, зарезервированные для прерываний local APIC. Все локальные APIC соединены с внешним APIC ввода-вывода (I/O APIC).

I/O APIC содержит набор из 24 линий IRQ, 24-входовую таблицу перенаправления прерываний, программируемые регистры и блок сообщений для посылки и получения сообщений по шине APIC. В отличие от выводов IRQ микросхемы 8259A, приоритет прерывания не привязан к номеру вывода.

Каждая запись в таблице перенаправления прерываний может быть запрограммирована индивидуальна, чтобы отобразить вектор прерывания и его приоритет, процессор, который будет обрабатывать прерывание и как этот процессор будет выбран. Информация в таблице перенаправления прерываний используется для трансляции каждого внешнего сигнала в сообщение, адресованное одному или нескольким local APIC через шину APIC.

Статическое распределение

Сигнал IRQ доставляется локальным APIC, перечисленным в соответствующей записи таблицы перенаправления прерываний. Прерывание доставляется одному конкретному CPU, множеству CPU или всем CPU.

Динамическое распределение

Сигнал IRQ доставляется локальному APIC процессора, который выполняет процесс с наименьшим приоритетом.

Каждый локальный APIC имеет программируемый регистр приоритета задания, который используется для вычисления приоритета текущего процесса. Intel предполагает, что этот регистр будет модифицироваться ядром операционной системы при каждом переключении процесса.

Кроме распределения прерываний по процессорам мульти-APIC система позволяет CPU генерировать межпроцессорные прерывания. Когда CPU желает послать прерывание другому CPU, он сохраняет вектор прерывания и идентификатор целевого local APIC в коммандном регистре прерываний (Interrupt Command Register (ICR)) своего локального APIC. Тогда сообщение посылается через шину APIC к целевому local APIC, который выпускает соответствующее прерывание своему CPU.

В настоящее время множество однопроцессорных систем включают чип I/O APIC, который может быть сконфигурирован двумя способами:

1. Как стандартный 8259A PIC, связанный с CPU. Local APIC отключен и две линии LINT0 и LINT1 сконфигурированы как INTR и NMI выводы.

2. Как стандартный внешний I/O APIC. Local APIC включен и все внешние прерывания получаются через I/O APIC.

Системные процессы, о которых рядовые пользователи компьютеров, часто не имеют представления, очень часто могут вызвать повышенные нагрузки на вычислительные ресурсы компьютера. К таковым, в частности, относятся так называемые системные прерывания. Что это такое, большинство не знает и часто пытается завершить работу данной службы непосредственно в «Диспетчере задач», где и отображается загрузка центрального процессора и оперативной памяти. Несколько забегая вперед, следует сказать, что заниматься такими вещами не стоит ни в коем случае. Но как тогда привести систему в чувство? Об этом предлагается поговорить более подробно, тем более, что при рассмотрении основного вопроса попутно могут обнаружиться и другие проблемы, связанные с некорректным функционированием «железных» компонентов, самих операционных систем Windows и установленного в их среде программного обеспечения. Но обо всем по порядку.

что это такое?

Прежде чем предпринимать какие бы то ни было шаги по устранению возникающих неполадок, следует выяснить, что собой представляет этот системный компонент. В «Диспетчере задач» за его функционирование отвечает процесс «Системные прерывания», который работает постоянно.

Но что это такое? Не вдаваясь в технические подробности и говоря о том, что это, системные прерывания можно сравнить с некой лакмусовой бумажкой или индикатором, который сигнализирует о том, что в системе наблюдаются сбои в работе какого-то оборудования. Кроме того, повышение нагрузки на ресурсы может быть связано еще с несовместимостью программной и аппаратной части компьютера. В обычном своем состоянии нагрузка на процессор со стороны этого процесса обычно не превышает пяти процентов или чуть больше, чего вполне достаточно для проведения диагностики всех используемых в данный момент «железных» устройств на предмет корректного функционирования в Если же нагрузка возрастает выше указанного лимита, необходимо срочно выявлять причину и устранять проблемы с оборудованием.

Как это работает: простейшее объяснение

Но давайте разберем, что собой представляют системные прерывания в Windows 7 или других модификациях на простом примере. Сразу следует отметить тот факт, что относительно программного обеспечения работу этого компонента связывают с неисполняемыми элементами программ, которые могут загружаться, например, в оперативную память (динамические библиотеки, драйверы устройств и т. д.).

Предположим, у вас на компьютере установлена какая-то современная игра, но видеокарта соответствует лишь минимальным ее системным требованиям, или конфигурация находится ниже этого порога. Если графический чип не справляется с обработкой программных компонентов, что ведет к повышению на него нагрузки, в дело включаются системные прерывания. За их счет обработка команд перенаправляется на центральный процессор, который и пытается помочь видеокарте справиться с возросшим числом обращений. Соответственно, и со стороны описываемого процесса в «Диспетчере задач» наблюдается увеличение нагрузки. И нередко возникновение таких ситуаций приводит не только к зависанию всей системы, но и даже к появлению синих экранов. То же самое относится и к случаям, когда оборудование начинает выходить из строя. К сожалению, при поломках «железных» компонентов системы все это в равной степени может относиться к любому из них (например, сыпется жесткий диск, дают сбои планки оперативной памяти и т. д.).

Системные прерывания грузят процессор: что делать в первую очередь?

Исходя из приведенных выше теоретических сведений, перейдем к практическим мерам, которые позволяют устранить возникающие проблемы и исправить такие ситуации. Что предпринять в первую очередь? Как ни странно это звучит, но иногда бывает достаточно выполнить самую обычную перезагрузку, что позволяет деактивировать все сторонние программные компоненты. Но ведь при повторном запуске какого-то приложения ситуация может повториться. В этом случае сразу же следует проверить состояние драйверов, используя для этого «Диспетчер устройств». Вполне возможно, что конфликт между программной и аппаратной частью как раз и был спровоцирован именно ими.

По возможности установите управляющее программное обеспечение для проблемных устройств, которые в «Диспетчере» могут быть помечены желтым треугольником с восклицательным знаком, и обновите драйверы для всего остального оборудования, используя для этого автоматизированные утилиты вроде Driver Booster.

Отслеживание нагрузок при помощи специальной утилиты

В случае, если действия с установкой и обновлением драйверов желаемого результата не дадут, придется использовать другие методы. Увы, в инструментарии Windows-систем таких средств нет.

Поэтому, если замечено, что системные прерывания грузят ресурсы, большинство специалистов рекомендует воспользоваться небольшой программой под названием DPC Latency Checker, которая представлена в портативном виде и не требует установки на ПК. В ней первым делом необходимо включить сканирование, после чего в результатах проверки будут приведены рекомендации по устранению проблем. Однако чаще всего связаны они только с завершением каких-то процессов, соответствующих и программам, и используемому в данный момент оборудованию, или будет выдана рекомендация обратиться к «Диспетчеру устройств». А вот его-то нам и нужно использовать, оставив диагностическую утилиту активной в качестве своеобразного средства изменения отслеживания нагрузок. Не путайте нагрузки, показанные в этой программе, с теми, которые видны в «Диспетчере задач».

Отключение компонентов в «Диспетчере устройств»

Что касается этого раздела управления оборудованием, суть устранения проблем сводится к тому, что последовательно отключать установленные в системе устройства с последующей проверкой нагрузок вышеупомянутой утилитой.

Обратите внимание, что категорически запрещается отключать оборудование, представленное в разделах «Компьютер», «Процессоры» и «Системные устройства», поскольку такие действия могут привести к несанкционированному завершению работы и перезагрузке компьютера. Чего доброго, еще и вся операционная система выйдет из строя.

Для остальных компонентов, предварительно включив в меню вида показ скрытых устройств, каждый компонент через меню ПКМ следует отключать, а затем заново активировать диагностику в программе отслеживания нагрузок. Когда в результатах тестирования после деактивации какого-то устройства нагрузка упадет до нормы, и будет понятно, что именно этот компонент является сбойным. Если не помогает переустановка драйвера, устройство придется заменить.

Что делать, если проблема с нагрузкой не устраняется?

Но что это? Системные прерывания все равно дают повышенную нагрузку на процессор. Что еще могло повлиять на возникновение такой ситуации? Почему-то (а это так и есть) в большинстве случаев первопричиной такого поведения системы называют проблему с устаревшим или встроенным в материнскую плату звуковым оборудованием, для которого задействовано улучшение саундэффектов.

Как вариант - в настройках звука средствами Windows, отключите данный пункт, что автоматически приведет к деактивации всех установленных эффектов. Заметьте, они относятся именно к программному, а не к аппаратному типу, поэтому отключение основного устройства может и не дать результата.

Проблемы с первичными системами ввода/вывода

Наконец, многие специалисты не исключают и появление неполадок в работе первичных систем BIOS/UEFI, которые могут быть связаны с устареванием оригинальной прошивки. В этом случае новое и более современное оборудование может определяться некорректно. Как уже понятно, выходом станет загрузка и инсталляция обновления для прошивки. Но, если запустить такие процессы для UEFI можно непосредственно в работающей операционной системе, с экспериментами в BIOS следует быть крайне осторожным. Несоответствующая прошивка или некорректная установка могут привести и к тому, что вся компьютерная система перестанет работать.

Краткие итоги

Это вкратце и все, что касается системных вызовов прерываний. Исходя из всего вышесказанного, устранять возникающие проблемы рекомендуется с задействованием указанной диагностической программы с последовательным отключением оборудования. При необходимости сбойные компоненты придется менять. В качестве дополнительного инструмента, который может быть использован для выявления проблем с планками оперативной памяти, целесообразно применять утилиту Memtest86+, однако без необходимых знаний толку от нее не будет никакого.


© 2024, leally.ru - Твой гид в мире компьютера и интернета