Как бороться с IRQ?

В этой статье я хотел бы рассказать о том, что может никогда не напоминать о себе, а может и стоить нервов после сборки или апгрейда компьютера: зависания, самопроизвольные перезагрузки, упорное нежелание грузиться, постоянные "синие экраны смерти", невозможность обнаружения устройств, неверная работа… Список можно продолжать еще долго. Очень часто такие "глюки" происходят именно по вине прерываний, а если Вы интересуетесь компьютерами, то обязательно должны знать, откуда и почему появляются подобные проблемы и, самое, наверно, главное, как с этим бороться.

Что это такое?

Прерывания или IRQ (Interrupt Request) - это сигналы, которые сообщают процессору, что нужно обработать поступивший от устройства запрос, а посылает процессору оные сигналы контроллер этого самого устройства, то есть при помощи IRQ процессор реагирует на различные события.

Так уж сложилось, что при разработке какой-нибудь технологии создаются некоторые ограничения, не специально, конечно, а из-за какой-нибудь особенности этого новшества или просто недочета. Так случилось и с прерываниями. Первоначально, когда IBM разрабатывала архитектуру IBM PC (аж в 1980-81 годах прошлого тысячелетия), их было заложено не так много (8), потом, правда, добавили еще столько же, забрав одно "старое" прерывание под контроллер новых, но я бы не сказал, что и этого оказалось достаточно. А потом фирма IBM перестала быть единственной, кто занимался платформой PC, и, во избежание несовместимости с другими, никто больше прерываний и не добавил.

Какие могут быть проблемы?

Когда архитектуру IBM PC только создавали, прерываний было создано немного, всего восемь, как я уже писал, и отдавали их на всякую "ерунду", вроде портов COM, хотя оправдывает инженеров IBM то, что выбора особого не было, его пришлось искать позже. Очевидно, никто не пророчил платформе такое будущее, поэтому для ее изюминки, то есть возможности расширения, было оставлено только одно прерывание, которое потом было занято контроллером второй "восьмерки" IRQ. Правда, стоит заметить, что дополнительные прерывания могли (и могут) быть высвобождены путем отключения различных занимающих их ISA-устройств: портов, флоппи-дисковода. Так вот, ошибки, или конфликты, возникают когда несколько устройств пытаются работать на одном прерывании. Это очень проблематично, потому что многие современные устройства, особенно звуковые карты и всевозможные мультимедийные комбайны несут на себе сразу несколько устройств. Даже самые простые "звуковухи" имеют на борту не менее четырех девайсов. Вот так выглядит карта прерываний в современном компьютере:

IRQ   Описание
0 Таймер
1 Клавиатура
2 Контроллер IRQ 8-15
3 COM2
4 COM1
5 LPT2
6 Контроллер FDD
7 LPT1
8 Real Time Clock
9 Свободен
10 Свободен
11 Свободен
12 PS/2 (для мыши)
13 Сопроцессор
14 Контроллер HDD
15 Контроллер HDD

Так что же это получается? На современный компьютер можно установить только три дополнительных устройства? Судя по таблице, да, но не все так страшно. У Вас, например, есть порт LPT2? Очень сомневаюсь. Значит, если порта нет, то и прерывание свободно. Итак, теоретически можно освободить следующие прерывания:

IRQ   Описание
3 Порт вполне можно освободить, отключив его в BIOS. Я думаю, в большинстве случаев он и так свободен.
4 Тоже можно отключить. Но он используется значительно чаще: мыши, модемы, сканеры.
5 Про это я уже писал. Почти всегда свободен.
6 Если будете собирать новый компьютер, тем более домой, польза от старого доброго флопика, значительно меньше, чем даже пару лет назад. Очень у многих уже есть дисководы CD-RW. Больше места, надежнее, быстрее, хотя, хоронить FDD еще рано… Флоп можно отключить и освободить IRQ.
7 Если у Вас принтер на USB, можете хоронить…
12 В большинстве современных компов мыши именно такие. Можете поставить грызуна на COM, но забьете другое прерывание, мышку можно купить и на USB, но это будет уже маниакальной борьбой за IRQ :)
14 Слабо без винта? Хотя, теоретически, можно…
15 Даже если у вас только два IDE-устройства, их лучше развести на два разных канала. Работать будет быстрее. Но прерывание можно и освободить.

Уже проще. Но хватает ли этого? Лезу в свойства системы (у меня Windows XP Professional). Пуск -> Все программы -> Стандартные -> Служебные -> Информация о системе. Дальше в окне программы: Ресурсы аппаратуры -> Прерывания (IRQ). Вот, что я там вижу:

IRQ   Описание
0 Системный таймер
1 Стандартная (101/102 клавиши) или клавиатура PS/2 Microsoft Natural
3 Последовательный порт (COM2)
4 Последовательный порт (COM1)
5 Conexant SoftK56 Data Fax Voice Speakerphone
5 VIA Rev 5 USB универсальный хост-контроллер
5 VIA Rev 5 USB универсальный хост-контроллер
6 Стандартный контроллер гибких дисков
8 CMOS и часы
9 Microsoft ACPI-совместимая система
10 Avance AC'97 Audio for VIA (R) Audio Controller
11 ATI RADEON VE DDR
12 PS/2-совместимая мышь
13 Процессор числовых данных
14 Первичный канал IDE
15 Вторичный канал IDE

Спрашивается: что делает мой внутренний модем, который, кстати, несет на себе несколько устройств, на одном прерывании (из-под отсутствующего LPT2) со сразу двумя контроллерами USB? А вот что.

Выход был найден

Наступило начало девяностых. Системная шина (ISA - Industrial Standard Architecture), которая работала на частоте процессора, уже исчерпала себя. А все потому, что она могла нормально передавать данные только на частоте 8 МГц, чего вполне хватало для всяких там PC/XT/AT/286/386. А такой продвинутый процессор как 486 работал на значительно большей частоте. Пришлось эту шину замедлять, что отрицательно сказывалось на частоте. В 1989 году была разработана 32-битная шина EISA - Extended Industrial Standard Architecture, которая работала на частоте 10 МГц, но это была всего лишь попытка сделать из телеги велосипед, просто исправление ошибок ISA. Примерно в это время IBM создала шину MCA, которая не прижилась. Была создана и шина VESA (или VL-bus), но она могла работать только с Intel 486. И вот в 1991 году, в качестве своего внутреннего проекта, Intel приступила к разработке абсолютно новой локальной шины PCI - Personal Component Interconnect. Она разрабатывалась можно сказать с нуля, а не была очередной заплатой к ISA, что дало ей большие преимущества. Например, она работала на фиксированной частоте в 33 МГц, плюс у процессора была собственная быстродействующая шина, что позволяло ему обращаться к кэшу и оперативной памяти на той частоте, на которой ему надо, и не опираться на технические ограничения локальной шины. Новая шина PCI могла нести приличную нагрузку: до десяти слотов. Именно к PCI подключаются все видеоадаптеры, ведь шина AGP это всего лишь "прикрученная" PCI с большей тактовой частотой - 66 МГц. К ней же подключается (через контроллер) и системная шина ISA, которая присутствует на всех современных компах в виде портов COM и LPT, гибких дисков. Правда, необходимости в ней становится все меньше: флопики простаивают по вине CD-R/RW, COM/LPT - по вине USB… Так вот эта шина PCI, без которой не обходится ни одна современная материнская плата, стала решением проблемы прерываний.

Как известно, компьютеры могут оперировать только с "1" и "0" или "есть сигнал" и "нет сигнала". Если устройство ISA выставит на линию сигнал "1", то другому устройству на этой же линии свои единицы как не выставляй, контроллер на них не отреагирует. В случае с PCI контроллер проверяет источник сигнала и только потом обрабатывает его. Это и позволяет помещать несколько устройств на одно прерывание. Теоретически да, но имейте ввиду, что не стоит "вешать" устройства постарше и поновее на один канал IRQ. Есть также мнение, что не стоит ничего ставить на одно прерывание со звуковой картой, могут появляться ошибки. Это, конечно, происходит далеко не всегда, но лучше сообразить что-нибудь понадежнее.

Приехали…

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

Настройка прерываний из BIOS

Так по какому же принципу распределяются прерывания? При загрузке системы BIOS раздает прерывания следующим образом: линии IRQ всех устройств, которые поддерживают технологию Plug'n'Play, а это все современные устройства, получают по одному свободному прерыванию. Если прерывания кончились, а неохваченные девайсы еще есть, BIOS раздает их по второму кругу, потому и получается, что несколько устройств получили одно прерывание. Все будет чудесно работать, если одно прерывание получили два PCI устройства, а если PCI + ISA или ISA + ISA? Все, конфликт. Надо бы это процесс прибрать к рукам.

Далее стоит заметить, что я использую материнскую плату Epox 8K3AP с Award BIOS 6.00PG. Наиболее удобный и логичный способ настройки IRQ - назначить их "ручками". Заходим в PCI/PnP Configurations. Там есть настройки INT Pin n Assignment (это у меня, а у Вас может быть и это, и такие названия как Slot n Use IRQ (точно помню, так было в Award BIOS v. 4.51 PG); PCI Slot n Priority или что-нибудь подобное). Каждый пункт этого меню соответствует одной из четырех линий IRQ, так что вы можете назначить каждой линии свое прерывание.

Есть еще один способ переназначения IRQ. Заходите в тот же PCI/PnP Configurations, там есть пункт IRQ resources (чтобы туда зайти надо поставить значение параметра Resources controlled by равным Manual), а именно он и нужен нам сейчас. Там будут настройки каждого возможного прерывания. Я почти уверен, что на всех номерах будет стоять вариант, связанный с шиной PCI, например, PCI/ISA или PCI device, это зависит от вашей версии BIOS. А нам ведь надо, чтоб одно или несколько прерываний оставались пропущенными, то есть резервировались для ISA устройств. Так вот, на том прерывании, которое хотите оставить, просто выставляете значение вроде Legacy ISA. В более современных компьютерах все стало значительно проще из-за отсутствия слотов ISA, а это значит, что вы не можете добавить свои ISA устройства, а уж с системными, вроде флопика или последовательных/параллельных портов система сама разберется сносно. В таких системах вместо значения Legacy ISA появляется значение Reserved, то есть можно просто оставить прерывание свободным. Это может понадобиться в скорее теоретическом случае, если к Вам попало устройство не поддерживающее Plug'n'Play, тогда BIOS его просто не увидит.

В том же меню есть еще один полезный пункт. Информация об установленном оборудовании хранится в ESCD (Extended System Configuration Data). Эта информация проверяется каждый раз перед обращением к жесткому диску для запуска операционной системы. Естественно, при изменении конфигурации ESCD обновляется, а когда происходит обновление, изменяются и IRQ. Установив значение опции Reset Configuration Data в Enabled, Вы сбросите ESCD при следующем перезапуске.

В Award 6.00, а именно это BIOS установлен на большинстве материнских плат, есть еще одна интересная "фича". Если зайти в Power Management Setup ' IRQ/Event Activity Detect ' IRQs Activity Monitoring, то там можно настраивать, от устройств на каких прерываниях компьютер будет просыпаться. Там же можно посмотреть и текущее распределение номеров IRQ, но не всегда на это можно положиться, а вот почему:

Настройка прерываний из Windows

После BIOS в процесс распределения номеров IRQ сует свой нос Windows. Для того чтобы она правильно все сделала, хоть вмешивается винда в оный процесс далеко не всегда, надо ВСЕГДА иметь самые свежие драйверы материнской платы. Это очень важно, особенно, если вы собрали/купили современный компьютер, с материнской платой на новом или относительно новом чипсете и поставили на все это какой-нибудь Windows 98… Лично я знаю много таких людей, которые считают примерно так: у меня на материнской плате никаких наворотов нет, все там по стандарту, никаких "дров" не надо… Это совсем неправильно. Для нормальной работы системы, особенно когда прерывания используются совместно, нужно, чтобы Windows распознала чипсет и загрузила IRQ Miniport. Не забывайте также поставить свежие или хотя бы "родные" драйверы всех устройств, это поможет системе правильно работать.

Если Вы используете Windows 9x, то для того, чтобы узнать, правильно ли распределены прерывания или поправить их, зайдите в свойства системы, для этого на вкладке Устройства найдите свиток Системные устройства, а там Шину PCI. Если IRQ Miniport загружен, то все в порядке. В Win 9x вы можете, как и в BIOS резервировать прерывания. В том же диспетчере устройств найдите Компьютер и вызовите его свойства. А вот для того, чтобы установить конкретное прерывание определенному устройству, надо зайти в его свойства и на вкладке Ресурсы выставить нужное прерывание. К сожалению, это возможно только в Win 9x, в Win XP я как не искал, так и не нашел, как отменить автоматическую настройку.

Если Вы используете более новые Win 2000 или XP, что, на мой взгляд, является более оправданным выбором, то Вы можете столкнуться с некоторыми проблемами. Вы знаете, что такое ACPI (Advanced Configuration and Power Interface)? Это специальный интерфейс конфигурирования. Он несет в себе массу полезностей, но в Win 2K/XP может Вам здорово насолить. Особенно, если в системе есть ISA платы. Из-за него винда распределяет все PCI устройства, которые сидят в одноименных разъемах, на одно прерывание (вот почему у меня USB с модемом на IRQ 5, а остальное - на других), хорошо, хоть содержимое AGP слота и AC'97-кодек туда не спихнули ;). Из-за этого, если не выключать ACPI в BIOS перед установкой Windows, переназначить IRQ не удастся. Как посмотреть их распределение, я уже писал выше. А чтобы изменить ситуацию, придется выключать ACPI в BIOS (пункт ACPI Functions в разделе Power Management Setup) и изменять драйвер устройства Компьютер в диспетчере устройств с Компьютер с ACPI на Стандартный Компьютер. Хотя, лично мне бы не особо хотелось терять такие функции, напрямую связанные с ACPI, как автоматическое выключение компьютера или включение с клавиатуры. Кстати говоря, иногда и этот прием отмены ACPI не срабатывает, потому приходится выключать в BIOS и переставлять Windows.

Используются технологии uCoz