C++-Kernel mit GRUB — Änderungen 6415 → 6418

Zeile 95: Zeile 95:
 
=== Startup.cpp ===
 
=== Startup.cpp ===
  
−
Um die Konstruktoren bzw. die Destruktoren von globalen/statischen Objekten aufzurufen (siehe auch [[C++#globale.2Fstatische_Objekte|C++]]), werden diese beiden Funktionen 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++]]), werden diese beiden Funktionen später mit in den Kernel gelinkt und in der asmKernel.asm aufgerufen: siehe [[C++#Konstruktoren|C++]].
−
 
 
−
<cpp>
 
−
extern "C" void constructors();
 
−
extern "C" void destructors();
 
−
 
 
−
void constructors()
 
−
{
 
−
extern void (*__CTOR_LIST__)();
 
−
void (**constructor)() = &__CTOR_LIST__;
 
−
int total = *(int *) constructor;
 
−
constructor++;
 
−
while(total){
 
−
(*constructor)();
 
−
total--;
 
−
constructor++;
 
−
}
 
−
}
 
−
 
 
−
void destructors()
 
−
{
 
−
extern void (*__DTOR_LIST__)();
 
−
void (**deconstructor)() = &__DTOR_LIST__;
 
−
deconstructor++;
 
−
int total = *(int *) deconstructor;
 
−
while(total)
 
−
{
 
−
(*deconstructor)();
 
−
total--;
 
−
deconstructor++;
 
−
}
 
−
}
 
−
</cpp>
 
  
 
=== asmKernel.asm ===
 
=== asmKernel.asm ===
Zeile 200: Zeile 168:
 
   .data  :
 
   .data  :
 
   {
 
   {
−
     __CTOR_LIST__ = .;LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) *(.ctors) LONG(0) __CTOR_END__ = .;
+
     start_ctors = .;
−
     __DTOR_LIST__ = .; LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) *(.dtors) LONG(0) __DTOR_END__ = .;
+
    *(.ctors)
 +
    end_ctors = .;
 +
 
 +
     start_dtors = .;
 +
    *(.dtors)
 +
    end_dtors = .;
  
 
     *(.data)
 
     *(.data)