| Zeile 10: | Zeile 10: | ||
void main() { | void main() { | ||
| − | |||
screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau | screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau | ||
screen.clear(); // Bildschirm leeren | screen.clear(); // Bildschirm leeren | ||
| − | screen | + | screen << "Willkommen im C++-TestKernel!"; // Textausgabe |
} | } | ||
</cpp> | </cpp> | ||
| Zeile 31: | Zeile 30: | ||
~Video(); // Destruktor | ~Video(); // Destruktor | ||
void clear(); // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen | void clear(); // Leeren des Bildschirms, die Größe beträgt 80x25 Zeichen | ||
| − | + | Video& operator << (const char* s); // 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 | ||
| Zeile 40: | Zeile 39: | ||
unsigned int screen_color; // FB/BG-Farbe | unsigned int screen_color; // FB/BG-Farbe | ||
}; | }; | ||
| + | |||
| + | extern Video screen; // Globale Instanz der Video-Klasse, Definition in Video.cpp | ||
#endif | #endif | ||
| Zeile 50: | Zeile 51: | ||
<cpp> | <cpp> | ||
#include "Video.h" | #include "Video.h" | ||
| + | |||
| + | Video screen; | ||
Video::Video(){ | Video::Video(){ | ||
| Zeile 70: | Zeile 73: | ||
} | } | ||
| − | + | Video& Video::operator << (const char* s){ | |
| − | while (* | + | while (*s != '\0'){ |
| − | put(* | + | put(*s++); // Für jedes einzelne Zeichen wird put() aufgerufen |
} | } | ||
| + | return *this; | ||
} | } | ||
| Zeile 95: | Zeile 99: | ||
=== Startup.cpp === | === Startup.cpp === | ||
| − | Um die Konstruktoren bzw. die Destruktoren von globalen/statischen Objekten aufzurufen (siehe auch [[C++#globale.2Fstatische_Objekte|C++]]), wird die Funktion initialiseConstructors aus [[C++#Konstruktoren|C++]] benötigt. Diese wird später mit in den Kernel gelinkt und in der asmKernel.asm aufgerufen. | + | Um die Konstruktoren bzw. die Destruktoren von globalen/statischen Objekten aufzurufen (siehe auch [[C++#globale.2Fstatische_Objekte|C++]]), wird die Funktion initialiseConstructors aus [[C++#Konstruktoren|C++]] benötigt. Diese wird später mit in den Kernel gelinkt und in der asmKernel.asm aufgerufen. Die Destruktoraufrufe von globalen/statischen Objekten werden absichtlich nicht aufgerufen, da es innerhalb des Kernels der Erfahrung von [[Benutzer:Bluecode | bluecode]] nach keinen Sinn macht bei (globalen/statischen!) Objekten den Destruktor zu verwenden. Falls man dies dennoch möchte kann man im Artikel [[C++#Destruktoren (ohne --enable-__cxa_atexit und ohne -fuse-cxa-atexit | C++]] einer der beiden relevanten Abschnitte implementieren. |
=== asmKernel.asm === | === asmKernel.asm === | ||
| Zeile 104: | Zeile 108: | ||
global loader ; Unser Einsprungspunkt | global loader ; Unser Einsprungspunkt | ||
extern main ; main() aus Kernel.cpp | extern main ; main() aus Kernel.cpp | ||
| − | |||
extern initialiseConstructors ; aus Startup.cpp | extern initialiseConstructors ; aus Startup.cpp | ||
| Zeile 124: | Zeile 127: | ||
call initialiseConstructors ; Konstruktoren aufrufen | call initialiseConstructors ; Konstruktoren aufrufen | ||
call main ; main aufrufen | call main ; main aufrufen | ||
| − | |||
stop: | stop: | ||
| Zeile 183: | Zeile 185: | ||
*(.bss) | *(.bss) | ||
} | } | ||
| + | |||
| + | /DISCARD/ : { *(.dtors) } | ||
} | } | ||
</pre> | </pre> | ||
| − | Wir teilen dem Linker mit, dass wir die Labels start_ctors, end_ctors, start_dtors und end_dtors in der Datei | + | Wir teilen dem Linker mit, dass wir die Labels start_ctors, end_ctors, start_dtors und end_dtors in der Datei Startup.cpp haben und er diese beim Linken berücksichtigen soll. Außerdem wird die Liste der Destruktoren aus der aus dem Kernel entfernt, da sie wie oben erklärt nicht verwendet werden. |
| − | Nur noch ein kurzer Aufruf von LD, und wir haben unseren fertigen Kernel | + | Nur noch ein kurzer Aufruf von LD, und wir haben unseren fertigen Kernel: |
ld -T link.txt -o kernel.bin asmKernel.o Startup.o Video.o Kernel.o | ld -T link.txt -o kernel.bin asmKernel.o Startup.o Video.o Kernel.o | ||
| − | + | Wie der Kernel nun mitsamt GRUB auf einer Diskette landet, kann im Artikel [[C-Kernel_mit_GRUB|C-Kernel mit GRUB]] nachgelesen werden. Hier verfährt man einfach analog. | |
== Siehe auch == | == Siehe auch == | ||