@taljeth:
"Fahrplan": Java-Emulator -> x86 Mikrokernel -> HW-DesignZiel ist eine Architektur in Silizium/FPGA, in welcher ein Teil des Kernels in Hardware implementiert ist. Bis es soweit ist, wird noch einige Zeit vergehen. Um Dinge besser zu verstehen, versuche ich x86 an meine Vorstellungen anzupassen. Ich mache
keine VM. Der Emulator in Java is nur der erste Schritt um die Funktionalität zu implementieren. Ich hoffe das Prinzip:
Java-> Import -> Semantic Code -> Export -> Bootbares Imageist nachvollziehbar.
Ich kenne RISC bisher nur aus Dokumenten/Spezifikationen (IBM Power, Sun SPARC, HP PA-RISC), fühle mich jedoch definitiv von den Eigenschaften überzeugt. Speziell die Many-Core-Varianten (60+) haben es mir angetan.
@erik:
Danke für die Antworten. Bitte entschuldige meine Art Gedanken festzuhalten. Abgesehen davon vermute ich, dass es nicht unbedingt notwendig ist, alle Aspekte des Projekts zu kennen. Für uns sind in erster Linie Details zur Implementierung interessant, die im Dokument "Überblick der Architektur" sowieso nicht angesprochen werden. Wobei ich mich natürlich über jegliches Interesse freue und jede Frage gerne beantworten werde.
@erik 2:
Kann ich komplett auf den Stack verzichten? Auch mit interrupts?
Nein.
Ich habe es geahnt. Ich werde einen kleinen Stack anlegen müssen um den Status vor der Unterbrechung wiederherzustellen. Interrupts kommen bei mir generell nur in eine Art Event-Queue, die vom root-Prozess regelmäßig bearbeitet wird. Deshalb leite ich die Einträge der IVT zu einem Interrupt-Handler-Proxy (Bezeichnung adäquat?)
Call-Gates gefallen mir nicht. Kann man die auch weg lassen?
Ja, dann musst Du INT oder SYSCALL oder SYSENTER nutzen um vom Ring 3 in Ring 0 zu kommen. Ich persönlich würde eines der letzten 2 empfehlen aber die sind noch nicht so lange verfügbar was wieder die potentiellen CPUs reduziert.
Der Hypervisor führt immer nur kleine Prozeduren aus und springt dann wieder zurück. Diese Prozeduren kommen aus einem Code-Cache mit x86-Bytecode. Dieser wird aus Semantic Code exportiert (hypervised Export). Diese Prozeduren sollen im Ring 3 laufen, der Hypervisor in Ring 0. Die Prozedur in Ring 3 beinhaltet keine Sprünge (zumindest nicht nach außerhalb der Prozedur).
Wann treten Call-Gates sonst noch auf?
Auch ohne CALLs nur mit JMP?
Diese Frage verstehe ich nicht. Wieso sollte man auf CALL verzichten? Das ergibt für mich persönlich nicht wirklich Sinn.
Da ich keinen Stack über SP verwende (Und damit auch kein CALL, RET, PUSH, POP und alle anderen Instruktionen für den Stack), springe ich vom Hypervisor in die Prozedur und am Ende dieser an eine feste Adresse zurück in den Hypervisor. Die Frage ist: kann ich während diesen JMPs den Ring ändern? So wie ich das verstanden habe, wird der Ring im Segment festgelegt.
Gehen mit (ebx) auch physikalische Adressen?
Solange das Paging aktiv ist kannst Du überhaupt nicht direkt auf physische Adressen zugreifen sondern Du musst immer erst ein passendes Mapping erstellen und mit einer äquivalenten virtuellen Adresse arbeiten.
Andersrum gefragt: kann ich nur mit der Seitennummer aus dem Page Directory und dem Offset direkt auf physikalischen Speicher zugreifen? (Page Tables nutze ich erstmal nicht). Da meine Speicherverwaltung nur Virtuelle Adressen zurückgibt, brauche ich wohl kein LEA?
Es sind noch ein paar Dinge offen, ich schreibe sie hier noch mal hin, damit sie nicht untergehen. Nicht gedrängt fühlen.
Wofür kann ich Tasks noch brauchen, eigentlich habe ich ja den Hypervisor?
falls nicht, dann brauche ich wohl auch kein TSS / TSR
Was haben Tasks mit Multi-Core zu tun? Was bedeutet mehrere Threads per Core?