Por que os dispositivos PCI compartilham o mesmo espaço de endereço?

Por que os dispositivos PCI compartilham o mesmo espaço de endereço?

Quando um computador é inicializado, o BIOS ou sistema operacional examina cada dispositivo PCI para perguntar quanto espaço de endereço ele deseja. Em seguida, ele aloca o espaço apropriado e informa a cada dispositivo PCI onde começa seu espaço, para que o dispositivo PCI possa responder às solicitações de leitura e gravação dentro desse intervalo.

Minha pergunta é por que todos os dispositivos precisam ser alocados em blocos do mesmo espaço de endereço. Por que não dar a cada dispositivo um espaço de endereço próprio?

Na placa de circuito impresso já existe uma forma “out-of-band” de discriminar dispositivos PCI: a linha IDSEL. Isto é o que é usado durante a enumeração PCI, antes de cada dispositivo ter seu espaço alocado. Então, por que não usar isso também para acessos pós-enumeração e salvar alguma lógica de decodificação no dispositivo PCI? Isso teria sido de alguma forma mais lento ou algo assim?

Responder1

Como regra geral, eles nãoprecisarpara compartilhar o mesmo espaço de endereço. Separar os espaços de endereço do dispositivo é exatamente a finalidade de um IOMMU e pode ser útil por vários motivos:

  • Ele pode permitir com segurança que uma máquina virtual acesse diretamente o hardware físico com drivers nativos.
  • Ele desacopla as capacidades de endereçamento do dispositivo do espaço de endereço físico. Em outras palavras, permite que dispositivos que só podem fazer endereçamento de 32 bits acessem dados em qualquer lugar da memória física, mesmo acima do primeiro 4G.
  • Ele permite isolar os dispositivos uns dos outros de forma mais completa, o que pode melhorar significativamente a segurança do sistema.

Quanto ao motivo pelo qual esse não é o comportamento padrão e por que a linha IDSEL não é usada para isso, não posso dizer, pois não tenho muito conhecimento da história dos designs PCI. Meu primeiro palpite seria que originalmente era assim que era mais fácil portar drivers de placas ISA para PCI (o ISA assume um espaço de endereço compartilhado simples). Além disso, os IOMMUs não são exatamente o hardware mais fácil de projetar e só recentemente se tornaram amplamente disponíveis em plataformas x86 (e ainda não são garantidos, muitos chips Intel ainda não os possuem e muitos chips AMD de baixo custo também não).

Pode valer a pena ressaltar que, com o PCI Express, há na verdade uma vantagem em compartilhar espaço de endereço entre dispositivos, ou seja, permite fazer transferências de dispositivo para dispositivo (embora a maioria das plataformas não suporte isso adequadamente), o que pode ser muito útil em grandes configurações de rede que usam RDMA (você pode obter dados diretamente de dispositivos remotos, sem precisar que o sistema operacional do sistema remoto faça a mediação depois que a transferência for configurada).

Responder2

Para sistemas x86, a própria CPU só pode acessar dois espaços de endereço: o espaço de endereço de memória normal e o espaço de endereço IO. Outros sistemas podem ter apenas um espaço de endereço (por exemplo, ARM, powerpc, etc.). Esses dois espaços de endereço são separados do ponto de vista dos dispositivos PCI - comandos diferentes são usados ​​para acessar cada espaço de endereço e as pontes possuem registros de configuração separados para cada espaço de endereço. Entretanto, como a CPU só pode acessar esses dois espaços de endereço, todos os dispositivos conectados devem ser mapeados para esses dois espaços de endereço. Portanto, não é tanto uma limitação do PCI, mas uma limitação da arquitetura do resto do sistema.

Devo também mencionar que quando o PCI foi desenvolvido, não existia IOMMU, que é uma adição relativamente recente.

informação relacionada