Depois do desenvolvimento do bootloader iremos partir para o desenvolvimento do kernel, sendo que cada funcionalidade será adicionada na medida da necessidade e da possibilidade. Nenhum recurso avançado, como modo gráfico, por exemplo, deve ser tentando no início. Primeiro o kernel precisa trabalhar, e bem, com os recursos da máquina, como memória e dispositivos...
O primeiro requisito é utilizar uma linguagem de alto nível para facilitar, e muito, a nossa vida. Como eu já disse estarei utilizando a linguagem Pascal e o compilador FPC. Mas para que isso seja possível é necessário que algumas modificações sejam feitas na sua RTL (RunTime Library). Entretanto não faremos isto de uma única vez, ao invés, começaremos com uma RTL completamente vazia e conforme formos evoluindo adicionaremos o necessário.
Para que o FPC compile corretamente o SO devemos configurar como alvo da compilação (target) a arquitetura Linux/i386. Caso esteja utilizando outro sistema operacional ou mesmo o Linux de 64 bits (que é o meu caso), deve ser providenciado uma versão crosscompiler, que não entrarei em detalhes aqui. Como referência, usei basicamente este método para criação da minha versão: Free Pascal: Setting up your machine for cross-compiling.
A forma que encontrei para produzir um SO com o FPC é utilizar somente units e fazer a linkagem manualmente, assim utilizaremos o código puro das units. Nesse caso a parte principal do kernel será escrita em Assembly e fará “um envelope” nas rotinas em Pascal, permitindo dessa forma que a imagem continue tendo a tabela de boot e alguma inicialização que deve ser feita antes de chamar qualquer código em Pascal. No demais tudo será implementado em Pascal, exceto onde obrigatoriamente tenha que ser feito em Assembly por necessidade ou para otimizar o desempenho.
O primeiro passo é configurar o linkeditor, no caso o LD (padrão do Linux), para isso utilizaremos um arquivo de configuração que conterá as informações necessárias para o linker montar a imagem corretamente.
Tendo o arquivo de configuração pronto já é possível compilar o arquivo KWRAP.ASM (antigo pkernel) para ELF, ao invés de diretamente para binário, e em seguida, utilizando o linker, produzir a imagem final do kernel.
O segundo passo é configurar o FPC, para isso utilizaremos outro arquivo de configuração, junto com uma opção de linha de comando que evitará que o compilador use o arquivo de configuração padrão. Nesse arquivo podemos definir diversas configurações a serem usadas sempre, mas não encontrei muitas úteis até o momento...
Nesse ponto já é possível utilizar alguma coisa em Pascal, então modifiquei o KWRAP.ASM para a sua função final, na qual ele chama um procedimento que está na unit KERNEL.PAS. Nesta unit implementei um procedimento que executa a mesma coisa que o pkernel fazia, ou seja, rodar um caractere na tela.
Para facilitar todo o processo também escrevi um scritp em shell, bem simples, para executar todo o trabalho, assemblando, compilando, linkando...
Os dois passos citados anteriormente criaram duas versões:
A primeira (Kernel.000) utiliza o mesmo código em Assembly do PKERNEL.ASM, chamado agora de KWRAP.ASM, porem compilado para ELF e posteriormente linkado para binário.
A segunda (Kernel.001) introduz o uso de códigos em Pascal, onde KWRAP.ASM chama um procedimento de KERNEL.PAS, cada arquivo é compilado para ELF e posteriormente todos são linkados para um arquivo binário.
Edit: Após organizar os repositórios no github, modifiquei a funcionalidade dos pacotes (seguindo os repositórios), assim o pacote "kernel" tem somente o kernel do SO, e o pacote "system" possui agora todas as partes necessárias para funcionamento do sistema (ex.: kernel, bootloader, shell, ...).
Download dos fontes e binários:
O primeiro requisito é utilizar uma linguagem de alto nível para facilitar, e muito, a nossa vida. Como eu já disse estarei utilizando a linguagem Pascal e o compilador FPC. Mas para que isso seja possível é necessário que algumas modificações sejam feitas na sua RTL (RunTime Library). Entretanto não faremos isto de uma única vez, ao invés, começaremos com uma RTL completamente vazia e conforme formos evoluindo adicionaremos o necessário.
Para que o FPC compile corretamente o SO devemos configurar como alvo da compilação (target) a arquitetura Linux/i386. Caso esteja utilizando outro sistema operacional ou mesmo o Linux de 64 bits (que é o meu caso), deve ser providenciado uma versão crosscompiler, que não entrarei em detalhes aqui. Como referência, usei basicamente este método para criação da minha versão: Free Pascal: Setting up your machine for cross-compiling.
A forma que encontrei para produzir um SO com o FPC é utilizar somente units e fazer a linkagem manualmente, assim utilizaremos o código puro das units. Nesse caso a parte principal do kernel será escrita em Assembly e fará “um envelope” nas rotinas em Pascal, permitindo dessa forma que a imagem continue tendo a tabela de boot e alguma inicialização que deve ser feita antes de chamar qualquer código em Pascal. No demais tudo será implementado em Pascal, exceto onde obrigatoriamente tenha que ser feito em Assembly por necessidade ou para otimizar o desempenho.
O primeiro passo é configurar o linkeditor, no caso o LD (padrão do Linux), para isso utilizaremos um arquivo de configuração que conterá as informações necessárias para o linker montar a imagem corretamente.
Tendo o arquivo de configuração pronto já é possível compilar o arquivo KWRAP.ASM (antigo pkernel) para ELF, ao invés de diretamente para binário, e em seguida, utilizando o linker, produzir a imagem final do kernel.
O segundo passo é configurar o FPC, para isso utilizaremos outro arquivo de configuração, junto com uma opção de linha de comando que evitará que o compilador use o arquivo de configuração padrão. Nesse arquivo podemos definir diversas configurações a serem usadas sempre, mas não encontrei muitas úteis até o momento...
Nesse ponto já é possível utilizar alguma coisa em Pascal, então modifiquei o KWRAP.ASM para a sua função final, na qual ele chama um procedimento que está na unit KERNEL.PAS. Nesta unit implementei um procedimento que executa a mesma coisa que o pkernel fazia, ou seja, rodar um caractere na tela.
Para facilitar todo o processo também escrevi um scritp em shell, bem simples, para executar todo o trabalho, assemblando, compilando, linkando...
Os dois passos citados anteriormente criaram duas versões:
A primeira (Kernel.000) utiliza o mesmo código em Assembly do PKERNEL.ASM, chamado agora de KWRAP.ASM, porem compilado para ELF e posteriormente linkado para binário.
A segunda (Kernel.001) introduz o uso de códigos em Pascal, onde KWRAP.ASM chama um procedimento de KERNEL.PAS, cada arquivo é compilado para ELF e posteriormente todos são linkados para um arquivo binário.
Edit: Após organizar os repositórios no github, modifiquei a funcionalidade dos pacotes (seguindo os repositórios), assim o pacote "kernel" tem somente o kernel do SO, e o pacote "system" possui agora todas as partes necessárias para funcionamento do sistema (ex.: kernel, bootloader, shell, ...).
Download dos fontes e binários:
- Kernel.000-1 (Correção 14/06/2013);
- Kernel.001-1 (Correção 14/06/2013);
- System.000-1 (Correção 14/06/2013);
- System.001-1 (Correção 14/06/2013);
Próximo - Kernel, fase 2 - Abastecendo o tinteiro >>
<< Anterior - Boot, fase 10 - Finalizando
Voltar a Faça seu próprio sistema operacional.
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).