"Fahrplan": Java-Emulator -> x86 Mikrokernel -> HW-Design
Ziel 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.
Hm, ja, da war ich nicht aufmerksam. Ich hatte außerdem deine Pastebin-Dokumente noch nicht gelesen, was ich jetzt nachgeholt habe. Ich finde den ganzen Aufschrieb ein bisschen konfus, um ehrlich zu sein. Mein größtes Problem ist, dass du zwischen sehr verschiedenen Ebenen hin- und herspringst, ohne überhaupt mal das große Ganze beschrieben zu haben.
Aber gut, wenn ich mich mal an das hier gepostete halte, an welcher Stelle kommt der x86-Mikrokernel ins Spiel? Willst du den Userspace auf deiner Architektur x86-kompatibel halten, dass du das ganze auf x86 probelaufen lassen kannst oder wie?
Ich hoffe das Prinzip:
Java-> Import -> Semantic Code -> Export -> Bootbares Image
ist nachvollziehbar.
Das steht so nirgends, aber immerhin weiß ich jetzt, was ich mit dem Import/Export anfangen soll. Unter diesem Semantic Code kann ich mir noch nichts vorstellen, das ist für mich im Moment einfach eine Zwischensprache, wo Magie passiert. Da wären ein paar Beispiele schön, dass man sich was konkretes drunter vorstellen kann.
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.
Die haben aber eher viele Register und nicht gar keine.
Was ist denn der Grund, dass du auf Allzweckregister komplett verzichten willst? Ich halte das grundsätzlich für keine besonders gute Idee, weil der Compiler (bzw. dann wohl "Exporter" in deiner Terminologie) sich nicht um eine optimierte Registerallokation kümmern kann, sondern der Cache automagisch versucht rauszufinden, was grad ein Register (also im Cache) sein muss und was nicht.
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?
Auf x86 arbeiten alle Instruktionen auf virtuellem Speicher. LEA hat damit nichts zu tun, das berechnet eine virtuelle Adresse, keine physische. Zum Beispiel legen beide folgenden Zeilen den gleichen Wert nach eax:
mov %edx, %eax
lea (%edx), %eax
Man kann damit natürlich alle möglichen Adressierungsarten benutzen, also mit Displacement, Index, Skalierung. "Interessante" Anwendungsmöglichkeiten gibt es auch noch, wenn man gar keine Adressen nimmt, sondern es beispielsweise einfach als Drei-Operanden-add benutzt.
Was bedeutet mehrere Threads per Core?
Meinst du im Kontext von Hyperthreading? Dann wären es logische CPUs.