[C#] Einen virtuellen PC programmieren -- oder so ein Prinzip von abgschott. Umgebung

Clocker 2800+

Lt. Commander
Registriert
Apr. 2007
Beiträge
1.409
Hallo,

ich möchte gerne ein C# einen virtuellen PC programmieren. Oder zumindest so ein Prinzip wie "Sandboxie", "DosBox" oder "Qemu".

Also wie eine abgeschottete Umgebung, in dem man dann ein Programm starten (laufen) lassen kann.

Wer kann mir da helfen ?
Eventuelle gute C#-Forums zeigen ?

Codebeispiel ? (Anfänge).
 
Zuletzt bearbeitet:
Besitzt Du eigentlich Erfahrungen in der Programmiersprache C#?

Denn für dieses Programm brauchst Du schon recht tiefe Kenntnisse in API und überhaupt ist die Sprache für die Idee eher ungeeignt, besser wäre hardwarenahe Programmiersprache wie Assembler (für verrückte Programmierer :D ) oder C++.

Es gibt ein vernünftiges Forum, wo es nur um die Programmiersprache C# geht: http://www.mycsharp.de

Aber wie gesagt, das ist ein Projekt, welches Du niemals allein schaffen kannst oder wenn doch dauert es extrem lange.
 

Aber ein LISP-Dialekt ist die wohl schlechteste Programmiersprache um eine virtuelle Maschine zu programmieren. Oder hab ich das Buch falsch in Erinnerung?

In Sachen Betriebssysteme (und wie ich das sehe soll deine virtuelle Maschine so was machen) wirst du kaum um Assembler rumkommen. Ich wüsste jetzt z.B. nicht wie man flüchtige Register in C sichert. Wie von Obelisk_19 bereits angemerkt, ist das Ganze alles andere als trivial...
 
Gluehwurm:
Er soll ja nicht Copy&Paste aus dem Buch machen, sondern es lesen und damit lernen, wie man das macht, was er will.
Dann kann er das in der Sprache seiner Wahl umsetzen.

Was das Auslesen von Registern in C angeht, siehe ggf. ptrace().
 
Er soll ja nicht Copy&Paste aus dem Buch machen, sondern es lesen und damit lernen, wie man das macht, was er will.
Dann kann er das in der Sprache seiner Wahl umsetzen.
Schon klar. Ich habe mir nur die ganzen Klammern vorgestellt... ;)

Danke, kannte ich noch gar nicht. Aber ich nehme mal an das ist genauso wie PThread auf Linux-Systeme bezogen. Ausserdem sagen die man-pages folgendes:
The parent may access the child only when it is stopped
Das sind drei Enschränkungen: Erstens, eine Eltern-Kind-Prozess-Hierarchie, zweitens, dass der Prozess gestoppt sein muss, und drittens, dass es sich um (Linux-)Prozesse handelt und nicht z.B. um Koroutinen. In wie weit das Ganze problematisch bei der Programmierung einer virtuellen Maschine wird kann ich nicht sagen, denn ich hab sowas in dieser Größenordnung noch nie gemacht.
 
Mit entsprechenden Rechten kann man mit ptrace() auch einen Prozess abfragen, der kein child des ursprünglichen Prozesses ist.
Wenn man dan detacht läuft der andere Prozess auch weiter. Und man muss im die Register ja nicht ständig auslesen, sondern nur bei worldswitches.
 
Das hatte ich mir fast gedacht, dass so was am besten nur in C gemacht werden kann.

P.S.
Wie kann ich .c und .h Dateien (Programmiersprache C) öffnen, bearbeiten und zu einer lauffähigen exe-Datei kompilieren ?

Denn bei chip.de http://www.chip.de/suche/suche.html?q=microsoft+c&cat=0102&submit=suchen&tpl=only&np=0
kann man nur die ExpressEditionen von C#, C++ downloaden ?

Wo kann ich ne (Test)-Version downloaden, damit ich die Dateien mal zu ner exe-Datei machen kann.
 
Zuletzt bearbeitet:
Hier: http://www.chip.de/suche/suche.html?q=microsoft+c&cat=0102&submit=suchen&tpl=only&np=0

Edit:
Ich habe vor längerer Zeit mal einen Emulator für einen selbsterfundenen sehr minimalistischen Prozessor
geschrieben. Vielleicht hilft dir das ja zu erkennen, dass du noch viele Jahre lernen musst, bis du dein
Vorhaben umsetzen kannst.

Ein Assembler, mit dem Emulator als Target ist dabei, aber als ich grad nochmal drüber geguckt habe, musste
ich feststellen, dass er sehr hässlich ist, auf die schnelle zusammengeschustert etcpp. Außerdem leckt er Speicher.
Am besten nicht angucken. Oder falls doch, mich bitte nicht auslachen.

Whatever, er tut seine Arbeit.

http://www.incertum.net/~sirdzstic/aisc-0.1.1.tar.gz

Kompilieren mit:
Code:
make
make examples

Beispielkram ausprobieren z.B. so:
Code:
asdf@localh0rst ~/src/aisc/aisc-0.1.1 $ bin/aisc bin/add-s.aisc 4 5
12      JMP     18       4 5 0 0 0 0 0 0
18      ISZ     1-       4 5 0 0 0 0 0 0
20      JMP     14       4 5 0 0 0 0 0 0
14      INC     0        5 5 0 0 0 0 0 0
16      DEC     1        5 4 0 0 0 0 0 0
18      ISZ     1-       5 4 0 0 0 0 0 0
20      JMP     14       5 4 0 0 0 0 0 0
14      INC     0        6 4 0 0 0 0 0 0
16      DEC     1        6 3 0 0 0 0 0 0
18      ISZ     1-       6 3 0 0 0 0 0 0
20      JMP     14       6 3 0 0 0 0 0 0
14      INC     0        7 3 0 0 0 0 0 0
16      DEC     1        7 2 0 0 0 0 0 0
18      ISZ     1-       7 2 0 0 0 0 0 0
20      JMP     14       7 2 0 0 0 0 0 0
14      INC     0        8 2 0 0 0 0 0 0
16      DEC     1        8 1 0 0 0 0 0 0
18      ISZ     1-       8 1 0 0 0 0 0 0
20      JMP     14       8 1 0 0 0 0 0 0
14      INC     0        9 1 0 0 0 0 0 0
16      DEC     1        9 0 0 0 0 0 0 0
18      ISZ     1+       9 0 0 0 0 0 0 0
22      JMP     15       9 0 0 0 0 0 0 0
15      STP              9 0 0 0 0 0 0 0

Zu lesen ist das ganze so:
Spalte 1: Aktuelle Adresse
Spalte 2: Opcode
Spalte 3: Argument (bei ISZ gibt + ein positives Ergebnis an, - ein negatives)
Spalten 4-11: Register 0-7

Aisc initialisiert die register 0 und 1 mit den Werten 4 und 5 (laut kommandozeile)
und führt dann das Binary add-s.aisc aus, das die Werte addiert und in Register 0
schreibt. Danach stopt die Ausführung.
 
Zuletzt bearbeitet:
Wie wär's wenn du dich mal mit den Grundlagen beschäftigst? Dann kommen solche Fragen gar nicht auf.
Wenn du C lernen willst, z.B.: klick!
 
Ich will ja nur wissen, wie ich davon ne exe-Datei machen kann.
und mit welchen Programm ich die Dateien am besten bearbeiten kann.
 
Zurück
Oben