Eu li em algum lugar que a enumeração PCI (encontrando o barramento e o dispositivo, funções) é feita pelo BIOS no sistema x86. (Hoje eu vi novamente em um documento da web coreano: https://melonicedlatte.com/computerarchitecture/2019/11/27 /234300.html ). Então e o sistema baseado em arm64? Eu encontrei em https://patchwork.kernel.org/project/linux-pci/patch/[email protected]/ arm64 usa UEFI para inicialização de PCIe e também encontrei u -boot suporta PCIe para arm64. Então, se eu não usar o firmware UEFI e usar o u-boot e não fizer nada sobre o PCIe durante o u-boot, o sistema operacional (linux) fará a enumeração? (é claro que eu configuro o linux para PCI e meu controlador PCIe).
relate perguntas
-
É possível conectar o adaptador sem fio Mini PCIe ao laptop por ExressCard?
-
Qual é a relação entre o relógio da NIC e o barramento PCIe 2.0?
-
Como posso consultar o PCI MaxPayloadSize que foi negociado na inicialização?
-
lsusb lista dispositivos em diferentes controladores PCI no mesmo hub USB
-
Configurando uma placa serial PCIe que não parece possuir portas de E/S
Muito para descompactar aqui:
PCI não é o mesmo que PCIe. O resto da pergunta é sobre PCIe, então vou assumir que se trata de PCIe, não PCI.
PCIe estritamente falando não tem enumeração. Porque não é um barramento, mas uma rede de links ponto a ponto, com pontes (em uma rede de computadores, você chamaria esses switches de rede ). Em nenhum ponto qualquer ponto da rede precisa conhecer a rede completa para funcionar per se. Não há ônibus , portanto não há enumeração de ônibus .
Haverá a necessidade de que o sistema operacional saiba quais dispositivos estão lá. Isso é possível consultando o complexo raiz para todos os dispositivos conectados a jusante, e cada um deles é uma ponte para todos os dispositivos conectados a jusante.
Tudo isso pode ser feito pelo sistema operacional, pode (ao contrário do PCI, normalmente) ser feito a qualquer momento sem danos e, portanto, o próprio sistema operacional faz isso. O que ele faz é, na verdade, configurar o hardware encontrado, fornecer regiões mapeadas em memória e assim por diante. O Linux fará esse tipo de enumeração.
Existe uma exceção: dispositivos necessários para inicializar (ou seja, interfaces de rede, NVMe, controladores gráficos...), que o firmware precisa até mesmo para executar o sistema operacional. Obviamente, estes precisam ser encontrados primeiro. Portanto: o firmware da sua placa também pode fazer isso .
Isso não tem nada a ver com a arquitetura da sua CPU - só precisa ser feito, não importa se você está no x86 ou no braço. Em alguns dispositivos, o que geralmente chamamos de "incorporados", você pode escrever ou configurar seu firmware para que ele não precise tentar descobrir quais dispositivos estão onde. Ele ainda precisa conversar e configurar os dispositivos. Então, mesma história: enumeração "não-rede completa", mas uma enumeração dos dispositivos pré-configurados.
"BIOS" é uma API para o firmware do seu sistema. O firmware real pode fazer alguma inicialização, mas a parte "BIOS" é anterior ao PCIe; não está envolvido com isso.
"UEFI" é apenas mais uma API. Mais moderno.
O que exatamente é "inicialização PCIe"? Você precisa ser muito preciso aqui.
Novamente, o ARM64 não tem nada a ver com o fato de você ter PCIe ou como seu firmware irá interagir com o PCIe. Simplesmente coisas diferentes. Você pode ter uma arquitetura de computador e firmware muito parecido com um PC com um ARM, ou PowerPC ou… CPU, e você pode ter uma arquitetura muito diferente de PC com x86 dentro.
Além disso, UEFI pode ser qualquer coisa ; o nome diz literalmente "interface de firmware extensível". Existem módulos UEFI que oferecem um servidor web completo! É claro que eles precisam de outros módulos UEFI para oferecer uma pilha TCP/IP, e eles precisam de um driver de interface de rede, e isso precisará fazer um pouco de enumeração PCIe para encontrar e conversar com a interface de rede.
No entanto, você também pode criar um UEFI que não contenha essas coisas e, portanto, não precisará fazer a enumeração PCIe.
MAS: de alguma forma, em algum lugar, você precisará carregar seu software bootloader/sistema operacional. Em muitos computadores, o dispositivo de armazenamento que o contém só é acessível via PCIe. Então, algum tipo de configuração precisa acontecer.
Em outros, por exemplo, x86 SoC embutido ou algum ARM SoC, o bootloader está em alguns eMMC e isso é mais ou menos diretamente conectado à CPU. Tudo depende do design do seu computador!
A arquitetura da CPU tem pouco a ver com o design da interface periférica. Estas são simplesmente coisas separadas.
Por exemplo, o Playstation 4 é x86 e tem PCIe, mas não é um PC e não tenta ter BIOS, o hardware não tem timer compatível com PC ou controlador de interrupção.
Como o nome UEF Interface sugere, UEFI é apenas a API de software que seu firmware oferece (ou não oferece). Isso tem pouco a ver com o que faz internamente ao hardware.