2012-04-02 10 views
4

So könnte die Frage seltsam erscheinen, aber lassen Sie uns sagen, dass ich kompilieren:Wie mache ich ein bootfähiges Programm?

int main(void) 
{ 
    int x = 3; 
    int y = 4; 

    int z = x + y; 
} 

Ist es möglich, die CPU laufen, genau das zu machen? Wie? Würde mir das beispielsweise erlauben, auf den Monitor zu schreiben? (Wenn ich mich richtig erinnere, gibt es Orte im Speicher, in denen Sie Dinge schreiben können, die angezeigt werden.)

+0

ehh ... nicht wirklich, es sei denn, Sie laufen auf einem programmierbaren Mikro/PIC. – Anycorn

+3

http://wiki.osdev.org/Main_Page - das ist ein Thema eines ganzen Buches – Mat

+0

@Anycorn, wie kommt es? Es muss einen Weg geben, dies zu tun, sonst wäre es sinnlos! Wie auch immer, scheint, als hätte ich eine Menge zu lesen ... – corazza

Antwort

1

Im Falle Ihres Programms ist es nicht auf Betriebssystem-Dienste angewiesen, außer es zu starten. Wenn es zusätzlich eine Eingabe oder Ausgabe machen würde, würde es fast sicher auf das Betriebssystem angewiesen sein, um die I/O durchzuführen.

Wenn Sie das Betriebssystem durch Ihren eigenen Code ersetzen möchten, dann könnten Sie es tun. Minimalistische Betriebssysteme und Programmlader existieren. Aber ja, du hast viel zu lernen.

+0

Nun, ich weiß, dass ich Dinge wie # include und printf ausgeschlossen habe. Diese Dinge haben offensichtlich Verbindungen mit dem Betriebssystem und würden nicht ohne ihre respektierten Bibliotheken und Abhängigkeiten laufen. Ich habe versucht zu machen ist so einfach wie möglich. – corazza

+0

@Bane: Sie könnten damit beginnen, ein einfaches Bootloader-Programm zu verstehen und zu modifizieren. Entfernen Sie alle Betriebssystem-Dinge wie das Interpretieren eines Dateisystems und das Laden des Kernels. Ersetzen Sie es durch die Operationen, die Sie stattdessen ausführen möchten. Beachten Sie, dass viele Bootloader BIOS-Aufrufe verwenden, um den Bildschirm-I/O auszuführen; andere implementieren einen Textbildschirmtreiber. – wallyk

2

Ja, es gibt Möglichkeiten, das zu tun, kein Problem. http://github.com/dwelch67 Ich habe Tonnen von Beispielen. Sie können pcemu oder die eine, die ich gegabelt pcemu_samples verwenden und eine x86-basierte machen, wenn x86 ist, was Sie wollen, wenn Sie nicht über den Prozessor kümmern, habe ich eine Reihe von Simulatoren sowie Beispiele für Embedded-Prozessoren/Mikrocontroller, die es macht einfacher zu sehen, was vor sich geht.

printf ist über den schlimmsten C-Bibliothek Aufruf zu verwenden es in so viele Richtungen erreicht, Fließkomma, String Zeug, Division, etc., vermeiden Sie es für diese Art von Sache. Ich sehe, dass du die Kommentare nicht gelesen hast.

Um zu sehen, dass das Programm läuft, wollen Sie eine LED oder Pin an einem parallelen Port blinken oder Zeichen aus einer seriellen Schnittstelle, was wesentlich einfacher als das Programmieren der Register in einer Grafikkarte und Debuggen dieses Codes ohne etwas zu sehen wenn du Fortschritte machst.

Jetzt mit x86 haben Sie eine Schicht, nicht wirklich ein Betriebssystem, aber eine Schicht, die diese Art von Code hinter sich hat, die Sie einfache Anrufe an Zeichen auf dem Bildschirm in einem Textmodus und sehen Sie Ihr Programm ausführen können . Ich habe das aus pcemu_samples entfernt, aber die volle pcemu und dosbox und andere x86 Emulationsumgebungen sowie der eigentliche Computer, haben diese Dinge für Sie verfügbar. Eine der Sim-Umgebungen (Dosbox, PCEMU, usw.) ist ein besserer Startpunkt (wenn Sie glauben, dass Sie mit x86 anfangen müssen, beachten Sie das Thema hier, ich bin wirklich entmutigend, beginnend mit x86). Wenn du x86 machst, könntest du von DOSbox oder ähnlichem gehen und dich dann wahrscheinlich in einen bootfähigen USB-Stick hineinarbeiten und dich von dort aus arbeiten.

Embedded-Prozessoren von denen es viele, viele Evaluierungsboards für unter $ 50, einige gute bei oder unter $ 20 haben. Aber viele viele Simulatoren, die frei sind, von denen du lernen kannst. Ich habe ein paar Sie können versuchen, Daumen, amber_samples, pcemu_samples sind wahrscheinlich die stabilste (weniger wahrscheinlich, um meine Sachen zu debuggen, meist Debugging Ihre Sachen), dann andere, die weniger stabil sind, meecoate, msp430sim, etc. $ 5 bekommen Sie ein msp430 Board, $ 10 erhalten Sie ein ARM-Cortex-m3-Board, $ 20 erhalten Sie ein zu leistungsstark, um ein Mikrocontroller, Mikrocontroller-Board genannt werden (Cortex-M4 basiert). Und mehr Geld bringt Sie nicht schneller oder besser, sondern mehr Auswahlmöglichkeiten. Boards, die Linux ausführen können/werden mehr Schmerzen für das, was Sie versuchen zu lernen, bleiben unter diesem Niveau.

Ihr einfaches Beispiel erfordert sehr wenig, außerhalb des Codes, den der Compiler für diese Funktion erstellt, brauchen Sie nur eine Anweisung, um vom Reset-Vektor zum Einstiegspunkt der Hauptfunktion zu verzweigen. Idealerweise möchten Sie einen Stack einrichten und eventuell möglicherweise .bss oder .data kopieren usw.Nur lernen, die Werkzeuge (Compiler, Assembler, Linker) zu verwenden, um eine eingebettete Binärdatei zu erstellen (auch wenn Sie keine Hardware/Simulator zum Ausführen haben) wird Ihnen zeigen, wie Sie die Punkte zwischen Reset und Main() verbinden Sie müssen es nicht Haupt nennen, Sie können es nennen, was Sie wollen, einige Compiler, die Sie NICHT nennen wollen, Hauptsache, sie werfen zusätzlichen Müll in Ihre Binärdatei.

0

Es ist nur eine lange Geschichte, müssen Sie mit Montage vertraut sein, und Sie müssen wissen, welche Kratzer die richtige für Ihre CPU ist Art im Allgemeinen, Montage für x86-Serie ist sehr berühmt und man kann es gehen durch das Lernen.

Sie werden einige etwas Derartiges sehen werden:

Start: 

mov AX ,0xff ;example 1 
mov BX ,[CX] ;example 2 
myString db 'Hi This is my First scratch',0 ;Print Example 
call printFunc ;example 3 
jmp $ 

printFunc: 
mov ah, 0Eh ;This how you print on screen in Assembly 
loop 
lodsb 
cmp AX,BX 
je loop 

etc etc ..... ... .

Verwandte Themen