Domanda

Come si compila un C da programmare in un ELF formato valido (o in formato RAW) in modo che possa essere eseguito direttamente dalla RAM senza alcun OS ? Si supponga che un bootloader esiste che è in grado di caricare il codice in qualsiasi posizione nella RAM e inizia l'esecuzione a tale indirizzo. Per essere precisi, quello che dovrebbe essere il compilatore ( GCC ) le bandiere? C'è bisogno di un file di mappa?

Un'applicazione di esempio HelloWorld sarà il benvenuto:)

Proprio per elaborare il mio punto,
lasciare che il metodo main () sia un infinito vuoto ciclo while per garantire che nessuna OS chiamate di libreria specifici o standard sono utilizzati. Il desiderato o / p è un blocco. Con il solito GCC le opzioni del bootloader sarebbe sicuramente riuscire a caricare il file eseguibile dicendo è valido ELF Formato. Tuttavia passando -dn per il linker ne fanno una valida ELF . Più compilatore / opzioni del linker sono tenuti a fare pendere e va in crash !! Quali sono esattamente quelle opzioni del compilatore?

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

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

carichi Bootloader a.out per RAM ed esegue.

È stato utile?

Soluzione

In primo luogo, ci sono limiti a ciò che si può fare, una volta bootloader finisce il suo lavoro. Queste limitazioni sono a causa delle seguenti cose: (Supponendo che il boot loader (per esempio: grub), vi porta alla modalità protetta a 32 bit) 1. Non v'è alcun paging abilitato. È necessario abilitarlo. 2. Ci non è possibile interagire con i dispositivi come si deve impostare i gestori per IRQ.

Questo è il link classico che ho usato per imparare l'arte della programmazione su metallo nudo ( http : //geezer.osdevbrasil.net/osd/index.htm ). Inoltre, v'è un link per il download nella pagina ( http://geezer.osdevbrasil.net /osd/code/osd.tgz ). Il file tar contiene noccioli demo con crescente livello di complessità. Inoltre, è possibile esaminare il file di marca (linux.mak), e ottenere bandiere necessari per gcc.

Ho aperto un make file casuale e ha scoperto che le bandiere seguenti sono stati utilizzati: GCC: -nostdinc -fno-incorporato LD: -nostdlib
(Una chiamata esplicita a linker è fatto, quindi ld necessita anche di una bandiera).

Lo scopo è quello di raccontare le bandiere gcc che non ci deve essere alcun collegamento fatto con la libreria standard.

Altri suggerimenti

coreboot può caricare ELF stand-alone. vedere "Inizializzazione DRAM":

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

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

Questo sito risponde alla tua domanda step-by-step ...

Ti rendi conto che se non si carica un sistema operativo è necessario scrivere un driver di periferica per funzionare con qualsiasi dispositivo. Ciò significa che non la scrittura sullo schermo senza scrivere un driver per quella particolare scheda video, nessuna lettura dal disco senza scrivere un driver per quella particolare scheda controller del disco rigido, senza l'accesso alla tastiera, ecc.

Si consiglia di guardare in qualcosa chiamato modalità Kiosk invece . L'idea di base è che il sistema operativo viene eseguito, carica tutto bisogno per la vostra applicazione, carica la vostra applicazione, e quindi non è possibile passare a un'altra app.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top