Binaries für eigene VM



  • Ich habe eine kleine "VM" - vielleicht ist es übertrieben das so zu nennen - die ein Binary einlesen und abarbeiten kann. Ich habe einen primitiven Assembler der das Binary generiert - aus Assembler Source.

    Zum Testen ist das ausreichend, aber ich will nicht alles immer in Assembler schreiben - spätestens wenn jemand anderes die VM nutzen soll, muss C - oder besser noch C++ - nutzbar sein.

    Habt ihr vorschläge wie das am besten zu realizieren ist?

    Ich habe gedacht ein gcc backend zu machen, aber nachdem studieren von
    https://gcc.gnu.org/onlinedocs/gccint/Machine-Desc.html
    denke ich, dass es mich vom Zeitaufwand weit vom Weg abbringt.
    Bei LLVM wirkt die Sache zwar einfacher, aber dennoch sehr viel Arbeit.

    Ich habe - erfolgreich - eine gcc distribution benutzt die MIPS rauswirft und dann dank objdump das assembly bekommen, was ich wiederrum zu meinem Binary assembliere. Das ist jedoch ein wenig umwegig, zumal ich nicht sicher bin, wie ich das Speicherlayout meiner VM und Ports mappe.

    Zur Zeit tendiere ich eine modifizierte Version von
    http://de.wikipedia.org/wiki/Tiny_C_Compiler
    zu machen, wobei das wirklich 'oldschool' ist, weit von Feature-Complete und das generierte Binary ist nicht optimiert.

    Meine Anforderungen sind recht einfach, die VM hat ein Flat-Memory-Model, am Anfang liegt das Binary, dahinter Daten, anschliessend der User-Space. Es gibt ein paar Ports in die Daten ausgegeben werden und ein paar Ports zum einlesen.

    ICh bin mir sehr sicher, dass es da schon etwas giebt. Ich weiss, dass das ARM SDK auch C++ zu deren embedded Platformen generiert. Sowas gibt es doch bestimmt schon irgendwo.



  • eine gcc distribution benutzt die MIPS rauswirft und dann dank objdump das assembly bekommen, was ich wiederrum zu meinem Binary assembliere

    Das klingt für mich so, als ob es mit vertretbarem Aufwand möglich sein müsste das MIPS Backend von entweder GCC oder LLVM zu modifizieren, so dass es direkt "deinen" Code ausspuckt. Nicht?



  • hustbaer schrieb:

    eine gcc distribution benutzt die MIPS rauswirft und dann dank objdump das assembly bekommen, was ich wiederrum zu meinem Binary assembliere

    Das klingt für mich so, als ob es mit vertretbarem Aufwand möglich sein müsste das MIPS Backend von entweder GCC oder LLVM zu modifizieren, so dass es direkt "deinen" Code ausspuckt. Nicht?

    Wie ich schrieb, war das schon ein Gedanke, aber es wird recht aufwendig. Ein Punkt ist z.B. dass das backend optimiert anhand der gesetzten Opcodes, denn du kannst auf vielen Wegen zum ziel. Wann nutzt du z.B. "inc eax" und wann "add eax,1", wann "xor eax,eax" statt "move eax,0". Es ist nicht so, dass ich das brauche, aber es ist nunmal schon vorhanden im Backend, wenn ich das anpasse, kann ganz schnell ein invalider Opcode-Stream entstehen. Intel hat oft bugfix-Patches nachgereicht, was mir ein wenig Sorgen macht, dass ich Stümper micht da in Gefilde begebe, die mehr Arbeit sind als mein eigentliches Projekt.

    Ich danke dennoch für die Antwort, falls jetzt alle derselben Meinung sind, dann ist es vielleicht doch der richtige Weg.


Anmelden zum Antworten