Работает ли PCIe hotplug на практике?

20

Я вступил в обсуждение в комментариях /security/109199/is-physical-security-less-important-now-for-securing-a-server?noredirect=1#comment194327_109199

Вопрос прост. Кто-нибудь имел опыт успешного горячего подключения карты PCIe? Требуются ли для него специальные материнские платы и карты, или он должен работать на любом потребительском оборудовании?

pjc50
источник
1
Ответ должен быть двояким. Аппаратное и программное обеспечение (его драйверы) должны поддерживать горячее подключение.
Джиппи
Я не знаю, помогает ли это, но я только что успешно удалил второй транзитный графический процессор с Windows-машины KVM, не влияя на первый GPU (экран мигнул на секунду).
feedc0de

Ответы:

43

Раньше я проектировал оборудование PCI-Express, для которого требовалась полная поддержка «горячей» замены аппаратного и программного обеспечения, и это, конечно, возможно, но это довольно сложно и требует обширной поддержки программного обеспечения - оборудование на самом деле довольно простое. Мне пришлось спроектировать аппаратное обеспечение, а затем реализовать поддержку BIOS (UEFI) и ядра (Linux) для горячего подключения произвольных устройств PCIe через оптоволокно и медь.

С точки зрения программного обеспечения, следует помнить, что PCIe продолжает работу с программной моделью PCI, включая концепцию адресации шины, устройства, функции. При перечислении шины PCI выполняется поиск в ширину: Топология шины PCI от tldp.org

Перечисление 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 обычно взимает за это деньги :)

Крунал Десаи
источник
2
И в завершение обсуждения безопасности, с относительно дешевой FPGA (например, Cyclone IV GX), выступающей в качестве устройства PCIe, ваш хост-компьютер готов - FPGA может выполнять любые действия DMA, которые она хочет.
Крунал Десаи
Отличное объяснение. Что произойдет, если карта PCIe с поддержкой «горячей» замены будет заменена? С одной стороны, ОС должна снова перечислить топологию PCIe, видя, что было вставлено новое устройство (она не может предсказать размер BAR / количество шин, которые могут быть запрошены вновь вставленным устройством), но с другой стороны - повторное перечисление системы может оказаться невозможным без влияния на ресурсы, которые уже были назначены существующим устройствам в топологии ...
so.very.tired
2
Да, это становится сложно. Таким образом, используя ExpressCard (EC) в качестве примера, один из способов, которыми я это сделал, - это «заполнить» количество шин, чтобы поддержать добавление устройства, которое может перейти на еще большее количество устройств; большинство BIOS с простым слотом EC просто дополняют его одним номером шины (мы использовали этот слот для расширения до многих устройств PCIe). Кроме того, вы можете «заполнить» диапазон памяти, который можно назначить для поддержки различных устройств с непрерывным диапазоном адресов, как и для IRQ. ОС (с / без ACPI) может делать то, что будет. Это на самом деле «просто», но сложность слоев SW в современной машине усложняет задачу.
Крунал Десаи
Разве перечисление PCIe на самом деле не поиск в глубину? Базовый и лимитный регистры настроены так, что все устройства ниже данного порта должны быть перечислены перед переходом к следующему порту.
alex.forencich
8

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

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

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

Обратите внимание, что динамическое обновление карты адресов PCI добавляет значительную сложность драйверу PCI (e); если новое устройство вставлено, то оно должно быть сопоставлено с той шиной, на которой оно живет, с соответствующими преобразованиями новых адресов, но если устройство удаляется, а затем заменяется чем-то другим , это усложняет отслеживание адресов пространства PCI ,

Без этой сложности подсистема PCI сканируется один раз (при перезагрузке системы) и остается статической; никаких дополнительных усилий не требуется.

Вот базовая спецификация PCIe v3.0 , стр. 514, раздел 6.7 о поддержке «горячей замены». Пример платы PCIe, которая поддерживает горячее подключение, можно увидеть здесь, благодаря iocrest . Хорошо видно, что более короткая трассировка разъема проложена: 2-портовая плата контроллера SATA III (6G) PCI-e, набор микросхем Marvell 88SE9120

Однако на этой плате Axxon можно увидеть более короткий след, направленный к соседнему. На физическом уровне эта карта не поддерживает горячее подключение: MAP / 950 1 плата ввода-вывода последовательного порта RS232 для PCI Express (PCIe)

Питер Смит
источник
2

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

Так же, как и все стандарты безопасности. Половина (<-hyperbole?) Этикеток EE, с которыми мы имеем, вы можете требовать совместимости, без необходимости тестирования всего, что вы делаете. Поскольку «горячая розетка» не угрожает жизни, я не могу представить, чтобы люди были более строги к этому.

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

Asmyldof
источник
1

Да, это работает. Я смог заставить его работать с помощью горячей замены линейной платы шасси маршрутизатора (содержащей более 10 устройств PCIe). Шасси имеет 16 карт с возможностью горячего подключения. Любая из карт может быть подключена или отключена случайным образом во время выполнения, не влияя на операции трафика на других картах.

Сложность заставить его работать зависит от среды процессора. На встроенном ЦП работа заключается в простой настройке статической карты ресурсов и обработке событий изменения соединения путем подключения и отсоединения устройств PCI. На x86 это гораздо сложнее из-за сложности обработки ошибок и взаимодействия BIOS / OS.

xzhu70
источник