Hallo,
Wenn der TCG die Performance verzehnfacht
Ob der TCG wirklich zehn mal so schnell ist würde ich dann doch bezweifeln, so arg stupide werde ich meinen CPU-Simulator auch nicht bauen. Nebst dessen das die CPUs ja nicht alles sind, jedes HW-Gerät benötigt schließlich auch mindestens einen eigenen Thread (in echt arbeiten ja auch alle Transistoren in einem PC gleichzeitig und nicht einer nach dem anderen). Wenn mein Simulator für jede simulierte CPU auch eine eigene echte CPU nutzen kann wird schon allein das eine deutlich bessere Effizienz bei der Cache-Nutzung bringen was wohl bestimmt schon mal Faktor 2 oder noch mehr bringen kann. Wenn mein Host-System über genügend CPUs verfügt dann denke ich ist da noch sehr viel mehr drin auch ohne was tolles programmieren zu müssen.
Dann baue deinen Simulator lieber mit Qemu auf und bringe dem gleichzeitig Multithreading bei, dann hätte ich auch was davon.
Das mache ich definitiv nicht alleine! Wenn Du mit hilfst, und auch noch ein paar Kumpels hast, können wir gerne noch mal drüber diskutieren.
Auf der anderen Seite erscheint mir das TCG-Konzept auch gar nicht so arg komplex, ich hab ja bei meiner CPU immer Befehlspakete und ich denke das es gar nicht so komplex wäre aus jedem Paket ein Bündel x86-Assembler-Code zu machen der direkt mit dem CPU-Zustand (also dem Register-File) im Speicher arbeitet. Zumindest die einfachen und mathematischen Befehle sollte so zu erledigen sein, schwieriger sind da wohl eher die Speicherzugriffe und die ganzen anderen System-Befehle aber die könnte man einfach als CALL auf eine in C++ geschriebene Simulation umsetzen (nur die Calling-Convention muss dafür passen). Ich denke der Vorteil meiner CPU ist das sie RISC ist und damit Speicherzugriffe (die ja in jedem Fall durch den eigentlichen Simulator müssen) von den simplen Rechenbefehlen usw. sauber getrennt sind. Vermutlich ist eine simple eigene TCG-Umsetzung leichter als QEMU auf Multithreading umzubauen.
Du solltest grundsätzlich zwei Simulationen bauen. Eine, bei der du jedes Signal simulierst (wird natürlich unglaublich langsam) und damit dein Design verifizieren kannst
Das mach der VHDL-Simulator der wirklich jedes interne Signal und auch jedes Signal auf der Platine simuliert (letzteres muss ich als Test-Umgebung auch in VHDL nachbilden). Und sowas ist wirklich extrem langsam, ich hab mal vor ein paar Jahren ein komplexeres FPGA-Design auf einem P4 2,4GHz simuliert und der hat für etwas über 2 ms simulierter Zeit fast 3 Stunden gebraucht. Mein System mit mehreren CPUs und dem Chipsatz und eventuell noch einem primitiven PCI-Device am South-Port werde ich wohl höchstens für ne halbe Millisekunde simulieren lassen so das ich dort nur mit extra Test-Code verifizieren kann. Wenn ich wirklich in einer Simulation mein OS testen und entwickeln möchte dann geht das nur mit einer rein funktionalen Simulation.
Qemu simuliert eine PIIX3 Southbridge auf einem Intel 440FX Chipsatz. Der ist im Original von 1996 und unterstützt Pentium Pro und Pentium II.
Ich weiß, deswegen sind da ja auch keine PCI-to-PCI-Bridges im simulierten System nötig. Meine CPUs werden aber auf jeden Fall nicht mit einem 440FX zusammenarbeiten können und deswegen werde ich wohl besseren Support der PCI-Infrastruktur benötigen.
Mich macht eigentlich immer stutzig das die normalen OSe das so einfach fressen, wundern die sich nicht wenn eine aktuelle 64Bit-CPU emuliert wird und diese nur einen 440FX zur Seite gestellt bekommt?
OS/2 (zumindest die Versionen 2.1 und Warp 3) läuft in Qemu inzwischen zuverlässig....
Aha, dann ist mein Wissen offensichtlich veraltet.
aber in Bezug auf CPU-Emulation und direkt damit zusammenhängendes Lowlevel-Zeug kenne ich mich auch nicht im Detail aus.
Okay. Gibt es denn irgendwo eine gute/detaillierte Dokumentation zum QEMU-Quell-Code in der steht welche Funktionalität sich in welchem Verzeichnis (oder gar in welcher Datei) befindet oder andersherum? Oder kann man solche Fragen auf einer Mailling-Liste o.ä. loswerden (möglichst in Deutsch)?
aber du benutzt ja MSI
Das sollte zwischen IRQ-Controller und CPU das selbe sein, MSI betrifft ja nur den Weg von den HW-Geräten bis zum IRQ-Controller (und bedeutet im wesentlichen das der IRQ-Controller ein kleines bisschen Speicher anbieten muss, so ne Art Drop-Target das bei mir wieder per PCI-Config-Space (in der Host-Bridge) verwaltet wird, und jeden Schreibzugriff aber nicht wie bei normalen Speicher behandelt sondern ihn auswertet und eine entsprechende Aktion auslöst).
TCG ignoriert die Limits, eben wegen der Performance. Aber es ist möglich (und gab auch mal einen Patch), das zu implementieren. Letztendlich ist es nur ein Implementierungsdetail in deinen load/store-Befehlen, die eben ein paar Checks mehr machen müssen.
Okay, ich denke auch das TCG ansich kein Kriterium gegen den Einsatz von QEMU für meine gesamte Plattform darstellt. Was mich eher stört ist das QEMU nur rein singlethreaded ist, das betrachte ich eigentlich als echtes KO-Kriterium. Für irgendwelche HW-Geräte hinter dem Chipsatz ist mir das relativ egal aber für den Kernbereich meiner Plattform möchte ich auf jeden Fall Multithreading.
im Moment wird an einem Q35-Chipsatz gewerkelt, für den muss das dann wahrscheinlich alles da sein.
Das klingt doch sehr gut.
Was ich weiß, ist dass solches Zeug vor kurzem diskutiert wurde und dass das Ziel ist, die Struktur schon richtig zu emulieren (was andererseits bedeutet, dass das heute nicht der Fall ist).
Okay, im Prinzip ist es mir auch egal ob die simulierten HW-Geräte miteinander kommunizieren können oder nicht. Für die eigentliche Plattform und auch das OS ist das völlig egal, sowas würde eigentlich auch nur auf echter Hardware ein Sicherheitsproblem darstellen. Solange eine eventuelle I/O-MMU nicht umgangen werden kann ist mir dieser Punkt wursch, es ist mir nur gestern Abend noch eingefallen weil ich dieses Thema vor einer Zeit bei der Suche nach geeigneten PCI-Bridges an der Hand hatte.
Das heißt, "atomar" ist so ein Attribut?
Ja, und es wird nur da verwendet wo die Software das ausdrücklich will. Das trifft aber eventuell schon einige Befehle weil ich ja z.B. auch Multi-Register-Lade/Speicher-Befehle habe (so wie ARM auch) und es bei denen schon eher interessant ist die Atomizität sicher zu stellen. Auf echter HW könnte so ein atomischer Zugriff eventuell komplett vom lokalen Cache bearbeitet werden und somit keine zusätzliche Performanceeinbußen bringen, im Simulator hingegen wird sowas wohl immer etwas Performance kosten.
Grüße
Erik