Com relação aos comandos INTh que você faz referência (consulte: BIOS Interrupt Calls ), você está certo de que isso era verdade a maneira como um sistema operacional acessaria o hardware de baixo nível. Em uma máquina moderna, essas chamadas (se executadas) geralmente acabam no CSM (Módulo de Compatibilidade Compatível, pelo menos no jargão da AMI) que pode lidar com essas solicitações. No exemplo de uma chamada de BIOS de vídeo, isso executaria o código no BIOS de vídeo, se presente. Eu trabalhei com o IGP da Intel como desenvolvedor de BIOS, e como parte da imagem final, nós tivemos uma ferramenta da Intel onde colocamos o BIOS de vídeo deles como um blob.
Da mesma forma, o BIOS pode implementar versões "emuladas" de chamadas para ler / definir o RTC. Um sistema operacional moderno simplesmente não executará todos esses manipuladores legados, já que não precisa se apoiar na BIOS para esse suporte - por exemplo, pode haver um driver de kernel que saiba como falar diretamente com o seu PCH para mexer com o sistema operacional. Configurações RTC.
Como você pode imaginar, isso é muito, muito lento e não é mais usado pelo software moderno. Em vez disso, o sistema operacional possui a propriedade de hardware necessária para fornecer uma camada de abstração que permite que os aplicativos gráficos utilizem os drivers da GPU para executar essas tarefas; esse dispositivo, é claro, geralmente é PCIe de um POV SW e é mapeado pela memória.
Da mesma forma, se você olhar a pilha de armazenamento do Linux abaixo, verá que as unidades de kernel subjacentes cuidam de falar com o hardware, sem usar a BIOS - todo o código executado é do seu kernel.
Agora, com relação a diferentes mapas de endereços de E / S, lembre-se de que x86 possui espaço de endereço de E / S e espaço de endereço de memória. Se você se lembrar de Plug-and-Play, na inicialização, seu BIOS passará e enumerará a árvore de Dispositivos PCI, que para sistemas modernos, basicamente abrange todos os seus periféricos, pelo menos a partir de um SW POV (ou seja, o controlador DRAM PCIe Bus 0, seus controladores USB são dispositivos PCI de um PO PO, etc.). Usando as BARs (Base Address Registers), o BIOS sabe quanta memória e de que tipo o dispositivo de destino quer, e fará o melhor para acomodar o pedido.
O mapeamento final é passado para o SO no hand-off, e ele pode escolher respeitar isso, ou fazer sua própria fase de enumeração. O Linux, por exemplo, tem 'peculiaridades' que você pode aplicar a determinadas IDs de dispositivos PCI antes do sistema operacional ter sido inicializado, e você pode se lembrar dos parâmetros de inicialização do kernel que podem afetar a quantidade de memória alocada, quais IRQs acabam com etc. .