Autor Thema: Projekt: Eigener Emulator  (Gelesen 15055 mal)

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« am: 04. January 2006, 22:28 »
In den letzten 2 Nächten hab ich mich mal mit dem Schreiben eines eigenes Emulators beschäftigt - also sowas wie Bochs selber machen. Ich hab einfach mal blind drauflos programmiert und bin zu einem "soliden Anfang" gekommen.
Inzwischen hab ich mich auch mal mit der Theorie hinter der Emulation von Prozessoren/PCs beschäftigt: Es gibt 3 Möglichkeiten ein Programm auszuführen
   o 1 - Interpretation: Es wird ein Byte gelesen, decoded, ausgeführt, usw. Relativ einfach, gut erweiterbar (Debugging!), langsam. Bochs scheint diese Methode zu verwenden, mein Emualtor auch
   o 2 - Static Recompilation: Programm wird vor dem Ausführen in den Befehlssatz des aktuellen Prozessors konvertiert. Wäre schnell, ist aber heute nicht mehr praktikabel
   o 3 - Dynamic Recompilation: Genauso wie 2, aber der Code wird Stück für Stück und zur Laufzeit konvertiert. Schnell und auch heute praktikabel, aber Features wie Debugging sind fast unmöglich, außerdem ziemlich schwer zu programmieren. QEMU benutzt diese Technik.

Aber wieder zurück zu meinem Anfang...
Das ganze hat den grandiosen Namen MyEmu, ist in C++ geschrieben und hat momentan ca. 900 Zeilen Code. Man darf aber noch nicht allzu viel erwarten! Momentan kann man dem Emulator nur ein Diskimage mitgeben, dessen "Bootsector" dann in einen virtuellen Arbeitsspeicher an die Adresse 0x7C00 geladen wird - kennt man ja. Da beginnt dann auch die eigentliche Emulation. Allerdings bin ich noch nicht allzu weit - ich hab bisher nur ne Menge MOV-Varianten implementiert und die Befehle HLT und NOP. Das Ziel ist möglichst viel zu unterstützen, Features wie PMode will ich erstmal weglassen - zu kompliziert. Aber ein einfaches RealMode OS sollte man Ende darauf laufen.
Ich würde das Projekt gerne fortsetzen, um das echte Innenleben eines Prozessors besser kennen zu lernen und weil mir die Idee so gut gefäält, aber ich hab leider zu wenig Zeit. Wenn also Interesse besteht würde ich gerne zusammen mit einem kleinen Team weitermachen oder das ganze gleich unter die GPL stellen. Wenn jemand noch Fragen hat kann er die hier posten.

---Downloads---

Binary, Beispiele, Kurze Übersicht über alle Klassen (Linux)
Die Windows-Version kommt vermutlich in den nächsten Tagen...

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #1 am: 04. January 2006, 23:30 »
Boar, echt ne total geile Idee. Nur schade das du es in C++ schreibst (ich kann nur ASM ;) ). Aber ich habe mir soetwas auch schon mal überlegt zu machen. Aber bis jetzt nur überlegt. Ich würde es dann allerdings für mein OS schreiben. Aber die Idde finde ich genial (weil ich sie ja auch hatte ;) ).

bitmaster

PS: Dein Link funktioniert nicht.
In the Future everyone will need OS-64!!!

Homix

  • Beiträge: 138
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 04. January 2006, 23:35 »
hi,
ich wollt auch mal so n Emulator schreiben, aber bin dann zurückgeschreckt, da man doch die ganzen Hardwaresachen wie Floppy und Maus und so korrekt emulieren muss, und das ist doch ziemlich aufwändig.

mfg,
stefan

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 04. January 2006, 23:59 »
Thx schonmal für die positiven Rückmeldungen, es scheint also Interesse zu bestehen :)

Zitat von: stefan2005
ich wollt auch mal so n Emulator schreiben, aber bin dann zurückgeschreckt, da man doch die ganzen Hardwaresachen wie Floppy und Maus und so korrekt emulieren muss, und das ist doch ziemlich aufwändig.

Es ist schon ziemlich aufwendig überhaupt so weit zu kommen, das man Floppy, usw. emulieren muss/kann ;) Aber aus dem Grund hab ich mir ja überlegt das ganze nicht allein zu machen.

Zitat von: bitmaster
Aber ich habe mir soetwas auch schon mal überlegt zu machen. Aber bis jetzt nur überlegt. Ich würde es dann allerdings für mein OS schreiben

Der bisherige Anfang müsste absolut portabel sein. Wenn du für dein OS also einen C++-Compiler + Standardbibliothek hast sollte man den Emulator ohne Änderung bei dir kompilieren können.

Zitat von: bitmaster
PS: Dein Link funktioniert nicht.

Hm, komisch bei mir funktioniert der...
Versuch am besten mal was mit der Adresse anzufangen: http://home.pages.at/darkthing/myemu.tar.gz

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #4 am: 05. January 2006, 00:45 »
Ich hätte Interesse an einem Emulator mitzuwerkeln, aber ich hab (noch) keine Ahnung von den Opcodes. Würde mich sehr freuen wenn da irgendwas zustande kämme. Könntest du vllt den sourcecode auch freigeben, damit man sich davon ein Bild machen kann?

btw. myemu gibt nen segmentation fault beim zugriff auf den videospeicher
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #5 am: 05. January 2006, 01:26 »
architektur?
\\o
o//
\o/

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 05. January 2006, 15:23 »
Architektur: Ich hab versucht alles halbwegs flexibel zu halten, aber im Moment gibts nur Ansätze von x86.

Opcodes: Ich hab auch nicht wirklich viel Ahnung von denen ^^. Aber es gibt einige Intel-Manuals, in denen die ganz gut erklärt sind (inklusive Übersicht mit allen Opcodes)

Segmentation Fault: Wie greifst du denn auf den Video Speicher zu? Momentan geht nur sowas:
mov [0xB800], 'A'
Und selbst das macht in der Version von oben noch Probleme (sprich geht nicht). In einer neueren Version funktioniert das problemlos. Außerdem habe ich in der neuen Version angefangen Segmentierung, Interrupts, ... zu unterstützen.

Source Code Freigabe: Ich denk noch über die Lizenz (GPL?) nach. Außerdem werd ich nochmal Code nach zu unschönen Stellen durchsuchen und die überarbeiten. Wenn dann alles geklärt und fertig ist werd ich wohl ein Paket veröffentlichen, dass den Source, Beispiele und einige Dokumente enthält.

Windows Version: Ich hab versucht myemu mit dem Visual Studio .Net zu compilieren. Aber das VS .Net kommt scheint mit solchen Sachen Probleme zu haben:
string s;
if(s != "") {}

Also lass ich das. DJGPP hab ich nur in der 32bit-Version, die aber mit meinem neuen 64bit-Prozessor nicht kompatibel ist. Sobald ich das totzdem compiliert krieg, gibts auch ein Windows-Binary.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #7 am: 05. January 2006, 18:24 »
Zitat von: DarkThing
Segmentation Fault: Wie greifst du denn auf den Video Speicher zu? Momentan geht nur sowas:
mov [0xB800], 'A'
Und selbst das macht in der Version von oben noch Probleme (sprich geht nicht). In einer neueren Version funktioniert das problemlos. Außerdem habe ich in der neuen Version angefangen Segmentierung, Interrupts, ... zu unterstützen.


ich hab einfach das Beispiel genommen, versucht auszuführen, dann steht in der Konsole am Ende "Segmentation fault" dran. Dann hab ich das Beispiel abgeändert, so das die mov's in den vram nicht mehr ausgeführt werden und kein "Segmentation fault" trat auf.

btw. bei opensvn.csie gibts kostenlos und ohne irgendwelche Bedingungen an die Lizenz, ein subversion repository :!:

[edit: Welche neuere Version :?: Ich hab halt die, die du zum Download angeboten hast ausprobiert. Aber wenn du das bereits beoben hast is es ja eh wurscht]
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 05. January 2006, 18:27 »
Okay, ich hab noch einige Sachen hinzugefügt:
o Bytes in den Speicher schreiben
o VideoDevice (also Textausgabe ist möglich - aber noch nicht optimal)
o Register-Klasse ergänzt (immer noch nicht fertig, der Rest ist aber momentan nicht so wichtig)
o Segmentierung angefangen (CS & SS werden beachtet, lassen sich aber noch nicht ändern ;) )
o Stack-Klasse komplett überarbeitet (wird aber noch nicht eingesetzt)
Zusätzlich exisitiert jetzt ein Minimum an Dokumentation.

Jeder der Zeit und Lust hat mitzumachen, kann sich ja hier melden und sagen, was er gerne machen würde (z.B. einfach nur weitere Opcodes hinzufügen). Derjenige kriegt dann den kompletten Source inkl. allem was dazugehört (6.3MB als .tar.gz). Sobald der Emulator dann eine gewisse Funktionalität bietet, werde ich ihn wohl unter die GPL setzen.

>>>---EDIT---<<<
Die neue Version hab ich noch nicht hochgeladen. Hier der Link für die neue binary:
http://home.pages.at/darkthing/myemu

Und danke für den Link ;)

Kevin_

  • Beiträge: 52
    • Profil anzeigen
    • http://fishing-online.lite-os.de
Gespeichert
« Antwort #9 am: 05. January 2006, 18:27 »
darkthing: es gibt auch noch mingw und cygwin, wenn du dir die nich installierenw ilslt schick mir den source und ich mach dir ne binary :)
@lizenz: nehm am besten wirklich die gpl

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #10 am: 05. January 2006, 18:39 »
ok funktioniert jetzt, könntest du mir den Code schicken :?:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 05. January 2006, 18:43 »
Okay ich werd ihn dir erstmal per eMail schicken (ca 6,5 MB!!) - wär wirklich toll wenn du mithelfen würdest!  :)

EDIT: Okay, sollte jetzt da sein!

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #12 am: 05. January 2006, 19:31 »
danke, habs bekommen und bin grad dabei mir des anzuschauen.
Bist du über icq nicht erreichbar :?:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #13 am: 05. January 2006, 23:36 »
du willst einen emulator schreiben, legst dich aber nicht mal auf die architektur fest? wie darf man das verstehen? ich nehme mal stark an, dass du opcodes interpretierst und nicht source-code?
\\o
o//
\o/

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #14 am: 05. January 2006, 23:50 »
Zitat von: hannibal
du willst einen emulator schreiben, legst dich aber nicht mal auf die architektur fest? wie darf man das verstehen? ich nehme mal stark an, dass du opcodes interpretierst und nicht source-code?

Dem Emulator wird über Kommandozeilenparameter die zu emulierende Architektur übergeben. Alle Prozessoren werden von der abstraktren Basisklasse CPU abgeliten. Nach auswerten der Kommandozeilenparameter wird dann die richtige Prozessorklasse erstellt und die führt dann die Befehle aus. Aber imho wird als aller erstes und auch als wichtigstes x86 emulierbar werden.
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #15 am: 06. January 2006, 14:39 »
Zitat von: bluecode
Zitat von: hannibal
du willst einen emulator schreiben, legst dich aber nicht mal auf die architektur fest? wie darf man das verstehen? ich nehme mal stark an, dass du opcodes interpretierst und nicht source-code?

Dem Emulator wird über Kommandozeilenparameter die zu emulierende Architektur übergeben. Alle Prozessoren werden von der abstraktren Basisklasse CPU abgeliten. Nach auswerten der Kommandozeilenparameter wird dann die richtige Prozessorklasse erstellt und die führt dann die Befehle aus. Aber imho wird als aller erstes und auch als wichtigstes x86 emulierbar werden.

Genau so ist es! Man muss also schon den größten Teil neu schreiben, um eine neue Architektur zu unterstützen, aber eben nicht alles ;)

Zitat von: hannibal
ch nehme mal stark an, dass du opcodes interpretierst und nicht source-code?

Ja, ich interpretiere Opcodes.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #16 am: 06. January 2006, 15:34 »
Unter cygwin lässt sichs problemlos kompilieren (nur die Exe wird dann 493kB groß  :shock: ). Unter VC++ 2005 lässt sichs auch problemlos kompilieren, wenn man die Strings nicht vergleicht, sondern die Stringlänge mit 0 vergleicht. Ist genau des gleiche. Ich werds später ändern.

@DarkThing: Wie/wann kann man dich am besten erreichen :?:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #17 am: 06. January 2006, 17:07 »
@bluecode: Du kannst ja mal die Windows-Binaries veröffentlichen, wenn du willst. Und das Phänomen der riesigen Exe-Files kenn ich auch von DJGPP - keine Ahnung warum die so groß werden.

@Rest: Es scheint Fortschritte zu machen! Wenn das so weiter geht kann man bald schon sinnvolle (Real Mode-) Sachen emulieren.

Zitat von: bluecode
@DarkThing: Wie/wann kann man dich am besten erreichen

Erstmal ist eMail oder PN ganz gut. Meisten hol ich 1-2mal pro Tag meine Mails ab, also sollte das funktionieren. Ansonsten per ICQ - aber da bin ich manchmal mehrere Tage lang nicht online.

stultus

  • Beiträge: 486
    • Profil anzeigen
Gespeichert
« Antwort #18 am: 06. January 2006, 17:08 »
hätte auch interesse mir den source zu lernzwecken anzusehen und evtl. mitzumachen (falls ich was finde das ich kann und noch fehlt ^^), wo gibts nen download?
MSN: planetconquestdm@hotmail.de
ICQ: 190-084-185

... Wayne?

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 06. January 2006, 19:55 »
Zitat von: N00B
hätte auch interesse mir den source zu lernzwecken anzusehen und evtl. mitzumachen (falls ich was finde das ich kann und noch fehlt ^^), wo gibts nen download?

Das Projekt ist im Moment Closed Source. Vielleicht wird es später mal zu nem Open Source Projekt, mal sehen. Mitmachen kannst du natürlich trotzdem, wenn du Interesse hast, kannst du mir irgendwie mitteilen, was du gerne machen würdest (können auch einfache Sachen sein, wie Opcodes hinzufügen, Code tunen/warten/überarbeiten/berichtigen) und du wirst Zugriff auf dem kompletten Source bekommen (via SVN).

 

Einloggen