| Zeile 3: | Zeile 3: | ||
== Kernel == | == Kernel == | ||
| − | Wir werden mit [[GCC]] und [[NASM]] arbeiten. Ich verwende den [[Crosscompiler_f%C3%BCr_Windows | + | Wir werden mit [[GCC]] und [[NASM]] arbeiten. Ich verwende den [[Crosscompiler_f%C3%BCr_Windows|Cross-Compiler]] von [[Benutzer:Jidder|Jidder]], es sollte aber keinen Unterschied zu einem "normalen" gcc unter Linux geben. |
=== Kernel.cpp === | === Kernel.cpp === | ||
| Zeile 12: | Zeile 12: | ||
void main(void){ | void main(void){ | ||
Video screen; // Screen instanzieren | Video screen; // Screen instanzieren | ||
| − | screen.color(0x7000); // Vordergrund | + | screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau |
screen.clear(); // Bildschirm leeren | screen.clear(); // Bildschirm leeren | ||
screen.write((char *)"Wilkommen im C++-TestKernel!"); // Textausgabe | screen.write((char *)"Wilkommen im C++-TestKernel!"); // Textausgabe | ||
| Zeile 30: | Zeile 30: | ||
Video(); // Konstruktor | Video(); // Konstruktor | ||
~Video(); // Destruktor | ~Video(); // Destruktor | ||
| − | void clear(); // Leeren des Bildschirms, die Größe | + | void clear(); // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen |
void write(char *cp); // Textausgabe | void write(char *cp); // Textausgabe | ||
void put(char c); // Ausgabe eines einzelnen Zeichens | void put(char c); // Ausgabe eines einzelnen Zeichens | ||
| − | void color(int color); // Setzen der FG/BG Farben | + | void color(int color); // Setzen der FG/BG-Farben |
private: | private: | ||
unsigned short *videomem; // Zeiger auf den Videospeicher | unsigned short *videomem; // Zeiger auf den Videospeicher | ||
unsigned int off; // Y-Position der Textausgabe, je volle Zeile +80 | unsigned int off; // Y-Position der Textausgabe, je volle Zeile +80 | ||
unsigned int pos; // X-Position der Textausgabe, ab Zeilenanfang | unsigned int pos; // X-Position der Textausgabe, ab Zeilenanfang | ||
| − | unsigned int screen_color; // FB/BG Farbe | + | unsigned int screen_color; // FB/BG-Farbe |
}; | }; | ||
Video::Video(){ | Video::Video(){ | ||
| − | screen_color = 0x0700; // Setzen der Farbe auf | + | screen_color = 0x0700; // Setzen der Farbe auf Hellgrau auf Schwarz |
pos=0; // Setzen der Textausgabe auf | pos=0; // Setzen der Textausgabe auf | ||
| − | off=0; // | + | off=0; // links oben. |
videomem = (unsigned short*) 0xb8000; // Startadresse des Videospeichers | videomem = (unsigned short*) 0xb8000; // Startadresse des Videospeichers | ||
} | } | ||
| Zeile 134: | Zeile 134: | ||
loader: | loader: | ||
mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren | mov esp,0x200000 ; Stack an die 2MB-Grenze platzieren | ||
| − | push eax ; Multiboot Magicnumber auf den Stack legen | + | push eax ; Multiboot-Magicnumber auf den Stack legen |
push ebx ; Adresse der Multiboot-Structure auf den Stack legen | push ebx ; Adresse der Multiboot-Structure auf den Stack legen | ||
call _cmain ; main-Funktion des C++-Kernels aufrufen | call _cmain ; main-Funktion des C++-Kernels aufrufen | ||
| Zeile 141: | Zeile 141: | ||
jmp stop | jmp stop | ||
| − | stop: ; | + | stop: ; Endlosschleife nach Beendigung unseres Kernels |
jmp stop | jmp stop | ||
| Zeile 160: | Zeile 160: | ||
| − | Nun zu einer der wichtigsten Stellen | + | Nun zu einer der wichtigsten Stellen, dem Linkvorgang: |
| − | Wir müssen die asmKernel.o, die Kernel.o und die cKernel.o zu einer | + | Wir müssen die asmKernel.o, die Kernel.o und die cKernel.o zu einer kernel.bin linken, die dann von GRUB geladen werden kann. |
Unser Linkerscript (link.txt) | Unser Linkerscript (link.txt) | ||
| Zeile 194: | Zeile 194: | ||
</pre> | </pre> | ||
| − | Wir teilen dem Linker mit, dass wir die Labels __CTOR_LIST__, | + | Wir teilen dem Linker mit, dass wir die Labels __CTOR_LIST__, __CTOR_END__, __DTOR_LIST__ und __DTOR_END__ in der Datei cKernel.c haben und er diese beim Linken berücksichtigen soll. |
Nur noch ein kurzer Aufruf von LD, und wir haben unseren fertigen Kernel in der Hand (bzw. Maus ;-)): | Nur noch ein kurzer Aufruf von LD, und wir haben unseren fertigen Kernel in der Hand (bzw. Maus ;-)): | ||
ld -T link.txt -o kernel.bin asmKernel.o cKernel.o Kernel.o | ld -T link.txt -o kernel.bin asmKernel.o cKernel.o Kernel.o | ||
| − | Und fertig ist unser Kernel! Wie der Kernel nun mitsamt GRUB auf einer Diskette landet kann im Artikel [[C-Kernel_mit_GRUB|C-Kernel mit GRUB]] nachgelesen werden, dort verfährt man einfach analog. | + | Und fertig ist unser Kernel! Wie der Kernel nun mitsamt GRUB auf einer Diskette landet, kann im Artikel [[C-Kernel_mit_GRUB|C-Kernel mit GRUB]] nachgelesen werden, dort verfährt man einfach analog. |
== Anmerkungen == | == Anmerkungen == | ||
| − | Es kann unter Umständen nötig sein, __CTOR_LIST__ etc. durch _CTOR_LIST__ zu ersetzen, also das _ | + | Es kann unter Umständen nötig sein, __CTOR_LIST__ etc. durch _CTOR_LIST__ zu ersetzen, also das _ wegzulassen. Ich vermute, dass das von der GCC-Version abhängig ist. |