Pesquisar este blog

Novidades no blog

- Passamos das 30.000 visitas \o/

- Nenhum código novo :/

- LOS versão 0.6 (faça o download);

domingo, 17 de março de 2013

Boot, fase 1 - Prólogo

A primeira coisa em um sistema operacional nem é como ele funciona, ou como gerencia os recursos, não é a coisa mais importante depois que ele esteja em funcionamento, mas é o mais importante antes dele entrar em funcionamento.

O primeiro processo que um sistema operacional precisa fazer é ser carregado para a memória. Como deve ser de conhecimento, a memória RAM não mantêm dados depois que o computador é desligado, portanto o sistema operacional e todos os outros arquivos devem permanecer em memórias secundárias, sendo carregados para a memória principal somente quando necessário.

A ação de carregar o sistema operacional do disco rígido ou CDROM para a memória primária é chamado de bootstrapping, ou simplesmente boot. Este processo não é feito pelo sistema operacional em si, mas por um auxiliar chamado de carregador de boot (bootloader).

O carregador de boot é um programa auxiliar que é executado somente durante o carregamento do sistema e é totalmente desnecessário depois. Normalmente o processo de boot pode ser divido em duas partes.

A primeira está no setor de boot, um pequeno pedaço do disco, que contém um minúsculo programa escrito em Assembly. O setor de boot é carregado pela BIOS para a memória e executado, ele pode carregar diretamente o sistema operacional ou carregar uma segunda parte do bootloader.

Como o setor de boot tem normalmente um tamanho pequeno, não é possível que o bootloader tenha muitos recursos e nem que seja escrito em outra linguagem que não seja Assembly. Para resolver essa limitação, com o bootloader tendo mais recursos, faz-se com que o programa contido no setor de boot seja o mais simples possível, porem todas a funcionalidade são implementados em outra parte, a qual é carregada pelo setor de boot.

Essa segunda parte do bootloader pode ser escrita em qualquer outra linguagem e, normalmente, não tem nenhuma limitação, sendo possível implementar diversos recursos. Esta é a forma utilizada pelo GRUB (GRand Unified Bootloader) utilizado por muitas distribuições Linux.

A diferença fundamental entre um carregador mono-estágio (que somente tem o setor de boot) para um multi-estágio é que, no mono-estágio, o arquivo de kernel a ser carregado deve estar totalmente pronto para ser executado, ou seja, não pode ser um arquivo realocável, enquanto que em um carregador multi-estágio é até possível carregar um executável com realocações.

Não pretendo utilizar um carregador de boot externo como o GRUB, mas também quero que o carregador tenha mais recursos que o simples setor de boot, então a escolha recairá em justamente implementar um bootloader de dois estágios. Porem antes de começar a implementar o carregador de boot é necessário que se tenha o mínimo do sistema operacional, pois escrever um programa para carregar algo que ainda nem existe é muito mais complicado.

Além de que, ainda, como irei utilizar o FPC, que foi concebido para funcionar em 32 bits (64 também) e com modelo de memória FLAT, não é possível escrever o bootloader com ele, somente em Assembly.

Portanto o bootloader é uma parte extremamente chata de se implementar, que poderia ocupar um tempo demasiadamente logo sem apresentar resultados práticos, então a forma a qual acho mais interessante no momento de desenvolvimento do sistema é executar um “boot-parasita”.

O que seria esse boot-parasita?

Simples, utilizar um sistema operacional simples que funciona exclusivamente em modo real, o MS-DOS por exemplo, e a partir de um programa executado por ele, carregar o nosso sistema operacional para a memória e pô-lo em execução. Isto é mais simples e rápido de ser feito, embora pareça um processo “sujo”, é mais eficiente durante o desenvolvimento e possibilita que se aproveite melhor o tempo com algo realmente mais importante, o kernel.

Então o que fazer: escreverei um programa em Turbo Pascal, que roda sobre o MS-DOS, este programa será responsável por carregar o kernel do nosso sistema para a memória e preparar o computador para pô-lo em funcionamento. Após ter um kernel funcional escreveremos nosso próprio bootloader.

Isto torna fácil os testes, principalmente no DosBox, que já emula um DOS mas permite que um programa use o modo protegido. Já nas outras máquinas virtuais é necessário que se tenha um disco de boot do MS-DOS ou do Windows 95 (ou do FreeDOS).

Uma outra pergunta que pode estar surgindo é porque eu irei utilizar o MS-DOS FreeDOS inicialmente para boot se atualmente uso o Linux?

Simples novamente, o Linux já funciona em modo protegido e não iria permitir que um programa tomasse o controle do hardware, enquanto o MS-DOS FreeDOS roda em modo real e, assim, permite que qualquer programa controle e configure o computador para trabalhar em modo protegido.

<< Anterior - Antes de começar


Nenhum comentário:

Postar um comentário

Obs.: Após escrever seu comentário, inscreva-se por e-mail para seguir os próximos comentários. Ou assine a postagem de comentários (Atom).