Раньше я проектировал оборудование PCI-Express, для которого требовалась полная поддержка «горячей» замены аппаратного и программного обеспечения, и это, конечно, возможно, но это довольно сложно и требует обширной поддержки программного обеспечения - оборудование на самом деле довольно простое. Мне пришлось спроектировать аппаратное обеспечение, а затем реализовать поддержку BIOS (UEFI) и ядра (Linux) для горячего подключения произвольных устройств PCIe через оптоволокно и медь.
С точки зрения программного обеспечения, следует помнить, что PCIe продолжает работу с программной моделью PCI, включая концепцию адресации шины, устройства, функции. При перечислении шины PCI выполняется поиск в ширину:
Перечисление PCIe обычно выполняется дважды. Во-первых, ваш BIOS (UEFI или другой) сделает это, чтобы выяснить, кто присутствует и сколько памяти им нужно. Затем эти данные могут быть переданы в хост-ОС, которая может принять их как есть, но Linux и Windows часто также выполняют свою собственную процедуру перечисления. В Linux это делается через базовую подсистему PCI, которая ищет шину, применяет любые причуды, если необходимо, на основе идентификатора устройства, а затем загружает драйвер, который имеет соответствующий идентификатор в своей функции зонда. Идентификатор устройства PCI идентифицируется через комбинацию его идентификатора поставщика (16 бит, например, Intel - 0x8086) и идентификатора устройства (еще 16 бит) - наиболее распространенный источник в Интернете находится здесь: http://pcidatabase.com / .
Пользовательская часть программного обеспечения входит в процесс перечисления, то есть вы должны заблаговременно резервировать номера шины PCI и сегменты памяти для потенциальных будущих устройств - это иногда называют « заполнением шины ». Это исключает необходимость повторного подсчета шины в будущем, что часто невозможно сделать без нарушения работы системы. Устройство PCI имеет BAR (регистры базовых адресов)) который запрашивает у хоста, сколько и какого типа (памяти или пространства ввода-вывода) памяти требуется устройству - вот почему вам больше не нужны перемычки, такие как ISA :) Аналогично, ядро Linux реализует горячее подключение PCIe через pciehp Водитель. Windows делает разные вещи в зависимости от версии - старые версии (я думаю, что XP) игнорируют все, что говорит BIOS, и проводят собственное исследование. Я полагаю, что более новые версии более уважительно относятся к ACPI DSDT, предоставляемому микропрограммой хоста (BIOS / EFI), и будут включать эту информацию.
Это может показаться довольно сложным, и это так! Но помните, что любой ноутбук / устройство со слотом ExpressCard (который реализует PCIe, так как вы можете иметь ExpressCard только с USB) должен это делать, хотя обычно заполнение довольно простое - всего одна шина. Раньше моим старым оборудованием был коммутатор PCIe, за которым стояли еще 8 устройств, поэтому заполнение стало несколько сложнее.
С аппаратной точки зрения это намного проще. Контакты GND карты сначала соприкасаются, и мы поместили бы на плату интегральную схему контроллера горячей замены от LTC или аналогичную для последовательного включения питания после установления соединения. В этот момент встроенная плата ASIC или FPGA начинает последовательность включения питания и начинает пытаться обучить канал связи PCI Express. Предполагая, что хост поддерживает горячее подключение и PCI Express SLTCAP / SLTCTRLрегистр (в спецификации: регистр возможностей слотов PCI Express, регистр управления слотами PCI Express. Для этого также есть 1 и 2 - достаточно битов для разделения на две регистры). поскольку этот порт был настроен так, чтобы указывать, что порт поддерживает «горячее» подключение, программное обеспечение может начать перечисление нового устройства. Регистр состояния слота (SLTSTA, регистр состояния слота PCI Express) содержит биты, которые целевое устройство может установить, указывая на сбой питания, механическую защелку и, конечно, обнаружение присутствия + присутствие изменилось.
Вышеупомянутые регистры находятся в «Пространстве конфигурации PCI (Express)», которое является небольшой областью карты памяти (4K для PCIe), выделенной для каждого потенциального файла bdf (шина: устройство: функция). Фактические регистры обычно находятся на периферийном устройстве.
На стороне хоста мы можем использовать PRSNT1 # / PRSNT2 # как простые сигналы постоянного тока, которые подают на включение IC переключателя питания, или запускать GPIO на чипсете / PCH, чтобы вызвать IRQ и вызвать SW 'эй, что-то вставлено иди найди и настрой это! рутина.
Это много информации, которая не дает прямого ответа на ваш вопрос (см. Краткую сводку ниже), но, надеюсь, она даст вам более полное представление о понимании процесса. Если у вас есть какие-либо вопросы о конкретных частях процесса, дайте мне знать в комментарии здесь или напишите мне письмо, и я могу обсудить дальше + обновить этот ответ с этой информацией.
Подводя итог, необходимо отметить, что периферийное устройство должно быть спроектировано с поддержкой горячей замены с точки зрения аппаратного обеспечения. Правильно спроектированный хост / слот также поддерживает горячее подключение, и на материнской плате класса high-end я ожидаю, что он будет безопасным. Тем не менее, программная поддержка - это совсем другой вопрос, и вы, к сожалению, обязаны BIOS, который поставил вам ваш OEM.
На практике вы используете эту технологию каждый раз, когда извлекаете / вставляете карту PCIe ExpressCard из компьютера. Кроме того, высокопроизводительные блейд-системы (телекоммуникационные или иные) также регулярно используют эту технологию.
Последний комментарий - сохраните PDF, который был связан с Базовыми спецификациями, PCI-SIG обычно взимает за это деньги :)