C++-Kernel mit GRUB — Änderungen 6425 → 6433

Zeile 10: Zeile 10:
  
 
void main() {
 
void main() {
−
Video screen; // Screen instanzieren
 
 
screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau
 
screen.color(0x7000); // Vordergrund schwarz, Hintergrund hellgrau
 
screen.clear(); // Bildschirm leeren
 
screen.clear(); // Bildschirm leeren
−
screen.write("Willkommen im C++-TestKernel!"); // Textausgabe
+
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
−
void write(const char* cp); // Textausgabe
+
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:
 
}
 
}
  
−
void Video::write(const char *cp){
+
Video& Video::operator << (const char* s){
−
while (*cp != '\0'){
+
while (*s != '\0'){
−
put(*cp++); // Für jedes einzelne Zeichen wird put() aufgerufen
+
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
−
; TODO extern destructors ; aus Startup.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
−
  ; TODO call destructors    ; Destruktoren 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 cKernel.c haben und er diese beim Linken berücksichtigen soll.
+
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 in der Hand (bzw. Maus ;-)):
+
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
  
−
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.
+
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 ==