Embora o bootloader
seja capaz de carregar um kernel de 32 bits para a memória superior,
isto ainda não é feito de forma inteligente, pois todos os
parâmetros usados durante o processo estão no bootloader e são
criados durante a compilação deste.
Se para uma nova compilação do kernel for necessário parâmetros diferentes, uma recompilação do bootloader também se torna obrigatória. Para evitar isto implementei no kernel uma tabela que contém todos os parâmetros necessários para o seu próprio carregamento, de forma que o kernel informa ao bootloader o que ele precisa.
Esta tabela fica logo após a instrução inicial, que é um JUMP para um rótulo mais adiante. Ela é composta de uma assinatura, que garante que somente o arquivo correto seja carregado, do tipo da CPU mínima necessária, do alinhamento de memória esperado, do ponto de carregamento, do tamanho da pilha e do heap.
O bootloader lê o arquivo de imagem do kernel, verifica a assinatura, obtêm os parâmetros, depois disso verifica os requisitos, calculando posições de memória a serem utilizadas. Se tudo estiver correto, ele copia o kernel para a memória e o executa como na versão anterior.
Um recurso interessante que implementei foi que quando o tamanho da pilha é fornecido como sendo ZERO, o bootloader irá coloca-la no ponto mais alto da memória, de forma que ela possa crescer livremente ocupando toda a memória. Enquanto que se um tamanho é fornecido, ela é colocada logo após o código, imediatamente antes do heap.
Dessa forma basta modificar tais parâmetros no próprio kernel e o bootloader irá utilizá-los durante o processo de boot.
Download dos fontes e binários:
<< Anterior - Boot, fase 7 - Bem vindo 32 bits
Se para uma nova compilação do kernel for necessário parâmetros diferentes, uma recompilação do bootloader também se torna obrigatória. Para evitar isto implementei no kernel uma tabela que contém todos os parâmetros necessários para o seu próprio carregamento, de forma que o kernel informa ao bootloader o que ele precisa.
Esta tabela fica logo após a instrução inicial, que é um JUMP para um rótulo mais adiante. Ela é composta de uma assinatura, que garante que somente o arquivo correto seja carregado, do tipo da CPU mínima necessária, do alinhamento de memória esperado, do ponto de carregamento, do tamanho da pilha e do heap.
O bootloader lê o arquivo de imagem do kernel, verifica a assinatura, obtêm os parâmetros, depois disso verifica os requisitos, calculando posições de memória a serem utilizadas. Se tudo estiver correto, ele copia o kernel para a memória e o executa como na versão anterior.
Um recurso interessante que implementei foi que quando o tamanho da pilha é fornecido como sendo ZERO, o bootloader irá coloca-la no ponto mais alto da memória, de forma que ela possa crescer livremente ocupando toda a memória. Enquanto que se um tamanho é fornecido, ela é colocada logo após o código, imediatamente antes do heap.
Dessa forma basta modificar tais parâmetros no próprio kernel e o bootloader irá utilizá-los durante o processo de boot.
Download dos fontes e binários:
<< Anterior - Boot, fase 7 - Bem vindo 32 bits
Muito legal isso.
ResponderExcluirLegal mesmo...
Excluir