A salada de HALs no Windows

HAL (Hardware Abstraction Layer) é um módulo do kernel NT que faz a abstração de hardware entre plataformas diferentes e recursos específicos de hardware (controlador de interrupções, interfaces de E/S, etc.). Componentes internos do Windows e drivers de dispositivo são programados usando rotinas do HAL, que mantém uniformidade entre hardware e plataformas diferentes. Desde seu planejamento, o Windows NT teve como um de seus objetivos ser um sistema operacional portável, que pudesse ser adaptado a novas arquiteturas à medida que o mercado demandasse.

Até o Windows XP/Server 2003, o HAL correto era copiado na hora da instalação de acordo com o hardware (sempre chamando-se Hal.dll no sistema alvo). Uma posterior mudança de hardware que porventura não fosse compatível fazia o Windows não iniciar mais. Era necessário no mínimo reparar o sistema.

WINDOWS 2000/XP/2003 (FAMÍLIA NT 5.x)

Os seguintes principais HALs estão disponíveis (\Windows\Driver Cache\i386\Driver.cab):
(existem outros)

Hal.dll         PC padrão
Halacpi.dll     Interface de energia e configuração avançada (ACPI) PC
Halaacpi.dll    ACPI Uniprocessor PC
Halmacpi.dll    ACPI Multiprocessor PC

Tradução:

PC padrão → Máquinas monoprocessadas sem ACPI e APIC (velharias como PC-Chips M598LMR e coisas do tipo).
Interface de energia e configuração avançada (ACPI) PC → Máquinas monoprocessadas com ACPI porém sem APIC (velharias como PC-Chips M810LMR e similares, ou placas mais modernas com APIC desativado no setup).
ACPI Uniprocessor PC → Máquinas monoprocessadas com ACPI e APIC.
ACPI Multiprocessor PC → Máquinas multiprocessadas com ACPI e APIC.

Se removermos o hardware caduco, sobram dois HALs: ACPI Uniprocessor PC e ACPI Multiprocessor PC.

O Sysprep nos permite preparar uma imagem pré-configurada que auto-detecta o hardware na próxima inicialização (Mini-Setup). A ferramenta pode ser configurada para substituir o HAL durante o Mini-Setup. Em teoria, o HAL ACPI Multiprocessor PC funciona em máquinas monoprocessadas (com alguma perda de desempenho) — o contrário nem inicia. Não é oferecido suporte por parte da Microsoft a instalações cujo HAL não corresponda ao que seria escolhido durante uma instalação normal.

A documentação diz que, quando a instalação de origem usa o HAL ACPI Multiprocessor PC (ou seja, feita num sistema multiprocessado), se você mandar o Sysprep substitui-lo pelo ACPI Uniprocessor PC, ele o fará apenas quando a máquina de destino for monoprocessada; caso contrário, manterá o HAL original — no caminho inverso o HAL sempre é trocado. Resolve todos os problemas, certo? Não. Pois não funciona sempre. Eu tive vários problemas de máquinas que não inicializaram neste cenário. No final, você é obrigado a manter duas imagens, uma para máquinas monoprocessadas e outra para multiprocessadas. E mais: fazer a imagem base numa máquina monoprocessada (se necessário, desativar o suporte a multiprocessamento temporariamente no setup) para que a deficiente lógica de substituição sob demanda do Sysprep não entre em ação.

Opções relevantes do sysprep.inf:

; Muda HAL para o ACPI Multiprocessor PC
UpdateHAL=ACPIAPIC_MP,%WINDIR%\inf\hal.inf

; Muda HAL para o ACPI Uniprocessor PC
UpdateUPHAL=ACPIAPIC_UP,%WINDIR%\inf\hal.inf

A MODERNIDADE (FAMÍLIA NT 6.x)

Toda essa problemática foi resolvida a partir do Windows Vista/Server 2008.

A partir deles a lista de HALs foi enxugada. Existem apenas dois na versão x86-32. O Halacpi.dll continua sendo o HAL para cacarecos monoprocessados sem APIC. A novidade é um HAL Halmacpi.dll unificado com suporte para máquinas mono e multiprocessadas. Indo além, o sistema passou a ser capaz de mudar automaticamente o HAL na inicialização de acordo com o hardware.

Na versão x86-64, existe apenas um HAL: o Halmacpi.dll. É obrigatória a presença de ACPI e APIC na arquitetura x86-64.

Quem usa o Sysprep a partir do Vista/Server 2008 não mais precisa se preocupar com a salada de HALs. \o/

Comentários

Postar um comentário