Hallo,
Naja, den Stack, auf dem man grad läuft, sollte man vielleicht nicht sofort freigeben (vorausgesetzt man benutzt einen Kernelstack pro Thread, ansonsten stellt sich das Problem natürlich nicht).
Das ist einer der Gründe warum ich im System-Mode einen CPU-verwalteten Stack haben möchte.
Ja, solange du dein OS als untrennbaren Bestandteil der Plattform siehst, lässt sich das alles rechtfertigen. Es ist halt alles recht starr, so dass du die Hardware gleich mitändern musst, wenn dir das OS nicht mehr gefällt.
Es geht mir weniger ums rechtfertigen, es geht mir darum das ich im VHDL-Code für die CPU nichts implementieren möchte was ich im Assembler/C-Code für das OS nicht auch benutze. Mir ist klar das dadurch meine Plattform nicht sonderlich flexibel sein wird aber schlussendlich brauche ich auch nur einen Weg um mein Ziel zu erreichen. Solange dieser Weg ein guter Weg ist bin ich damit zufrieden. dieser Weg wird mir wohl sehr schnelles IPC und durchgehendes Zero-Copy ermöglichen so das ich pro CPU-Takt sicher eine recht hohe Performance erreichen werde. Sollte ich tatsächlich konzeptionelle Probleme im OS oder in der Plattform finden bedeutet das natürlich das mit hoher Wahrscheinlichkeit das andere auch geändert werden muss.
Och, beim i386 hat man es auch sehr erfolgreich geschafft, die Segmentierung zu ignorieren. Warum sollte das bei deiner Architektur nicht klappen?
Dann wirst Du auch auf das Paging verzichten müssen (zumindest zum Speicherschutz), auf meiner Plattform gibt es nur ein Paging-Directory auf das alle CPUs zugreifen und zum wechseln muss man vielleicht sogar das Paging kurz abschalten (macht sich wahrscheinlich im VHDL-Code leichter wenn man nicht in ein aktives System eingreifen muss). Meine Segmente wird man wohl auch nicht so ohne weiteres auf Flat-Memory-Simulation umstellen können, nebst dessen das im System-Mode erstmal direkt mit den physischen Adressen gearbeitet wird (außer für den System-Mode-Stack der liegt in einem CPU-spezifischen Segment). Es ist sicher nicht gänzlich unmöglich auf meiner Plattform ein OS ohne Segmentierung laufen zu lassen aber dafür ist meine Plattform einfach nicht konzipiert und dementsprechend umständlich wird dieses Unterfangen werden. Es ist sicher auch extrem schwierig mein OS auf ner anderen Plattform laufen zu lassen (selbst i386 könnte schwierig werden), es wird einfach zu anhängig von den speziellen Features meiner Plattform sein.
Du nimmst ja auch keinen Schraubendreher um einen Nagel in die Wand zu klopfen obwohl man das damit schon irgendwie hinbekommen kann. Oder doch?
Deine anderen Entscheidungen, die praktisch nur einen Mikrokernel zulassen, blockieren das ganze wohl effektiver.
Ich habe mich vor etwa 2 Jahren ganz klar für Micro-Kernel entschieden und genau darauf wird meine Plattform optimiert. Meine Plattform soll nicht viel können aber das was sie kann soll sie überragend gut machen.
Das bedeutet aber das mindestens CreateThread() und KillThread() doppelt oder zumindest mit verschiedenen Ausführungspfaden da sein müssen.
Nope, nur CreateThread() (und selbst das könnte ich verhindern, denn der Unterschied ist wirklich minimal bzw. werde ich das bald über ein Flag machen => läuft auf eine if-Schleife hinaus mit einmal 5 Zeilen und einmal 3 Zeilen Code) und KillThread interessiert es wieder gar nicht was für ein Thread das ist, da man eh auf ungültige Werte prüfen sollte.
Sicher? Für einen User-Mode-Thread musst Du auch einen User-Mode-Stack anlegen und wieder löschen, für einen Kernel-Mode-Thread nicht. Auch muss ein User-Mode-Thread zu einem Prozess gehören im Gegensatz zu einem Kernel-Mode-Thread. Ich denke diese kleinen Fallunterscheidungen werden noch an einigen anderen Stellen erforderlich sein.
Da brauchst du dann aber ein wirklich gutes kfree(). Denn wenn auf allen CPUs zur gleichen Zeit Threads beendet werden und diese ihre Ressourcen (je nach dem wie viele das sind, könnte das auch mal dauern) freigeben, müsstest du ja irgendwo einen Lock (mind.) haben und da sind wir dann wieder da was man als lange empfindet. Denn in der Zeit kann ja nichts anderes gemacht werden, da ja dein Kernel nicht unterbrechbar ist.
Der kritische Abschnitt in dem kfree wird wohl auf wenigen dutzend Assemblerbefehlen mit vielleicht 6 Speicherzugriffen hinauslaufen, klar wäre es unschön wenn da wirklich 8 CPUs zur
exakt gleichen Zeit durch wollen aber wie wahrscheinlich ist das? Es geht darum das auf mehreren CPUs mit einem zeitlichen Abstand von deutlich unter einer µs gleichzeitig Speicher freigeräumt werden muss, das passiert nicht gerade nennenswert häufig. Mit einem geschickten (hierarchischen) Aufbau der Kernel-Heap-Verwaltung muss es vielleicht noch nicht mal zwangsläufig zu einer Kollision kommen.
Grüße
Erik