Na estrutura PCI original ("PCI Convencional") e também em PCI-X, os dispositivos correspondiam a "slots", cada um com seus próprios conectores conectados ao mesmo barramento paralelo. Cada slot tinha um pino de ID exclusivo que foi declarado durante a enumeração. A enumeração foi essencialmente pedindo (para cada slot): "Ei, há alguma coisa presente neste slot?" O dispositivo respondeu enviando dados para o barramento em resposta a esse sinal. A falta de resposta não significava nenhum dispositivo.
Um dispositivo também pode ser uma "ponte", o que significa que ele formava um barramento subordinado. Esse barramento teria um ID separado (atribuído a partir do upstream) e teria seu próprio conjunto de slots que foram enumerados independentemente.
PCI-Express (PCIe) é totalmente diferente. PCIe não é realmente um barramento - como em um recurso compartilhado entre dispositivos; em vez disso, cada dispositivo tem sua própria conexão serial ponto-a-ponto individual para seu dispositivo upstream (e para qualquer dispositivo downstream - e se tiver dispositivos downstream, isso significa que ele também está funcionando como uma ponte). Pense no PCIe como uma LAN. Cada bridge é análogo a um switch, que possui várias portas conectadas a outros dispositivos. Os outros dispositivos podem ser dispositivos terminais, ou podem ser outros switches (por exemplo, pontes PCIe).
O PCIe foi projetado de tal forma que sua estrutura conceitual e endereçamento (e, portanto, o comportamento fornecido ao software) é compatível com PCI e PCI-X. A implementação é completamente diferente. Na enumeração de dispositivos, por exemplo, como é ponto-a-ponto, a única questão que precisa ser determinada em cada ponto da enumeração é "alguma coisa aí?" Como cada dispositivo tem seu próprio conjunto independente de fios, os IDs dos dispositivos são essencialmente todos codificados (portanto, cada ponte, incluindo o "complexo raiz" de nível superior, informa a cada dispositivo qual será o ID do dispositivo) ser).
Em todos os casos, a parte "função" do barramento / dispositivo / função é tratada estritamente dentro do periférico. Por exemplo, um controlador NIC de porta dupla geralmente terá duas funções, uma para cada porta. Eles podem ser configurados e operados independentemente, mas o caminho de dados da CPU para a função é o mesmo para ambos.