Pergunta

Como você compilar uma C programa em um ELF formato (ou formato RAW) válida para que ele possa ser executado diretamente de RAM sem qualquer OS ? Suponha que um bootloader existe que é capaz de carregar o código para qualquer local na RAM e iniciar a execução nesse endereço. Para ser preciso, o que deveria ser o compilador ( CCG ) bandeiras? Existe uma necessidade de um arquivo de mapa?

A aplicação helloworld amostra seria muito bem-vindo:)

Apenas para elaborar o meu ponto,
deixe o método main () ser um infinito vazio while para garantir que nenhuma OS específico ou chamadas de bibliotecas padrão são usados. O o / p é desejada uma asa. Com o habitual GCC Opções do bootloader iria deixar de carregar a narração executável é inválido ELF formato. No entanto, passando -dn para o vinculador irá torná-lo um válido ELF . Mais de compilador / vinculador opções são obrigados a fazê-lo pendurar e não falha !! O que são exatamente essas opções do compilador?

file.c:
int main()
{
    while(1);
}

Compilation
gcc -c -nostdinc -fno-builtin file.c
ld -dn -nostdlib file.o

cargas Bootloader a.out para a memória RAM e executa.

Foi útil?

Solução

Em primeiro lugar, existem limitações para o que pode fazer, uma vez bootloader termina seu trabalho. Estas limitações são por causa do seguinte coisas: (Assumindo que o seu carregador de inicialização (por exemplo: grub), leva-o para o modo protegido de 32-bit) 1. Não há paginação habilitado. Você precisa habilitá-lo. 2. Lá você não pode interagir com os dispositivos como você tem que manipuladores conjunto de IRQ.

Aqui está um link clássico que eu usei para aprender a arte da programação sobre bare metal ( http : //geezer.osdevbrasil.net/osd/index.htm ). Além disso, há um link para download na página ( http://geezer.osdevbrasil.net /osd/code/osd.tgz ). O arquivo tar contém demonstração kernels com o aumento do nível de complexidade. Além disso, você pode olhar para o arquivo make (linux.mak), e obter sinalizadores necessários para gcc.

Eu abri um arquivo make aleatória e descobriram que seguintes bandeiras foram utilizados: gcc: -nostdinc -fno-builtin ld: -nostdlib
(Uma chamada explícita para vinculador é feita, portanto, ld também precisa de uma bandeira).

O objetivo bandeiras é dizer gcc que não deve haver vinculação feito com a biblioteca padrão.

Outras dicas

coreboot pode carregar ELF stand-alone. consulte "Inicialização DRAM":

http://en.wikipedia.org/wiki/Coreboot

http://www.osdever.net/bkerndev/index.php

Este site responde a sua pergunta passo-a-passo ...

Você percebe que se você não carregar um sistema operacional que você deve escrever um driver de dispositivo para funcionar com qualquer dispositivo. Isso significa que nenhuma escrita para a tela sem escrever um driver para que placa de vídeo particular, nenhuma leitura a partir do disco sem escrever um driver para que o cartão de controlador de disco rígido particular, sem acesso ao teclado, etc.

Você pode querer olhar para algo chamado Modo Kiosk vez . A idéia básica é que o sistema operacional é executado, carrega tudo necessidade de sua aplicação, cargas seu aplicativo e, em seguida, você não pode alternar para outro aplicativo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top