Espaços de endereço no PCIe

19

Existem quatro espaços de endereço no PCI express:

  • Memória mapeada
  • E / S mapeada
  • Espaço de configuração
  • mensagem

Alguém pode explicar o significado de cada espaço de endereço e seu objetivo em breve?

Pelo meu entendimento, todos esses espaços são alocados na RAM (ou seja, na memória do processador). Espaço de configuração é o espaço alocado para um conjunto comum de registros (presente em todos os dispositivos PCIe). Esse espaço é comum entre todos os dispositivos PCIe? E como é útil para a operação funcional do PCIe?

Este espaço contém BAR (registro de endereço base). Esse registro é usado para especificar o endereço disponível no terminal PCIe?

Eu sou novo no PCIe e estou tentando aprender. Estou me referindo à especificação Base, mas acho que ela foi escrita para os leitores que possuem algum conhecimento prévio sobre PCI e PCIe.

Consulte também algumas referências on-line gratuitas úteis para acelerar o entendimento das especificações básicas. Entendo que sempre que qualquer dispositivo PCIe conectado ao complexo raiz, ele será atribuído a alguma região de memória.

ronex dicapriyo
fonte

Respostas:

31

Faz um tempo desde que isso foi feito, mas eu odeio perguntas órfãs :)

Primeiro, vamos simplificar demais uma plataforma x86 moderna e fingir que ela possui 32 bits de espaço de endereço de 0x00000000 a 0xFFFFFFFF. Ignoraremos todas as áreas especiais / reservadas, buracos TOLUD (topo da DRAM de menor uso, linguagem Intel), etc. Vamos chamar esse mapa de memória do sistema .

Segundo, o PCI Express estende o PCI. Do ponto de vista do software, eles são muito, muito parecidos.

Vou pular para o seu terceiro - espaço de configuração - primeiro. Todos os endereços que apontam para o espaço de configuração são alocados no mapa de memória do sistema . Um dispositivo PCI tinha um espaço de configuração de 256 bytes - isso é estendido para 4KB para o PCI Express. Esse espaço de 4KB consome endereços de memória do mapa de memória do sistema, mas os valores / bits / conteúdos reais geralmente são implementados nos registros no dispositivo periférico. Por exemplo, quando você lê o ID do fornecedor ou o ID do dispositivo, o dispositivo periférico de destino retornará os dados mesmo que o endereço de memória usado seja do mapa de memória do sistema.

Você afirmou que eles estão "alocados na RAM" - não é verdade, os bits / elementos com estado reais estão no dispositivo periférico. No entanto, eles são mapeados no mapa de memória do sistema. Em seguida, você perguntou se era um conjunto comum de registros em todos os dispositivos PCIe - sim e não. Como o espaço de configuração do PCI funciona, há um ponteiro no final de cada seção que indica se há mais "coisas" a serem lidas. Existe um mínimo que todos os dispositivos PCIe precisam implementar e os dispositivos mais avançados podem implementar mais. Quanto à utilidade da operação funcional, bem, é obrigatória e muito utilizada. :)

Agora, sua pergunta sobre BARs (registros de endereço base) é um bom espaço para seguir para o espaço da memória e do espaço de E / S. Sendo um pouco centrada em x86, a especificação permite a especificação de um tamanho de BAR, além do tipo. Isso permite que um dispositivo solicite uma BAR regular de memória mapeada ou uma barra de espaço IO, que consome parte do espaço de 4K de E / S de uma máquina x86. Você notará que, nas máquinas PowerPC, as BARs espaciais de E / S são inúteis.

Uma BAR é basicamente a maneira do dispositivo informar ao host quanta memória ele precisa e de que tipo (discutido acima). Se eu pedir, digamos, 1 MB de espaço mapeado na memória, o BIOS poderá me atribuir o endereço 0x10000000 a 0x10100000. Isso não está consumindo RAM física, apenas espaço de endereçamento (você percebe agora por que os sistemas de 32 bits enfrentam problemas com placas de expansão, como GPUs de última geração com GB de RAM?). Agora, uma gravação / leitura de memória para dizer 0x10000004 será enviada para o dispositivo PCI Express e esse pode ser um registro de bytes que se conecta aos LEDs. Portanto, se eu escrever 0xFF no endereço de memória física 0x10000004, isso acenderá 8 LEDs. Essa é a premissa básica de E / S mapeada na memória .

O espaço de E / S se comporta de maneira semelhante, exceto que opera em um espaço de memória separado, o espaço de E / S x86. O endereço 0x3F8 (COM1) existe no espaço de E / S e no espaço da memória e são duas coisas diferentes.

Sua última pergunta, as mensagens referem-se a um novo tipo de mecanismo de interrupção, interrupções sinalizadas por mensagem ou MSI. Os dispositivos PCI herdados tinham quatro pinos de interrupção, INTA, INTB, INTC, INTD. Geralmente, estes eram alternados entre os slots, de modo que o INTA foi para o INTA no Slot 0, depois o INTB no Slot 1, o INTC no Slot 2, o INTD no Slot 3 e depois de volta para o INTA no Slot 4. A razão disso é que a maioria das PCI os dispositivos implementavam apenas o INTA e, passando por swizzling, ou seja, três dispositivos, cada um terminava com seu próprio sinal de interrupção no controlador de interrupção. O MSI é simplesmente uma maneira de sinalizar interrupções usando a camada de protocolo PCI Express, e o complexo raiz PCIe (o host) cuida da interrupção da CPU.

Essa resposta pode ser tarde demais para ajudá-lo, mas talvez ajude alguns futuros Googler / Binger.

Por fim, recomendo a leitura deste livro da Intel para obter uma boa introdução detalhada ao PCIe antes de prosseguir. Outra referência seria o Linux Device Drivers, um ebook online da LWN .

Krunal Desai
fonte
O Post foi bastante útil. Eu sou muito novo no PCIe. Para que ocorra o processo de enumeração (alocação e mapeamento de espaço de configuração), precisamos de suporte de driver ou ele pode ser iniciado pelo sistema operacional.
kamlendra
Obrigado, feliz por ter sido útil! Geralmente, em plataformas x86, o software BIOS faz uma certa quantidade de alocação de memória com base nas informações do espaço de configuração que analisa nos dispositivos PCI. Os SOs modernos geralmente aceitam esse mapa de memória como está, AFAIK, embora eles também passem e enumere dispositivos para carregar os drivers apropriados. Lembro-me de ver algumas coisas interessantes de baixo nível no Linux que podem permitir que você potencialmente altere o que o BIOS havia designado.
Krunal Desai 26/03
Observe que apenas a memória marcada como pré-buscável pode transferir mais de um único DWORD por transação; todos os outros espaços podem transferir apenas um único DWORD por transação. O tamanho de uma explosão é limitado a MAX_PAYLOAD_SIZE (descoberto durante a enumeração).
Peter Smith
Olá. Eu sou novo no PCI e gostaria de um pouco de esclarecimento sobre sua resposta. Você declarou que os 256b / 4k bytes de espaço de configuração são mapeados na memória do sistema. Do meu auto-tutoria, eu pensei que o acesso ao espaço de configuração é tratado através de um controlador PCI que é mapeado estaticamente na memória do sistema. Este controlador fornece alguns registros (para identificação de dispositivo / função, deslocados para o espaço de endereço, endereço de resultado) que servem como uma pequena interface para o espaço de configuração. Portanto, apenas 5 a 10 bytes são estaticamente reservados para o controlador PCI. Isto está certo ???
Cerezo
Portanto, quando o host (CPU) gravar em um registro no endereço 0x10000004 com o valor 0xFF, o complexo raiz PCI buscará esses dados (talvez esteja sempre pesquisando dados em qualquer endereço de 0x10000000 a 0x10100000) e gravará no endereço 0x04 no terminal (dispositivo PCIe)? Esse entendimento está correto?
AlphaGoku 25/11