PCs são a pior arquitetura possível…

… especialmente para desenvolvimento de sistemas operacionais. Essa afirmação pode ser surpreendente para o usuário comum, mas é a mais pura realidade! Considere que existem “trocentos” fabricantes diferentes de hardware, usando componentes específicos para seus próprios hardwares e, muitas vezes, com pequenos tweaks na ROM-BIOS: Dell, HP, LeNovo, IBM, Intel, Asus, Gigabyte, Biostar, Micro-Star, AOpen, Abit… Sem contar com fabricantes de dispositivos como HDs: IBM, Seagate, Western Digital, Maxtor (se é que algum desses ainda existe por ai); Placas de vídeo: ATI, nVidia, Asus, EVGA, Creative Labs, …; Placas e chipsets de Audio: Creative Labs, Yamaha, Intel, …; Não vou nem falar de chips controladores aqui para não cansar o leitor…

Existem padrões, é claro, mas eles costumam ser “corrompidos” de tempos em tempos. Por exemplo: A espeficação do bootstrap do PC nos diz que o primeiro setor de um disco é carregado para o endereço físico (em 16 bits) 0x0000:0x7C00 e o registrador DL contém o número do drive… Em algumas BIOS o endereço é 0x07C0:0x0000 e/ou DH contém lixo… Além disso, deve-se levar em consideração, hoje, o padrão UEFI, que executa um programinha com header Mark Zbikowski (O antigo .EXE do MS-DOS), junto com um header Portable Executable (“PE”), usado pelo Win32.

Do ponto de vista de software, o hardware não ajuda muito, pois com tanta diversidade eles tendem a ser diferentes. Tomemos o exemplo da compatibilidade retroativa com os antigos PC-ATs baseados no processador 80286… O barramento de endereços desses antigos processadores tinha 20 bits de tamanho e era impossível acessar mais que 1 MiB de memória física. Com o surgimento dos 386s, em meados dos anos 80, o barramento de endereços passou a ter 32 bits de tamanho, mas a IBM achou por bem restringi-lo a 20 bits no modo real… Surge a noção do “gate A20“. Mesmo em nossas máquinas com processadores i7, capazes de endereçar até 4 PiB (4, seguido de quinze zeros, aproximadamente), no modo real você ainda não pode endereçar mais que 1 MiB… Mesmo que sistemas como MS-DOS estejam, na prática, mortos a quase 20 anos. O motivo é que esse sinal, “gate A20” mascara os bits superiores de um endereço físico… Precisamos “habilitar” os bits superiores para acessarmos toda a capacidade de memória da máquina!

De novo, embora existam maneiras padronizadas para ajustar o gate A20, elas não são homogêneas de arquitetura para arquitetura. Inicialmente o ajuste era feito através do lugar menos provável: Via controlador de teclado! Depois, separaram um bit numa porta específica (porta 0x92), no padrão ISA, para ligar/desligar o “fast gate A20“. Isso porque o chip 8042 é lento por natureza (não há motivos para que um controlador de teclado seja rápido!). Finalmente criaram serviços da BIOS que fazem a mágica por nós, que não estão disponíveis em todas as BIOS. Exemplos disso são os serviços 0x88 (Get Extended Memory Size) e 0xE801 (Get Extended Memory Size for Large Configurations) da interrupção por software 0x15 que, nas máquinas modernas, tendem a retornar com o flag CF setado (erro). Ainda, o serviço 0xE820 (Query System Address Map) não está presente em máquinas mais antigas, que usam o antigo 486 ou processador inferior.

Além do gate A20 temos outros exemplos de padrões “despadronizados”… Seu PC tem um chipset (um conjunto de circuitos integrados) que realizam tarefas específicas: Controlador de teclado, timer, disco, portas seriais, portas paralelas, etc… Muitos desses “chips” estão, hoje em dia, amalgamados num único chip chamado I/O Controller Hub (ou ICH, para os íntimos)… Mas, o ICH é proprietário da Intel, existem outros Hubs, de outros fabricantes, com características específicas. O desenvolvedor de sistemas operacionais e BIOS devem levar isso em consideração. O ICH não é o único “hub” da Intel… Temos PCHs (Peripheral Controller Hubs), GCHs (Graphical Controller Hubs) e MCHs (Memory Controller Hubs)…

Em resumo… Um PC é um ambiente bastante hostil para o desenvolvedor em baixo nível, mas, infelizmente, é o “padrão despadronizado” adotado pela indústria e pelos usuários. Para garantir que seu OS funcione numa grande quantidade de PCs é necessário criar códigos redundantes que façam, antes, testes sobre as idiossincrasias de cada arquitetura pretendida ou então, que tenha como alvo uma arquitetura específica (mas que leve em conta os diversos fabricantes).

Anúncios