Autoria: Rafael Gomes Nogueira
WINDOWS NT
O Sistema Operacional da Microsoft
Windows NT, o sistema operacional da Microsoft, deu o seu pontapé inicial em novembro de 1989, em uma recém lançada CPU Risc, e ostentando uma interface de futura geração. A CPU era o processador 860 da Intel e a interface era o OS/2 da IBM. Mais tarde, a Microsoft voltou-se ao Mips R4000, juntamente com as CPUs uni e multiprocessadoras 80×86 da Intel e, é claro, para o Windows.
Graças a um planejamento cuidadoso, o NT é um camaleão. Inspirado no Macintosh, seu microkernel adapta-se prontamente a qualquer CPU e hospeda vários sistemas operacionais estendidos em camadas: DOS para 16 e 32 bits, Windows de 16 bits, OS/2 de 16 bits (apenas no modo caracter e 80×86), Posix e um híbrido Windows-OS/2 de 32 bits (ver figura).
Rodando em um uniprocessador ou em um multiprocessador, em sistema Cisc ou Risc, o kernel do NT tem a mesma visão do hardware subjacente graças a um abstrato chamado HAL (hardware abstraction layer – camada de abstração de hardware). Há um HAL para sistemas uniprocessados 386/486 com bus de AT e outro para uniprocessados R4000. Fabricantes de sistemas inovadores devem escrever HALs para dar suporte ao NT em seus sistemas. A NCR produziu dois: um para o processador quádruplo 3450 e um para o sistema de oito processadores 3550. A Compaq escreveu uma HAL para o processador dual Systempro e a Wise possui uma para o processador triplo 7000i. A HAL faz o sistema de bus, a controladora DMA (direct memory access – Acesso direto à Memória), o controlador de interrupção, os sistemas temporizadores e modelo de memória de cada máquina parecer como os do núcleo. Também libera o suporte necessário para o SMP (multiprocessamento simétrico) do Windows NT.
A HAL, entretanto, não faz mágicas. O sistema SMP exige que os processadores tenham conjuntos de instruções, visões de memória física e acesso a dispositivos todos idênticos. Além disso, o hardware deve fornecer coerência de cache e os processadores têm de ser capazes de se interromperem mutuamente. A HAL não pode criar simetria fora de um conjunto assimétrico de partes.
O kernel, ancorado no topo da HAL, gerencia mudanças de arranjo e de contexto, suporte de exceção e interrupção e sincronização de multiprocessador. Não é paginável ou sujeito a preempção.
A arquitetura baseada em objeto, a marca de qualidade do NT, deriva do kernel, que oferece duas classes de objetos primitivos. Objetos escalonadores como, por exemplo, indicadores (threads), eventos, semáforos (mutex e temporizadores), mantendo um estado de sinal, suporte escalonado e atividades de sincronização. Objetos de controle (processos, interrupções e dispositivos de fila) carregam estruturas de dados usadas por controladores de dispositivos e o executivo NT, que é a interface para subsistemas do modo usuário como o Win32.
O kernel reserva alguns desses objetos para uso interno e exporta outros (processos, indicadores, eventos e semáforos) para o executivo, que os empacota em metade do subsistema do modo usuário. Quando um programa do Win32 pede ao executivo para criar um desses objetos, o executivo encapsula o novo objeto que recebeu do kernel – por exemplo, atribuindo-lhe nome e descritor de segurança.
O kernel mantém estruturas de dados que suportem escalonamento, tais como uma fila de indicadores que estejam prontos para rodar e uma matriz que descreva indicadores em execução e suas prioridades. No sistema SMP de n-processadores, o kernel garante que os n maiores, indicadores de prioridade, serão executados.
O escalonamento do NT é dirigido por evento. Quando algo interessante acontece a um indicador de usuário (mensagem ou notificação de que uma operação assíncrona de entrada e saída terminou), sua base de prioridade recebe um impulso temporário e, então, reestabelece gradualmente seu estado normal. Este mecanismo ajuda o NT a acomodar as demandas imprevisíveis colocadas pelos usuários e pelos dispositivos. Nos períodos de tranqüilidade, o kernel cria eventos artificiais para manter as coisas animadas. Quando transfere (preempts) um indicador para rodá-lo com maior prioridade, atribui o indicador pronto a qualquer processador disponível, embora favoreça a CPU na qual o indicador rodou por último, no caso do cache secundário da CPU conter dados ainda válidos para esse indicador.
O executivo coloca à disposição um cardápio de serviços básicos comuns a todas as emulações de sistemas operacionais depositadas em seu topo. Isto inclui segurança, gerenciamento de memória, entrada e saída, sistemas de arquivos e IPC (comunicações interprocessos). Como o kernel, o executivo roda com prerrogativa supervisora. Ao contrário do kernel, ele é multi-indicativo e preemptível. O NT atinge um paralelismo substancial em máquinas SMP, mesmo quando está executando aplicativos monoindicadores, porque o trabalho de suporte a esses aplicativos se dissemina, de forma equilibrada, por todos os processadores disponíveis.
*
A HAL, o kernel e o executivo rodam no modo supervisor. Os subsistemas de emulação de sistema operacional, entretanto, rodam no modo usuário. Cada um desses “ambientes servidores” (Win32, Os/2 e Posix) tem seu próprio espaço de endereçamento privado e protegido. O aplicativo Win32 é um cliente em relação ao subsistema Win32 e deve fiar-se no IPC para usar seus serviços. O Win32, em contrapartida, mantém uma relação cliente-servidor com o executivo do NT. O Windows 3.x agrupa seus serviços em três módulos: GDI (gráfico) Kernel (suporte geral) e User (janela de gerenciamento). O NT preserva esse arranjo, mas divide os módulos em lado-do-cliente-DLLs (que mapeia no espaço de endereçamento dos aplicativos Win32) e lado-do-servidor-DLLs (que roda em seus próprios espaços de endereçamento). O lado cliente do módulo User permite que as aplicações acionem funções API (CreateWindow). Mas o lado servidor desse módulo implementa a função. Essa implementação se baseia nos serviços do executivo (gerenciamento de memória e segurança). Como a janela é um dos objetos aos quais o NT agrega segurança, a chamada CreateWindow chamará, no final das contas, o gerenciador de objetos e o subsistema de segurança do executivo.
Hardware suportado
As plataformas inicialmente suportadas pelo NT são Intel, mono ou multiprocessada; Risc; e o chip Alpha, da Digital. O sistema já está rodando em máquinas com até quatro chips 486. Ele, porém, não suporta o MPA (Multiprocessamento assimétrico), em que cada chip se especializa em alguns tipos de threads. No MPS (simétrico) todos os processadores executam qualquer thread.
A compatibilidade nas variadas arquiteturas
Na verdade, para atender a arquiteturas diferentes, como Risc, Intel e o Alpha (o chip da Digital, de 64 bits), há mais de um tipo de NT. Mas segundo a Microsoft, as aplicações podem ser migradas entre plataformas com relativa facilidade. As rotinas ligadas ao código do processador são diferentes em cada kernel, mas o código de alto nível é mantido. Ou seja, a compatibilidade com diferentes tipos de processadores é implementada no HAL (que faz o controle de interrupções, DMA, clock, timers, etc.) e os drivers do NT não precisam de modificações em função da arquitetura. Nas aplicações já escritas para o Win32, basta recompilar (com o NT SDK – Software Development Kit). Os programas feitos para DOS ou Windows de 16 bits rodam em qualquer plataforma, graças a uma camada de emulação de chip Intel x86.
O acesso ao hardware pelas aplicações
Resumindo, o NT se coloca como uma camada entre o hardware e os subsistemas operacionais. O kernel, que é o coração de qualquer sistema operacional, assume o controle exclusivo da máquina e sobre ele trabalham os subsistemas (Win32, Posix, OS/2, DOS e Windows 3.x). Quando uma aplicação de qualquer um desses ambientes pede para acessar o hardware, ela vai a seu sistema nativo, que em circunstâncias convencionais seria o gestor do procedimento da máquina. Mas, numa estação NT, as mensagens do Unix, do OS/2 ou do DOS são recebidas pela camada NT Executive, que determina, segundo deus próprios critérios operacionais, a forma e o momento de acesso ao hardware.