1

A20 - Um Sofrimento do Passado

Willams Sousa
Willams Sousa

[Escrevi esse texto em meados de 2008, é um trecho de um tutorial sobre desenvolvimento de sistemas operacionais. De repente alguém ache curioso ou interessante ainda hoje.]




O título desta seção foi (usurpado) emprestado de um artigo chamado “A20 – a pain from the past”. Achei engraçado, então decidi (roubar) usar. Vejamos porque A20 foi um sofrimento.


(Nota: é apenas uma história, caso queira agilizar um pouco as coisas, salte diretamente pra seção “Ativando A20 – INT 15,2401”)


A20 é o termo usado para denominar a vigésima primeira linha (21ª) do barramento de endereços. A história foi mais ou menos assim.


Os processadores mais antigos (ex. 8088, 8086, 80186) tinha um barramento de endereços de 20 linhas numeradas de A0 até A19. Esses bits combinados só podem transportar endereços de 0 até 0xFFFFF, isto é, a maior quantidade de memória endereçável nestas máquinas era 1MB. O endereçamento nesses processadores eram feitos com a utilização de dois registradores de 16 bits onde um deles indicava o segmento, cujo tamanho era fixo (64K), e o outro indicava um determinado endereço dentro do segmento selecionado. A mágica acontece (no presente, pois isso ainda existe) porque o valor no registrador de segmento é multiplicado por 16 e o resultado é somado ao valor do segundo registrador. A fórmula desse mecanismo é bem simples: segmento * 16 + deslocamento = endereço físico. Sem entrar em muitos detalhes sobre isso, pois não é minha intenção falar do Modo Real, podemos concluir que ao colocar o valor 0xF800 no segmento e o valor 0x7FFF no deslocamento chegaremos ao endereço 0xFFFFF que é o limite máximo do barramento de endereços. No entanto, adicionando 1 ao deslocamento (0x7FFF + 1 = 0x8000) teríamos: 0xF800 * 16 + 0x8000 = 0x100000. Este endereço é perfeitamente válido para o processador, mas infelizmente este endereço (0x100000) não cabe em apenas 20 bits (A0 até A19), exigindo, desta forma, uma nova linha. Como a A20 não existia, o processador apenas ignorava e entendia o endereço como 0x00000. Este comportamento é conhecido como “wrap around”.


Com o advento dos processadores 80286, cuja capacidade de endereçamento eram incríveis 16MB, esta limitação já não existia. Isso parecia algo bom, pois agora não seria mais necessário o tal do “wrap”. O problema é que aparentemente o pessoal do DOS andou abusando desse recurso de “wrap” das CPU 8086 em seus programas. Caso a A20 fosse liberada, todos os programas que dependessem do “wrap” iam falhar miseravelmente. Com isso, a IBM decidiu colocar uma porta lógica (conhecida como Gate-A20) entre o processador e o barramento. Esta porta lógica permitira ligar ou desligar a Gate-A20 via software. Interessante (gambiarra) o suficiente, esta porta lógica foi conectada na controladora do teclado (Intel 8042). O resultado disso é que temos uma porta lógica em um chip do teclado que ativa/desativa uma linha no barramento de endereços que permite ao processador “enxergar” ou não mais que 1MB de memória. Ficou meio zoado hehe!


Até aqui parece que isso não tem nada a ver com a gente – programadores de sistemas de 32 bits com endereçamento de até 4GB de memória. Acontece que o padrão desta tal porta lógica é desativado, isto é, todo processador compatível com x86 inicia no Modo Real e, consequentemente, com a Gate-A20 desligada. Cabe ao desenvolvedor ativar. Porém, não se engane, você TEM que ativar, pois mesmo um poderoso i7 da Intel ainda vai “enxergar” apenas 1MB de memória. Mesmo que você ative o modo protegido, a limitação dos 1MB de memória vai atormentar você da mesma forma que veio atormentando o pessoal do DOS por décadas. Daí a pergunta que fica é: como que ativa esse troço?


Existem, hoje em dia, diversas maneiras para ativar a Gate-A20. Não sei se existe um método que funcione 100% das vezes em 100% dos PC. Mas se você não quer criar um driver de teclado (exagerei!) só pra ativar a bendita Gate-A20, utilize o método da seção a seguir.


Ativando A20 – INT 15,2401


Ativar A20 usando esta INT estendida da BIOS é brincadeira de criança:


MOV AX, 0x2401

INT 0x15 ; CF=1 quando falhar. Use JC se quiser capturar este erro.


0
57

Comentários (0)

Tento ser um sujeito legal e gosto de aprender linguagens de programação.

Brasil