В исходной платформе PCI («Обычный PCI»), а также в PCI-X устройства соответствовали «слотам», каждое из которых со своими собственными разъемами, подключенными к одной и той же параллельной шине. Каждый слот имел уникальный идентификационный номер, который был указан при перечислении. Перечисление по существу спрашивало (для каждого слота): «Эй, есть ли что-нибудь в этом слоте?» Устройство ответило передачей данных на шину в ответ на этот сигнал. Отсутствие ответа означало отсутствие устройства.
Устройство также может быть «мостом», что означает, что оно образует подчиненную шину. Эта шина будет иметь отдельный идентификатор (назначенный из восходящего потока) и будет иметь свой собственный набор слотов, которые перечисляются независимо.
PCI-Express (PCIe) совершенно другой. PCIe на самом деле не шина - как в ресурсе, совместно используемом устройствами; вместо этого каждое устройство имеет свое индивидуальное последовательное соединение точка-точка с вышестоящим устройством (и с любыми нисходящими устройствами - и если оно имеет нисходящие устройства, это означает, что оно также функционирует как мост). Думайте о PCIe как о локальной сети. Каждый мост аналогичен коммутатору, который имеет несколько портов, подключенных к другим устройствам. Другие устройства могут быть оконечными устройствами или другими коммутаторами (например, мостами PCIe).
PCIe был разработан таким образом, чтобы его концептуальная структура и адресация (и, следовательно, поведение, предоставляемое программному обеспечению) были совместимы с PCI и PCI-X. Реализация, однако, совершенно другая. Например, при перечислении устройств, поскольку это точка-точка, единственным вопросом, который необходимо определить в каждой точке перечисления, является «что-нибудь там?» Поскольку каждое устройство имеет свой собственный независимый набор проводов, идентификаторы устройств по существу все жестко закодированы (следовательно, каждый мост, включая «корневой комплекс» верхнего уровня, сообщает каждому устройству, каким будет его идентификатор устройства).
Во всех случаях «функциональная» часть шины / устройства / функции обрабатывается строго внутри периферийного устройства. Например, контроллер NIC с двумя портами часто имеет две функции, по одной для каждого порта. Они могут быть настроены и работать независимо, но путь данных от процессора к функции одинаков для обоих.