C++-Kernel mit GRUB — Änderungen 6399 → 6402

Zeile 3: Zeile 3:
  
 
== Kernel ==
 
== Kernel ==
−
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.
+
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 Schwarz, Hintergrund Dunkelgrau
+
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 liegt bei 80x25 Zeichen
+
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 Dunkelgrau auf Schwarz
+
screen_color = 0x0700; // Setzen der Farbe auf Hellgrau auf Schwarz
 
pos=0; // Setzen der Textausgabe auf
 
pos=0; // Setzen der Textausgabe auf
−
off=0; // link soben.
+
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: ; endlos Schleife nach Beendung unseres Kernels
+
stop: ; Endlosschleife nach Beendigung unseres Kernels
 
  jmp stop
 
  jmp stop
 
   
 
   
Zeile 160: Zeile 160:
  
  
−
Nun zu einer der wichtigsten Stellen: Dem Linkvorgang:
+
Nun zu einer der wichtigsten Stellen, dem Linkvorgang:
−
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.
+
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__, __CTOR_END, __DTOR_LIST__ und __DTOR_END__ in der Datei cKernel.c haben und er diese beim Linken berücksichtigen soll.
+
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 _ weglassen. Ich vermute, dass das von der GCC Version abhängig ist.
+
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.