2009-04-03 3 views
9

Wie kompilieren Sie ein C Programm zu einem gültigen ELF-Format (oder RAW-Format), so dass es direkt aus dem RAM ohne OS ausgeführt werden kann? Angenommen, es existiert ein Bootloader, der in der Lage ist, den Code an eine beliebige Stelle im RAM zu laden und die Ausführung unter dieser Adresse zu starten. Um genau zu sein, was sollte der Compiler (GCC) Flags sein? Benötigen Sie eine Map-Datei?Ausführung ohne O

würde Eine Probe Hello World-Anwendung höchst willkommen sein :)

Genau mein Punkt zu erarbeiten, lassen
die Methode main() eine leere unendlich sein while-Schleife spezifische oder Standard-Bibliothek Anrufe, ohne OS, um sicherzustellen, werden verwendet. Das gewünschte o/p ist ein Hang. Mit den üblichen GCC Optionen würde der Bootloader die ausführbare Datei definitiv nicht laden und sagen, dass sie ungültig ist ELF Format. Wenn Sie jedoch die Option -dN an den Linker übergeben, wird es zu einem gültigen ELF. Mehr Compiler/Linker-Optionen sind erforderlich, damit es hängt und nicht abstürzt !! Was genau sind diese Compiler-Optionen?

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

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

Bootloader Lasten a.out auf RAM und führt.

Antwort

6

Erstens gibt es Einschränkungen, was Sie tun können, sobald der Bootloader seine Arbeit beendet hat. Diese Einschränkungen haben folgende Ursachen: (Angenommen, Ihr Bootloader (z. B. grub) führt Sie zum 32-Bit-geschützten Modus) 1. Es ist kein Paging aktiviert. Sie müssen es aktivieren. 2. Dort können Sie nicht mit Geräten interagieren, da Sie Handler für IRQ einstellen müssen.

Hier ist eine klassische Verbindung, die ich die Kunst der Programmierung über Bare Metal (http://geezer.osdevbrasil.net/osd/index.htm) gelernt habe. Außerdem gibt es einen Download-Link auf der Seite (http://geezer.osdevbrasil.net/osd/code/osd.tgz). Die TAR-Datei enthält Demokerne mit steigendem Komplexitätsgrad. Sie können auch in die make-Datei (linux.mak) schauen und erforderliche Flags für gcc erhalten.

öffnete ich eine zufällige Make-Datei und festgestellt, dass folgende Flags verwendet: gcc: -nostdinc -fno-builtin ld: -nostdlib
(einen expliziten Aufruf von Linker, daher besteht ld muss auch ein Flag) .

Der Zweck der Flags besteht darin, gcc mitzuteilen, dass keine Verbindung mit der Standardbibliothek hergestellt werden darf.

+0

Dank ... Die Links waren sehr nützlich :) – AIB

0

Ist Ihnen klar, dass Sie, wenn Sie kein Betriebssystem laden, einen Gerätetreiber schreiben müssen, um mit jedem Gerät zu arbeiten. Das bedeutet kein Schreiben auf den Bildschirm, ohne einen Treiber für diese bestimmte Grafikkarte zu schreiben, kein Lesen von der Festplatte, ohne einen Treiber für diese bestimmte Festplatten-Controller-Karte zu schreiben, keinen Zugriff auf die Tastatur usw.

Sie möchten vielleicht in etwas namens Kiosk Mode stattdessen suchen. Die Grundidee ist, dass das Betriebssystem ausgeführt wird, alles für Ihre App geladen wird, Ihre App geladen wird und Sie dann nicht zu einer anderen App wechseln können.

+0

Anstatt Gerätetreiber zu schreiben, könnten Sie einfach im Real-Modus bleiben und BIOS-Interrupts verwenden, um auf all diese Dinge zuzugreifen. Ansonsten ist Video (VESA), Tastatur (PS/2-Emulation) usw. ziemlich standardisiert. – Andy

+0

Zunächst habe ich versucht, einen Hang auf dem System zu erstellen (siehe Code in der Frage). Um einen Hang zu erzeugen, brauchen Sie keine Treiber (außer vielleicht der Speichertreiber, den der Boot-Loader liefern wird). Aber ich bekam einen Unfall. Sobald ich damit fertig bin, kann ich den Treibercode bekommen und weiter erkunden ... – AIB

Verwandte Themen