Hallo,
Tja, mein Kernel nähert sich so langsam der 64kB-Marke (ist eben ein Monolith) und da tauchen die Probleme auf. Ich habe keine Ahnung, woran es liegen kann, mein Bootloader kann zweifellos über RealMode-Segmentgrenzen hinaus laden und das Restsystem läuft im ProtectedMode mit Paging, sollte also keine Probleme mehr mit diesen 64kB haben.
Also, die Probleme sind:
- Globale Variablen, die initialisiert werden (z. B.: "char *ConsoleBase = (char *)0x800B8000)") sind im Programm uninitialisiert.
- Unter QEMU gibt es einen TripleFault, wenn ich eine Zeile Code zusätzlich schreibe oder eine zusätzliche Variable einfüge (wo auch immer), entferne ich diese wieder, ist alles in Ordnung. Übrigens geht dem TripleFault ein Pagefault voraus, laut dem der Stack nicht gemappt sei.
- Gestartete Programme beenden sich zuerst mit einem Pagefault, starte ich sie später mit den gleichen Parametern noch einmal, ist alles in Ordnung.
Aber das wohl merkwürdigste ist, dass der Kernel noch gar nicht 64kB groß ist. Er hat bloß eine Größe von jetzt genau 62700 Bytes...
Bis jetzt habe ich ihn einfach dadurch klein gehalten, dass ich die Alignflags im Linkerscript entfernt (bzw. auf 1 gesetzt) habe, doch jetzt ist das alles ausgereizt.
Ich dachte, dass es an einem RealMode-Stack liegen könnte, der in den Kernel hineinwächst (der Kernel wird nach 0x10000 geladen, es hätte ja einen Stack bei 0x1000:0xFFFF geben können), doch dem ist nicht so (mein ProtectedMode-Stack liegt übrigens bei 0x4FFFFF). Der Bootloader überschreibt auch keine Daten des Kernels oder so.
Bis jetzt habe ich versucht, dieses Problem einfach - so gut es ging - zu ignorieren, doch das wird nun immer schwerer (neue Treiber sind unmöglich geworden). Ich hoffe, jemand von euch hat eine Ahnung, woran das ganze liegen könnte.
P. S.: Bitte sagt mir jetzt nicht, dass das ein guter Zeitpunkt zum Umsteigen auf einen Microkernel wäre...