Aqui estão os problemas com ROMs de opção PCI na arquitetura ARM:
- Uma opção ROM gravada no assembly x86 não será compreensível por uma CPU ARM.
- As ROMs opcionais que devem ser executadas por BIOS do PC (como ROMs começam com
0x55AA
e têm alguns bytes para soma de verificação e informações adicionais) assumirão detalhes de baixo nível da arquitetura do PC, como hardware VGA, CPU Intel I / Portas O, etc. - Todo o conceito do BIOS estava strongmente ligado à CPU do x86 e à arquitetura do PC e nunca foi usado em nenhum sistema ARM.
Agora ...
-
UEFI, o sucessor de BIOSes deve ser usado em CPUs diferentes de x86.
-
A solução para os problemas acima foi código de bytes EFI - um bytecode que seria interpretado por um tempo de execução na UEFI, tornando o código independente da CPU.
-
Sistemas ARM usando UEFI são relativamente novos (o Surface RT pode até ser o único sistema desse tipo). A maioria dos sistemas ARM usa CFE, U-Boot ou outro firmware de inicialização que não funciona como BIOS de PC.
Now, if I plug it in a ARM machine, would the PCIe device failed to initialize?
Você nem teria uma chance a menos que o sistema ARM estivesse usando o UEFI. Se fosse, seu sistema provavelmente iria travar na inicialização. O EBC não é amplamente usado no firmware da ROM de inicialização.
Embora a ROM de inicialização não funcione, um sistema operacional que inicializa mais tarde ainda reconheceria e seria capaz de usar o hardware muito bem.
O que faz uma ROM de inicialização?
O antigo BIOS pré-UEFI implementou uma API através do mecanismo de interrupção x86. Seu programa teria que configurar vários registradores x86 como parâmetros e depois emitir uma instrução x86 INT
.
INT
faz com que a CPU x86 procure um endereço em uma tabela e, em seguida, transfere o controle para ela (isso é chamado de interrupção de software - o hardware pode causar isso ao falar com um controlador de interrupção também conectado à CPU).
Antes de processar as opções de ROM, o BIOS preenche esta tabela com vários endereços que retornam ao BIOS e executam funções da API.
O MS-DOS usa a tabela extensivamente, confiando no BIOS para sua função original - B I entrada / O utput S sistema. Outros sistemas operacionais não usam chamadas de BIOS depois de controlarem, eles usam seus próprios drivers e mecanismos para ativar o hardware.
Como essa tabela de interrupções está na RAM, ela pode ser modificada. As ROMs opcionais podem "enganchar" na tabela de interrupções - sobrescrevendo o endereço de uma interrupção específica para algo na ROM - e fazer com que as chamadas da API do BIOS passem para a opção ROM primeiro.
Uma chamada de API do BIOS que o BIOS usa por si só é 13h
- essa chamada lê um setor de um dispositivo de disco. É necessário para carregar setor 0 fora de um disco rígido para inicializar um sistema operacional (mesmo MS-DOS).
O BIOS sabe como falar com disquetes e dispositivos IDE, mas nada mais. Uma placa SCSI teria uma opção de ROM que iria reescrever ou "enganchar" 13h
- e que tornou possível a inicialização de uma unidade SCSI. Se o sistema operacional for o MS-DOS, o MS-DOS poderá funcionar com a unidade SCSI, já que usaria 13h
para operações de disco.
A inicialização via rede é outra situação em que as ROMs opcionais são usadas.
If so, is it possible that the drivers could be designed to take care of this instead?
Sim, e eles fazem. As ROMs de opções do BIOS realmente suportam apenas um sistema operacional e, opcionalmente, um menu de configuração (o "Pressione Ctrl-A para entrar na configuração RAID" é da Option ROM e você o vê no ponto em que o BIOS chama seu código de inicialização).
IIRC Linux takes care of enumerating devices again, and will pretty much ignore information from the x86 BIOS
O Windows também faz isso. O BIOS x86 (e o modo real x86) ficou suspenso, desde que fosse compatível com o MS-DOS.