Pesquisar este blog

Novidades no blog

- Passamos das 120k visitas \o/

- Os repositórios ainda precisam ser organizados!

- Nova postagem: Organizando a casa;
- LOS versão 0.7 (acesse, em breve, no github.com);

quinta-feira, 18 de abril de 2013

Boot, fase 6 - Entrando num mundo unreal

Depois da batalha do A20 entraremos num mundo unreal, ou melhor, no Modo Unreal, rsrs.

Com o surgimento do processador 80386, o primeiro de 32 bits da série x86, novas estruturas foram adicionadas. Agora cada entrada da GDT pode ser definida como sendo um segmento normal, onde o seu tamanho é definido em bytes, ou um segmento grande, onde é definido em blocos de 4 KB.

Os segmentos normais tem tamanho máximo de 64 KB, enquanto os segmentos grandes podem chegar aos 4 GB, sendo acessados por offsets de 32 bits.

Porem quando o processador é retornado ao modo real, sem atualizar os segmentos para normais, ainda é permitido o uso de offsets de 32 bits que podem acessar todo os 4 GB. Este é o chamado Modo Unreal.

Existem dois subtipos no Modo Unreal:
  • Big Unreal - somente os segmentos de dados são acessíveis por offsets de 32 bits;
  • Huge Unreal - o segmento de código também pode ser acessado por offsets de 32 bits.

Mas qual a vantagem do Modo Unreal?

Depois que tivermos o sistema operacional completamente carregado, nenhuma, pois ele irá trabalhar no Modo Protegido de 32 bits, mas durante o processo de boot o Modo Unreal será muito útil, porque a BIOS e o booloader irão funcionar normalmente como se estivessem no Modo Real, porem, através de um procedimento especial, podemos enviar o kernel para a memória superior.

O modo interessante nesse caso é o Big Unreal pois precisamos acessar somente dados na memória superior (o kernel, para o bootloader, é tratado como dados).

Para utilizar o Modo Unreal, criei uma GDT auxiliar, com uma entrada tipo FLAT32, que é carregada, então um procedimento ativa o Modo Unreal (entra no Modo Protegido, atualiza os segmentos de dados, sai do modo protegido e restaura os segmentos originais).

Depois que o Modo Unreal é ativado, o kernel é lido e carregado para a memória superior, através do buffer, e o processo continua normalmente, como na versão anterior, com a configuração da GDT principal, entrada no Modo Protegido... Porem agora todos os segmentos estão na memória superior, exceto o de vídeo, mas ainda são de 16 bits.



Depois de ter o kernel rodando na memória superior,  substituí o descritor do segmento de vídeo por um descritor FLAT32, que permite acessar toda a memória, e pelo qual o vídeo é acessado. Para isso o kernel foi modificado para usar acesso de 32 bits provido pelo descritor 0x20 (de 4 GB).



Download dos fontes e binários:

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).