Oficina
1. Introdução
Qui 24 Mai 2007 19:33 |
- Detalhes
- Categoria: Sistemas Operacionais
- Atualização: Terça, 21 Abril 2009 19:56
- Autor: vovó Vicki
- Acessos: 34240
MÓDULO 1 do SO Numaboa
O Sistema Operacional NumaBoa é apenas um exercício de programação híbrida e uma excelente oportunidade de rever e de aplicar na prática alguns conceitos apresentados em outros tutoriais e textos técnicos. Apesar de parecer "coisa de maluco" querer projetar e escrever um SO personalizado, não é das coisas mais absurdas e nem tão complicado quanto se pensa. É claro que nem de longe pretendemos fazer concorrência ao Windows (porque criar um SO campeão em GPF? ), ao Unix ou ao Linux. Este conjunto de tutoriais dá apenas uma oportunidade ao fuçador mais curioso de declarar sua independência e fazer com que sua máquina trabalhe de acordo com a sua vontade.
Este módulo introdutório visa esclarecer as dúvidas mais frequentes daqueles que já iniciaram ou pretendem iniciar um projeto deste tipo. Só tem uma coisa: dada a natureza das informações, não posso me responsabilizar pelos danos que eventualmente ocorram em função da utilização do conjunto destes tutoriais ou por quaisquer outros motivos. Esteja ciente de que o risco é por sua conta.
A linguagem de programação
A pergunta mais frequente talvez seja a respeito da linguagem de programação que deve ser utilizada. O que posso ir adiantando é que, para começar, é preciso saber Assembly ou, no mínimo, ter conhecimentos intermediários desta linguagem. O motivo é simples: vai ser preciso escrever um carregador de boot e algumas outras coisinhas em Assembly. O restante do código pode ser escrito em C, C++ ou até mesmo Pascal.
A Aldeia NumaBoa oferece alguns textos de apoio e tutoriais: o Tutorial de Assembly, muito visitado pelos internautas, e o Tutorial de C, publicado no final de 2003.
O carregador de boot (bootloader)
Todo sistema operacional precisa ser carregado de algum modo - e este carregamento é efetuado por um bootloader ou carregador de boot. Um bootloader é um pequeno programa em binário puro que precisa estar localizado no primeiro setor de um disquete e/ou HD (o setor de boot). A responsabilidade deste programa é achar o kernel - a parte mais importante do SO e que faz praticamente de tudo - para depois carregá-lo na memória RAM e executá-lo.
Antes de ser transferido para o setor de boot, o arquivo em binário puro do bootloader precisa ser compilado. Os compiladores são específicos das linguagens utilizadas, portanto, a escolha das linguagens é um fator importante para você poder se preparar para esta empreitada.
O software indicado
Para a linguagem Assembly, sugiro a utilização do NASM (Netwide Assembler) por um único motivo: a maior parte dos textos e tutoriais sobre SO sugerem sua utilização por ser gratuito, estável, bem documentado e capaz de gerar arquivos numa grande variedade de formatos. As versões mais atualizadas e a documentação estão disponíveis para download na página do NASM na SourceForge. A versão 0.98.39 para Windows está disponível na seção de downloads (Informática - Compiladores/Decompiladores) aqui na Aldeia.
Como segunda linguagem sugiro a utilização da C ou C++. Para o Linux, sugiro usar o gcc e, para o Windows, o lcc-win32, também disponível nos Downloads da Aldeia (Informática / Programação), ou o DJGPP. O gcc e o DJGPP são compatíveis.
Seria interessante instalar um emulador de PC para não ter que ficar dando reboot na máquina cada vez que quisermos testar o código. Neste caso, o Bochs é um achado! No site oficial do Bochs na SourceForge você encontra as versões mais atualizadas. Aqui na Aldeia você encontra o Bochs na versão 2.0.3 para Windows na seção de downloads (Informática / Emuladores).
Como vamos precisar criar algumas imagens de disco, sugiro alguns freewares. O PartCopy de John S. Fine, cuja versão 2.0 está disponível aqui na Aldeia na seção de downloads (Informática / Utilitários). O dd para Windows, de John Newbigin, versão 0.5 que pode ser encontrada no site do autor ou aqui na Aldeia (downloads Informática / Utilitários) e o Rawrite, versão 0.7, também do John Newbigin ou aqui na Aldeia (downloads Informática / Utilitários). O WinImage, um software comercial, também pode ser utilizado.
O helpPC versão 2.1 é um programa criado por David Jurgens em 1991 que fornece todas as referências necessárias. Depois que comecei a utilizá-lo, raramente preciso correr atrás de livros. Está disponível para download em Informática / Referências e Manuais.
Modos de CPU
A CPU pode trabalhar de formas diferentes - são os chamados "modos" da CPU. Estes modos determinam como o sistema operacional pode acessar a memória e os recursos.
O primeiro modo é o assim chamado "Modo Real". Quando um computador x86 (386, 486, Pentium, etc) é ligado, ele começa neste "modo real". No modo real não existe proteção contra conflitos de endereços de memória, apenas uma tarefa pode ser realizada, a área de memória está limitada a 1 Mb e é preciso usar a segmentação para acessar a memória. A bem da verdade, não é lá grande coisa. Se o kernel do SO for coisa pouca ou você tiver motivos especiais, tudo bem, mas, se a pretensão for um sistema operacional mais parrudo, é melhor optar pelo "modo protegido".
Quando a CPU está em modo protegido, o acesso à memória é protegido para evitar que programas (ou você) façam bagunça embaralhando endereços. O modo protegido, também conhecido como PMode, evita conflitos de memória, é multitarefa, permite acessar até 4 Gigabytes de RAM se o gate A-20 estiver habilitado e pode-se usar paging para acessar a memória. Tudo isto garante um sistema operacional mais estável e versátil.
O gate A20
O microprocessador 8086, o processador que apareceu antes do 286, 386, etc, conseguia acessar apenas 1 Mb da área de endereços. Para indicar esta faixa de endereços, 20 bits são suficientes (A0 a A19). Seguindo o 8086, a Intel lançou o 80286 (conhecido apenas como 286), capaz de endereçar até 16 Mb. Acontece que 20 bits não eram suficientes para conter um número maior do que 1 Mb. A solução foi criar mais gates, ampliando o número de bits. Corrigiu para um lado, deu problema no outro. Os programas escritos para o 8086 deveriam poder rodar no 80286 mas... imagine a seguinte operação binária: 11111111111111111111 + 1. Se não houver 21 bits, o resultado será 0 (zero)! Para forçar o 80286 a executar programas escritos para o 8086 sem dar resultados errados, optou-se por poder habilitar ou desabilitar o bit 21, numerado como A20. Desabilitando o bit A20, o programa era executado à moda antiga (286); habilitando o bit A20, o programa era executado com todo o potencial que o novo processador oferecia. Nascia o gate A20 (a tradução literal de gate é portão, portanto, pode-se abrir ou fechar o portão).
Os seletores
Um seletor, também chamado de descritor, é a definição de um segmento. Contém a descrição de atributos básicos como o endereço inicial (ou base do segmento) e os limites (ou comprimento) do segmento. Os seletores possuem 64 bits e são armazenados em tabelas.
GDT
A GDT é uma tabela de seletores que fornece basicamente o endereço inicial de todos os seletores.
Interrupções
Uma interrupção é um sinal que interrompe a tarefa atual que a CPU esteja executando. Quando a CPU recebe um sinal de interrupção, ela pára a tarefa atual e executa o manipulador (handle) de interrupção apropriado. Um manipulador de interrupção é uma função especial projetada para tratar especificamente o sinal de interrupção correspondente. Existem dois tipos de Interrupções: de software e de hardware.
As interrupções de software podem ser comparadas com "funções" que residem na BIOS. São usadas com alguma frequência para realizar tarefas simples como estabelecer os modos de vídeo ou solicitar dados da BIOS.
As interrupções de hardware são um pouco diferentes. Funcionam como acionadores do seu código quando ocorrem determinados eventos (uma tecla digitada, um clique do mouse, etc). São excelentes para se comunicar com o hardware do computador, mas só podem ser usadas no "modo real". Se tentarmos chamar uma interrupção deste tipo no "modo protegido", o sistema operacional vai pifar. Felizmente existem formas de contornar este problema.
Como as interrupções possuem propriedades especiais - por exemplo, podem trocar o anel (ring) 3 pelo anel 0 - elas podem ser utilizadas por sistemas operacionais para que processem chamadas do sistema. No Linux, as chamadas do sistema são tratadas através de interrupções.
PIC
O PIC, Programmable Interrupt Controller ou Controlador de Interrupções Programável, é um dispositivo que coleta requisições de interrupções do hardware e avisa a CPU quando elas ocorrem. Quando isto acontece, a CPU solicita o tipo de interrupção ocorrida ao PIC, pára a tarefa atual e executa o manipulador de interrupção correspondente.
PIT
O PIT, Programmable Interrupt Timer ou Temporizador de Interrupções Programável, é um temporizador programável do hardware que dispara uma interrupção quando ele zera (IRQ 0). É programável porque sua velocidade pode ser alterada. O PIT é usado principalmente para agendar tarefas.
Como escrever um SO
Nesta série de tutoriais vamos criar o SO NumaBoa, um sistema operacional muito simples. Começaremos com a versão em modo real para depois tratarmos do modo protegido (PMode). Na sequência dos módulos, os conhecimentos necessários geralmente são fornecidos antes dos exemplos práticos. A pretensão dos tutoriais é mais a de esclarecer aspectos vitais na elaboração de um sistema operacional; o sistema operacional resultante, no entanto, não passa de um modelo básico.
Desejo sorte nesta empreitada e muito divertimento. Como sempre, um grande abraço a todos da
vovó Vicki
Referências
K.J. e Joachim Nock - Getting Started in OS Development
Peter Norton - Linguagem Assembly para IBM PC.
Na seção de downloads, em Tutoriais / Sistemas Operacionais e Informática / Referências e Manuais, tem um caminhão de tutoriais e textos de apoio.