Hallo,
In meinem Fall ist bei allen normalen Syscall-Funktionen (in der libOS) ein Stück Inline-Assembler drin das eben den SYSCALL-Befehl enthält und dafür sorgt das die Aufrufkonvention passt, in der Yield-Funktion ist dagegen ein Stück Inline-Assembler drin das den YIELD-Befehl enthält. Ich hatte irgendwann mal die tolle Idee das wenn ich eh einen CPU-lokalen Timer habe der einen eigenen Exception-Vector hat und auch nicht über den IRQ-Controller o.ä. geht (also auch kein EOI o.ä. benötigt) dann kann ich diesen Mechanismus auch gleich mit einen extra Befehl verfügbar machen, wimre hab ich mich dabei von irgendeiner anderen CPU inspirieren lassen aber ich weiß nicht mehr von welcher CPU-Architektur (diese Idee ist also nicht ganz von mir aber ich finde die trotzdem toll und sehr zweckdienlich). Für meine CPU und auch den Scheduler macht es absolut keinen Unterschied ob die spezielle Yiel-Exception gekommen ist weil der Zeitscheiben-Counter abgelaufen ist oder ob ein YIELD-Befehl kam (das könnte der Kernel auch nur feststellen indem er sich den als letztes im User-Mode ausgeführten Befehl anschaut) so das ich damit auch nicht solche Probleme haben kann wie FlashBurn mit kämpft. Den richtigen Timer im Chipsatz (eine Art HPET, der auch über den IRQ-Controller läuft) wird nicht für die Zeitscheiben verwendet. Nebst dessen das es bei mir auch nur einen einzigen Befehl gibt der den Wechsel vom System-Mode in den User-Mode ermöglicht so das ich da auch keine Unterscheidung benötige (wie auf x86 mit SYSRET vs. IRET).
Meine Bemerkung mit dem "nicht gut designt" war auch nicht so ganz ernst gemeint, mir ist schon klar das keiner von Euch um die Probleme und Altlasten bei x86 einfach so drumherum designen kann.
Grüße
Erik
Ist das ein Widerspruch? Syscalls laufen doch in der Regel auch durch ein bisschen Assemblercode?Ja, natürlich, der Compiler erzeugt ja nicht direkt den Syscall-Befehl. Warum eigentlich nicht? Das wäre doch mal ne colle Sache.
In meinem Fall ist bei allen normalen Syscall-Funktionen (in der libOS) ein Stück Inline-Assembler drin das eben den SYSCALL-Befehl enthält und dafür sorgt das die Aufrufkonvention passt, in der Yield-Funktion ist dagegen ein Stück Inline-Assembler drin das den YIELD-Befehl enthält. Ich hatte irgendwann mal die tolle Idee das wenn ich eh einen CPU-lokalen Timer habe der einen eigenen Exception-Vector hat und auch nicht über den IRQ-Controller o.ä. geht (also auch kein EOI o.ä. benötigt) dann kann ich diesen Mechanismus auch gleich mit einen extra Befehl verfügbar machen, wimre hab ich mich dabei von irgendeiner anderen CPU inspirieren lassen aber ich weiß nicht mehr von welcher CPU-Architektur (diese Idee ist also nicht ganz von mir aber ich finde die trotzdem toll und sehr zweckdienlich). Für meine CPU und auch den Scheduler macht es absolut keinen Unterschied ob die spezielle Yiel-Exception gekommen ist weil der Zeitscheiben-Counter abgelaufen ist oder ob ein YIELD-Befehl kam (das könnte der Kernel auch nur feststellen indem er sich den als letztes im User-Mode ausgeführten Befehl anschaut) so das ich damit auch nicht solche Probleme haben kann wie FlashBurn mit kämpft. Den richtigen Timer im Chipsatz (eine Art HPET, der auch über den IRQ-Controller läuft) wird nicht für die Zeitscheiben verwendet. Nebst dessen das es bei mir auch nur einen einzigen Befehl gibt der den Wechsel vom System-Mode in den User-Mode ermöglicht so das ich da auch keine Unterscheidung benötige (wie auf x86 mit SYSRET vs. IRET).
Oder anders gesagt: Was designst du anders und wieso ist ein Syscall falsch/nicht designt?Naja, mein Vorteil ist das ich mir anschaue welche Probleme ich in der SW eventuell haben könnte und dann überlege ob es da nicht eine elegante Möglichkeit gibt das gleich in HW zu umgehen, das geht natürlich nicht wenn man für eine fest vorgegebene Architektur ein OS entwickelt. Mein RFS-Befehl (mit dem man vom System-Mode in den User-Mode kommt) ist auch absolut unabhängig vom Stack so das der auch innerhalb einer beliebig tiefen Unterfunktion funktioniert (der aktuelle System-Mode-Stack wird dann einfach verworfen) so das ich auch nicht diese typischen Assembler-Stubs, wie die 256 bei x86, benötige.
Meine Bemerkung mit dem "nicht gut designt" war auch nicht so ganz ernst gemeint, mir ist schon klar das keiner von Euch um die Probleme und Altlasten bei x86 einfach so drumherum designen kann.

Grüße
Erik

Übersicht
Wiki
Hilfe
Suche
Einloggen
Registrieren
Drucken

Gespeichert

Muss man mit leben.