link420 link421 link422 link423 link424 link425 link426 link427 link428 link429 link430 link431 link432 link433 link434 link435 link436 link437 link438 link439 link440 link441 link442 link443 link444 link445 link446 link447 link448 link449 link450 link451 link452 link453 link454 link455 link456 link457 link458 link459 link460 link461 link462 link463 link464 link465 link466 link467 link468 link469 link470 link471 link472 link473 link474 link475 link476 link477 link478 link479 link480 link481 link482 link483 link484 link485 link486 link487 link488 link489 link490 link491 link492 link493 link494 link495 link496 link497 link498 link499 link500 link501 link502 link503 link504 link505 link506 link507 link508 link509 link510 link511 link512 link513 link514 link515 link516 link517 link518 link519 link520 link521 link522 link523 link524 link525 link526 link527 link528 link529 link530 link531 link532 link533 link534 link535 link536 link537 link538 link539 link540 link541 link542 link543 link544 link545 link546 link547 link548 link549 link550 link551 link552 link553 link554 link555 link556 link557 link558 link559

PersCom — Компьютерная Энциклопедия Компьютерная Энциклопедия

PCI и PCI-X

Традиционные прерывания PCI — INTx#

Для устройств PCI выделяется четыре проводных линии запросов (IRQX, IRQY, IRQZ, IRQW), соединяемых с контактами INTA#, INTB#, INTC# и INTD# всех слотов PCI с циклическим смещением цепей. Соответствие линий INTx# и входов IRQ для устройства любой шины PCI приведено в таблице ниже. Мосты PCI просто электрически соединяют одноименные линии INTx своих первичных и вторичных шин. В системах с APIC, в которых число входов запросов увеличено до 24, дополнительные 8 входов могут использоваться периферийными устройствами, установленными на системной плате. На слотах PCI остаются доступными лишь четыре обычные линии запросов. 

 

Таблица. Коммутация запросов прерываний для устройств PCI

Контакт слота Вход коммутатора запроса для устройства с номером:
0, 4, 8, … 28 1, 5, 9, … 29 2, 6, 10, … 30 3, 7, 11, … 31
INTA# IRQW IRQX IRQY IRQZ
INTB# IRQX IRQY IRQZ IRQW
INTC# IRQY IRQZ IRQW IRQX
INTD# IRQZ IRQW IRQX IRQY

Устройство PCI вводит сигнал прерывания низким уровнем (выходом с открытым коллектором или стоком) на выбранную линию INTx#. Этот сигнал должен удерживаться до тех пор, пока программный драйвер, вызванный по прерыванию, не сбросит запрос прерывания, обратившись по шине к данному устройству. Если после этого контроллер прерываний снова обнаруживает низкий уровень на линии запроса, это означает, что запрос на ту же линию ввело другое устройство, разделяющее данную линию с первым, и оно тоже требует обслуживания. 

Заметим, что распространение сигнала прерывания не синхронизируется с передачей данных. Возможна ситуация, когда активное устройство, выполнив пересылку данных в память, посылает сигнал прерывания, оповещающий об этом событии. Однако записи, отосланные устройством, могут задержаться в мостах (если шина слишком загружена), и процессор начнет обрабатывать прерывание, еще не получив всех этих данных. Чтобы гарантировать целостность данных, программа ISR первым делом должна выполнить чтение какого-либо регистра своего устройства — чтение «из-за моста» принудит все мосты к выгрузке всех буферов отправленных записей.

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

Каждая функция устройства PCI может задействовать свою линию запроса прерывания, но его обработчик прерывания должен быть готовым к ее разделению (совместному использованию) с другими устройствами. Если устройству требуется только одна линия запроса, то оно должно занимать линию INTA#, если две — INTA# и INTB#, и т. д. С учетом циклического сдвига линий запроса это правило позволяет установить в 4 соседних слота 4 простых устройства, и каждое из них будет занимать отдельную линию запроса прерывания. Если какой-то карте требуется 2 линии, то для монопольного использования прерываний нужно оставить соседний слот свободным. Однако не следует забывать, что PCI-устройства системной платы тоже задействуют прерывания с той же закономерностью (кроме контроллера IDE, который, к счастью, держится особняком). Порт AGP в плане прерываний следует рассматривать наравне со слотом PCI. Таким образом, может оказаться, что монопольные линии прерывания присутствуют далеко не на всех слотах.

Назначение прерываний устройствам (функциям) выполняет процедура POST, и этот процесс управляем лишь частично. Параметрами CMOS Setup (PCI/PNP Configuration) пользователь определяет номера запросов прерываний, доступных шине PCI. В зависимости от версии BIOS это может выглядеть по-разному: либо каждой линии INTA#...INTD# явно назначается свой номер, либо ряд номеров отдается «на откуп» устройствам PCI вместе с устройствами ISA PnP (в противоположность устройствам «Legacy ISA»). В итоге POST определяет соответствие линий INTA#...INTD# номерам запросов контроллера и соответствующим образом программирует коммутатор запросов. По воле пользователя может оказаться так, что не каждой линии запроса шины PCI достается отдельный вход контроллера прерываний. Тогда коммутатор организует объединение нескольких линий запросов PCI на один вход контроллера, то есть разделяемыми станут даже разные линии запросов прерываний для PCI. В самом худшем случае устройствам PCI не достанется ни одного входа контроллера прерываний. Заметим, что BIOS вряд ли отдаст шине PCI прерывания 14 и 15 (их забирает контроллер IDE, если он не отключен), а также 3 и 4 (COM-порты). Новые версии ОС настолько сильно вникают в аппаратную платформу, что позволяют себе (зная чипсет системной платы или пользуясь функциями PCI BIOS) управлять коммутатором запросов прерываний. Эту возможность можно запретить или разрешить, например, в ОС Windows снятием или установкой флажка Использовать управление IRQ (PCI Interrupt Steering) в свойствах шины PCI (Панель управления-Системные устройства-Шина PCI).

Драйвер (или иное ПО), работающий с устройством PCI, определяет номер входа контроллера прерывания, доставшийся устройству (точнее, функции), чтением конфигурационного регистра Interrupt Line. По этому номеру определяется вектор, значение 255 означает, что номер не назначен. Номер входа каждому устройству заносит тест POST. Для этого он считывает регистр Interrupt Pin каждой обнаруженной функции и по номеру устройства (читай: географическому адресу!) определяет, какая из линий INTA#...INTD# (на входе коммутатора запросов) используется. Заметим, что правила, по которым на системной плате определяется соответствие между Interrupt Pin и входными линиями коммутатора запросов в зависимости от номера устройства, строго не регламентированы (деление номера устройства на 4 — это всего лишь рекомендация), но их твердо знает версия BIOS данной системной платы. К этому моменту тест POST уже определил таблицу соответствия этих линий номерам входов; пользуясь этой таблицей, он записывает нужное значение в конфигурационный регистр Interrupt Line. Определить, есть ли еще претенденты на тот же номер прерывания, можно, лишь просмотрев конфигурационные регистры функций всех устройств, обнаруженных на шине (это не так уж сложно сделать, пользуясь функциями PCI BIOS).

В PCI BIOS начиная с версии 2.1 имеются функции определения возможностей и конфигурирования прерываний. Одна из функций возвращает структуру данных, в которой для каждого устройства (на каждой шине) сообщается, с какими входами контроллера прерываний (IRQx) могут быть связаны его линии INTx и с каким именно связаны в данный момент. Также указывается и физический номер слота, в который установлено данное устройство. Кроме того, возвращается и битовая карта, показывающая, какие входы IRQx отводятся исключительно шине PCI (и не используются абонентами других шин). Функция установки для заданного устройства устанавливает связь выбранного сигнала (INTx) с выбранным входом контроллера прерываний (IRQx), то есть программирует коммутатор. Эта функция предназначена для использования только конфигурационным ПО (BIOS, ОС), но никак не драйвером устройства. Тот, кто ею пользуется, сам отвечает за возможные конфликты, за правильное программирование контроллера прерываний (выбранный вход должен быть чувствительным к низкому уровню, а не положительному перепаду), за корректировку информации в конфигурационном пространстве всех затронутых устройств (у которых линии запроса связаны с выбранной линией INTx).