Lowlevel

Lowlevel => OS-Design => Thema gestartet von: Dimension am 08. December 2011, 14:12

Titel: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 08. December 2011, 14:12
Hallo Lowlevel - Entwickler

Ist mein erster Beitrag hier im Forum, ich hoffe dass ihr mit meinem Anliegen etwas anfangen koennt. Ich suche speziell Kernel-Entwickler, die mein Projekt fuer interessant halten und auch etwas Zeit haben. Ich habe bereits ~30K code in Java, haenge jedoch gerade beim Export von Code mit bootbarem Hypervisor (speicher layout fuer paging etc.). Spaeter will ich die Plattform komplett importieren und eine bootbare Version exportieren. Subsysteme fuer Java etc. und Treiber kommen spaeter. Ich ueberarbeite Code haufig, habe meistens Ueberblick und bin etwas perfektionistisch.

Ich arbeite seit ein paar Monaten an einer neuen Mikroarchitektur. Die neue Architektur implementiere ich vorläufig als Emulator in Java. Ich schreibe gerade ein Export-Modul, welches einen bootbaren Mikrokernel erzeugt. Die Prozess-Strukturen werden in Pages organisiert. (genauer: Jede Variable bekommt einen eigenen Stack, mit dem rekursive Aufrufe von Code-Zweigen und Wiederherstellung von gespeicherten Zuständen möglich werden.) Die Speicherverwaltung und andere Dinge will ich in Hardware gießen.

Eigentliche Motivation für den Aufwand ist ein semantischer Editor, der gegenwärtige Probleme der Software-Entwicklung elegant zu lösen versucht. So wird der Code in einem Baum direkt bei der Eingabe geparst und Symbole doppelt verlinkt. Dies vereinfacht statische Analyse und ermöglicht beispielsweise die massiv parallele Ausführung. Weitere Anforderungen, wie die sichere Ausführung, werden durch "Sandboxes" implementiert. (genauer: in die Hardware verlagert). Grundsatz der Architektur soll eine strikte Trennung von Aufgabenbereichen sein.

Java-Code kann importiert werden. Bei Interesse habe ich noch ein beschreibendes Skript von November 2010 (leider auf Englisch)
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: erik.vikinger am 08. December 2011, 14:47
Äh, ja nee, is klar!

Also das ist meiner persönlichen Meinung nach mal ein echt tolles Beispiel dafür das SPAM nicht immer als solcher zu erkennen ist (womit IMHO das Thema mit der Adminfreischaltung des ersten Beitrages neuer User vom Tisch ist), ich will ja niemanden auf den Schlips treten aber dieser Text ergibt für mich absolut keinen Sinn. Mal abgesehen davon das jemand der an der Abendschule versucht sein ABI zu machen und damit in die Nanotechnologie will vielleicht etwas arg ambitioniert ist so sind in dem Text doch etliche verschiedene Themen ziemlich durcheinander. Also wie man von einem Micro-Kernel (soll es sich dabei wirklich um ein OS in Sinne dieses Forums handeln?) zu Landwirten und Lebensmittelanbau kommt ist mir schleierhaft.


Grüße
Erik
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: kevin am 08. December 2011, 15:03
Mensch, Erik, ein kleines bisschen Zurückhaltung wär auch für dich manchmal angebracht. ;)

Ich glaube, das Nanozeug können wir mal ignorieren, das ist nicht unsere Baustelle. Aber mit einer Architektur und einem OS drauf solltest doch gerade du was anfangen können. Zugegeben, das klingt alles ein bisschen verrückt (noch verrückter als dein Projekt), aber das war hier ja noch nie ein Hindernis. Wenn es in diesem Bereich irgendwelche konkreten Fragen oder Ansätze gibt, denke ich schon, dass wir das diskutieren können.
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: erik.vikinger am 08. December 2011, 15:24
Hallo,


ja, taljeth, ich gebe Dir grundsätzlich recht. Aber von Architektur usw. sehe ich nicht sehr viel, aus meiner persönlichen Sicht herrscht in dem Beitrag etwas zu viel Chaos als das man da etwas konkretes raus lesen könnte. Also dann übe ich mich jetzt mal in Zurückhaltung und warte ab ob der OP dieses Wirrwarr deutlich lichten kann.


Grüße
Erik
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: chris12 am 08. December 2011, 17:25
Was mich etwas stutzig macht, ist dass er anfangs die umlaute ausschreibt, dann aber zu ö,ä, ü wechselt (copy'n'past lässt hier, wahrscheinlich grüßen) zudem ist der angefügte breif sehr, sagen wir mal auffällig. zudem möchte ich mal behaupten, dass wenn ich was verstanden hab, davon wahrscheinlich nur die hälfte richtig verstanden hab. ich möchte niemandem was unterstellen, ich bin nur etwas verwirrt.

@themenstarter:
es wäre nett, wenn du das noch einmal etwas entwirrter schreiben könntest, denn wenn ich das recht verstanden habe, ist dein vorhaben eine komplette microarchitektur zu entwickeln, auf der man java nativ laufen lassen kann, was nur teilweise unser bereich ist. zudem, werter Aaron, wäre es für uns vielleicht recht interessant zu erfahren, wo denn dein problem liegt? denn darauf beruht ja ein austauschen.
ansonsten finde ich das projekt recht interessant und würde gern auf dem laufenden bleiben.

ach btw, das mit den landwirten ist mir auch sehr schleierhaft. Ach und nochwas, einen lebenslauf brauchst du hier nicht anbringen ^^

mfg
chris
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: Svenska am 08. December 2011, 18:32
Das Projekt klingt irgendwie interessant. Ob es das auch ist, zeigt erst eine halbwegs ins Detail gehende Beschreibung, wie das alles zusammenhängen soll; da blicke ich nicht durch.

Die Art der Präsentation hier ist ... seltsam. Das klingt mir zu sehr nach "überall mal gepostet, schaunmermal, wer antwortet".
Wer nicht so recht weiß, an wen er sich wenden kann, sollte zumindest keinen Standardtext in die Welt schicken.

Gruß,
Svenska
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: Dimension am 08. December 2011, 22:48
Also erstmal vielen Dank für die vielen Antworten. Die formalen Aspekte bitte ich zu entschuldigen.

Ich benutze mein Android Phone zum posten, da ist die Tastatur nicht so komfortabel. Den ursprünglichen Text hatte ich in der Tat per mail verschickt, deshalb die Anrede. Das haettich noch entfernen sollen, das haette die Sache vermutlich weniger auffaellig gemacht. Mein problem ist vermutlich, dass ich mich schwer tue die wichtigen Aspekte kompakt zu formulieren, da mein Projekt sehr Umfangreich werden wird. Die Struktur ist allerdings dafuer ausgelegt, ich behaupte mal selbstsicher, dass ich weiss was ich tue...  :-D

Der Part mit den Nano-Strukturen gehört hier natürlich nicht rein.

Edit: ich lade am besten noch dokumente mit weiteren details hoch (auf englisch), wenn sich jemand die muehe macht diese zu lesen, waere das nett.
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: DerHartmut am 09. December 2011, 09:42
Ich finde die sehr harsche Vorgehensweise von erik nicht ganz toll...nur weil hier jemand sich mal etwas besser artikulieren kann und verrückte Ideen hat (wo ja genau HIER wohl der _beste_ Platz für ist :)) direkt auf Spam zu schließen - vor allem weil ich solche Art von Spam noch nie gesehen habe ^^

Ich finde das Projekt sehr interessant und auch sehr amibtioniert, aber nichts ist unmöglich. Viel Glück dafür!
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: Dimension am 09. December 2011, 15:55
Architektur Überblick: neuer link siehe unten
Brainstorm zu semantic code: neuer link siehe unten

Weiss jemand, wo ich Code hochladen kann?
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: chris12 am 09. December 2011, 16:32
codesnippets können z.b mit pastebin.net oä hochgeladen werden, dein ganzes projekt kannst du dann z.b. auf sourceforge.net oä hochstellen.

also ich habe mir mal deine ideenblätter durchgelesen und wenn ich das recht verstanden habe, dann sehe ich ein _großes_ sicherheitsproblem:
du behandelst code als daten und programmen können daten austauschen und ein programm kann auf die variablen und den code eines anderen programmes zugreifen. das macht deine plattform natürlich sehr anfällig für viren, die sich in andere programme einschleusen, dass ist ja dann sogar bei laufendem programm möglich. zudem wird es auf deiner plattform sehr leicht sein, für spiele hacks und trainer zu schreiben ;)

wenn ich was falsch verstanden hab, dann bitte ich das zu entschuldigen.

mfg
chris
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: kevin am 09. December 2011, 17:12
Weiss jemand, wo ich Code hochladen kann?
Wenn es Open Source ist, würde ich github vorschlagen.

Die Dokumente werde ich bei Gelegenheit mal anschauen (obwohl es mir widerstrebt, mich bei Google einzuloggen).
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: erik.vikinger am 09. December 2011, 20:42
Hallo,


Ich finde die sehr harsche Vorgehensweise von erik nicht ganz toll
Ja, auch mir passiert es hin und wieder das ich zwischen Lesen und Antworten vergesse in Ruhe darüber nachzudenken. Im Ursprungspost sind ein Haufen Dinge drin die mich persönlich zu aller erst an SPAM denken lassen (unterschiedliche Schreibweise, Bitte um Weiterleiten, kaum zwei Sätze handeln vom selben Thema, viel zu viele total unterschiedliche Informationsschnipselchen die irgendwie nicht zusammenpassen wollen, Personenbeschreibung usw.), mein erster Gedanke war das da ein Bot einfach hier im Forum nach Keywords gescannt und dann "passende" Sätze von irgendwo anders her zusammenkopiert hat. Wenn ich nicht zwischenzeitlich wüste das dieser Text von einem lebenden Menschen stammt wäre aus meiner persönlichen Sicht immer noch SPAM die Kategorie wo der Text mit höchster Wahrscheinlichkeit rein gehört. Es tut mir Leid das ich nicht meine Finger still halten konnte aber inhaltlich sehe ich nichts wirklich falsches an dem was ich gestern als erstes geschrieben hab (auch wenn die Formulierung wohl eher suboptimal ist), mir ist natürlich klar das es da auch andere Meinungen zu gibt.


@Dimension:
Sorry, das ich Deinen Beitrag zu erst für SPAM gehalten hab und das dann auch noch so ganz unverblümt hier geschrieben hab.

Nachdem ich nun eines Besseren belehrt wurde würde ich auch gerne mehr über Deine Ideen erfahren aber ich habe leider keinen Google-Account. Das kann man doch bestimmt irgendwie frei schalten das jeder zumindest lesen kann oder?


Grüße
Erik
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: Dimension am 09. December 2011, 22:29
@chris12: in der Tat kann auf jede Information, die NICHT im Hypervisor Management bereich liegt sowohl lesend als auch schreibend zugegriffen werden. Das betrifft sowohl Threads, Prozesse als auch Computer im Netzwerk. Notwendige Bedingung für den Zugriff ist allerdings ein entsprechender Eintrag in der White-List des Prozesses. Der Hypervisor überprüft und verwaltet Berechtigungen auf Prozess-Basis.

@erik: meines wissens geht der link unabhängig davon, ob du eingeloggt bist oder nicht. Allerdings habe ich massive Probleme mit google docs, so dass ich nach einer Alternative ausschau halten werde.

Mir ist vorhin im Auto auf dem Weg zur Schule noch eingefallen, dass ich in dem Text noch was vergessen habe: Persistenz soll allein durch Swapping von Pages realisiert werden. Sowas wie FAT kommt erst später.

Ich kann leider erst morgen abend was hochladen, da mein System aus ist und ich wenig Zeit habe, da wir dieses Wochenende sehr viele Arbeiten schreiben. Gruss Aaron
Titel: Re: Bootbarer Microcernel mit Hypervisor fuer Semantischen Code
Beitrag von: erik.vikinger am 10. December 2011, 12:18
Hallo,


meines wissens geht der link unabhängig davon, ob du eingeloggt bist oder nicht.
Nein, leider nicht. Ich habe auch schon probiert das "/edit" am Ende weg zu lassen oder gegen "/view" auszutauschen aber ich werde grundsätzlich gebeten mich einzuloggen und da ich kein Google-Konto habe (und mir auch keines zulegen möchte) bleibe ich leider draußen.

Allerdings habe ich massive Probleme mit google docs, so dass ich nach einer Alternative ausschau halten werde.
Nimm doch einfach irgendein Offline-Programm und lade das ganze dann als PDF ins iNetz. Ich persönlich nutze für fast meine gesamte Dokumentation direkt HTML, das ist einfach, flexibel, mächtig und kann überall angeschaut werden, nur für meine OpCode-Tabellen nutze ich OpenOffice-Calc (und exportiere als PDF wenn ich möchte das andere drüber schauen).


Grüße
Erik
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 11. December 2011, 01:45
text:
Architektur Überblick: http://pastebin.com/euyT0Ddh
Brainstorm zu Semantic Code: http://pastebin.com/dZ72sg8n

relevant:
Operation.java http://pastebin.com/wMi2f0M4
Hypervisor.java http://pastebin.com/SzHXnjS6
Import.java http://pastebin.com/U0ynp8N1
Export.java http://pastebin.com/svHNmynB [update1]
ExportOpcode.java http://pastebin.com/snjPxG69 [update1]
ExportStructure.java http://pastebin.com/gXMVMhB7 [update1]
CodeOut.java http://pastebin.com/7gVa6aRp

weiter:
BuiltinType.java http://pastebin.com/JqMAjR2U
Structure.java http://pastebin.com/VdrYUdGd

listings:
operator http://pastebin.com/x0Mf4Hsq [update1]
special http://pastebin.com/BA2fT4R7 [update1]
misc http://pastebin.com/dte8xeKE [update1]

Generell  enthalten die Codes keine Dokumentation, jedoch viele Notizen. Konfuses einfach ignorieren.
Btw: Tabs sind auf 4 Zeichen ausgerichtet, pastebin nimmt jedoch 8. Sehe keine Möglichkeit das auf pastebin.com zu konfigurieren. Im Zweifelsfall den Original-Text unten in einen Editor kopieren.
CodeOut: habe die DisplayScripts für den Editor entfernt.
Export: enthält außer Notizen und einem groben Layout noch keine Implementierung. Die Ziele sind:

Grundsatz soll sein "so einfach wie möglich". Ausgrund der Ausrichtung der Architektur müsste nur der Bootstrap-Code in C/ASM geschrieben werden. Der rest vom Hypervisor geht dann in Java, welches wir importieren. Der Export nach x86 wird unterschieden nach hypervised und fixed.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 12. December 2011, 14:47
Ich habe mich gestern abend mal hingesetzt um den Opcode-Assembler zu schreiben.
Dazu habe ich meiner Assembler-Referenz einfach die Opcodes entnommen. Operationen laufen nur über ax, cx (bzw. dx für DIV/IDIV). RAM lese/schreibe ich über (bx).

Btw: Ich schreibe ax, bc, cx meine aber ausschliesslich 32 bit.

Für binäre Logik brauche ich verhältnismässig viele Bytes, da ich mit CMP(0)/SETx arbeite. Ich überlege doch lieber CMOVx zu verwenden. Wie sieht es mit der Verfügbarkeit aus? Ich möchte nur eine einzige Version schreiben, und CPUID höchstens beim Booten zum Abbrechen verwenden.

Den Code kann ich erst demnächst hoch laden. Vorher lasse ich mir mal alle Bytecodes raus und deassembliere sie, nur um sicherzugehen.

Dazu sind einige Fragen aufgetaucht:
Kann ich komplett auf den Stack verzichten? Auch mit interrupts?
Ich mache meinen eigenen fixed call stack mit return pointern und current index.
Ich brauche keine CALLs. Brauche ich IRET für Interrupts?
Wofür kann ich Tasks noch brauchen, eigentlich habe ich ja den Hypervisor.
Call-Gates gefallen mir nicht. Kann man die auch weg lassen?
Kann ich den Hypervisor in level 0, aber die Prozesse in level 3 laufen lassen? Auch ohne CALLs nur mit JMP?

Denke mal das reicht für den Anfang. Zu bootstrap code, diversen vector/descriptor tabellen, paging, nx und privileges werde ich aber wohl noch die eine oder andere Frage stellen.
Brauche ich LEA im Protected Mode? Gehen mit (ebx) auch physikalishe Adressen?
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 12. December 2011, 14:49
Dämliches Android, blendet mir die letzte Zeile im Textfeld aus.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: kevin am 12. December 2011, 15:34
Moment... Du hast oben was von einer eigenen Architektur geschrieben, warum hangelst du dich jetzt so eng an x86 entlang und fragst nur, was du davon rauswerfen kannst?

Ich glaube, wir müssen hier nochmal einen Schritt zurückgehen: Was sind die Gründe, aus denen du eine eigene Architektur haben willst? Wenn du sowieso nur x86 nachbaust, wäre es nicht vielleicht eine Option, die heutige Hardwarevirtualisierung (SVM/VMX) für deine VM zu nutzen? Was gewinnst du damit, überhaupt eine VM zu haben, im Vergleich dazu, den Code direkt auf der Hardware laufen zu lassen?

Ohne dich demotivieren zu wollen, deine Frage klingen nicht danach, als würde ich dich damit beauftragen, eine Prozessorarchitektur zu entwickeln. Und zwar aus dem einfachen Grund, dass es nicht so aussieht als wärst du mit vielen anderen Architekturen vertraut und könntest aus ihren Vorteilen und Fehlern lernen.

Abgesehen davon stellt sich auch noch die Frage, ob der Befehlssatz für eine reine VM-Architektur nicht anders aussehen sollte als für eine echte CPU in Hardware.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: erik.vikinger am 12. December 2011, 15:38
Hallo Dimension,


ich hatte mir gestern Abend noch Deine hochgeladenen Texte angesehen und muss ehrlich sagen das ich den Wald vor lauter Bäumen noch immer nicht sehen kann. Du erklärst kaum ein Detail in vollständigen Sätzen sondern meistens nur mit (viel zu) kurzen Stichpunkten. Auch handeln dort kaum zwei Abschnitte vom selben Thema. Mir fehlt da einfach der logische Zusammenhang und so ein gewisser roter Faden um dazu überhaupt etwas konkretes schreiben zu können, sorry.

Ich überlege doch lieber CMOVx zu verwenden. Wie sieht es mit der Verfügbarkeit aus?
Ist ab PentiumPRO, also >=686 verfügbar. Das würde ich persönlich auch als Minimum nehmen da ab dieser Zeit auch APICs verfügbar sind.

Kann ich komplett auf den Stack verzichten? Auch mit interrupts?
Nein.

Brauche ich IRET für Interrupts?
Eigentlich schon, vor allem wenn Du dabei auch den Ring wechseln willst. Theoretisch könnte man IRET bestimmt auch emulieren aber wozu wenn die CPU das auch direkt kann.

Call-Gates gefallen mir nicht. Kann man die auch weg lassen?
Ja, dann musst Du INT oder SYSCALL oder SYSENTER nutzen um vom Ring 3 in Ring 0 zu kommen. Ich persönlich würde eines der letzten 2 empfehlen aber die sind noch nicht so lange verfügbar was wieder die potentiellen CPUs reduziert.

Kann ich den Hypervisor in level 0, aber die Prozesse in level 3 laufen lassen?
Ja, bestimmt, dann ist Dein Hypervisor quasi der OS-Kernel.

Auch ohne CALLs nur mit JMP?
Diese Frage verstehe ich nicht. Wieso sollte man auf CALL verzichten? Das ergibt für mich persönlich nicht wirklich Sinn.

Brauche ich LEA im Protected Mode?
Nein, das kann man auch immer mit anderen Befehlen emulieren aber diese sind oft langsamer da LEA eine spezielle Adressberechnungs-ALU nutzt und auch keine Flags modifiziert (diese bleiben also erhalten und ermöglichen Dir z.B. die Addressberechnung für spätere Speicherzugriffe schon vorzuziehen, sogar zwischen ein CMP/TEST/.. und dem zugehörigen Jcc und das ist deswegen so wichtig weil das Jcc ja vom CMP/TEST/.. abhängig ist und diese 2 Befehle oft mehr als 5 Takte durch die Pipeline benötigen und in der Zeit oft nicht viel passiert und wenn Du da ein LEA rein legst bekommst Du das von der Ausführungszeit quasi geschenkt).

Gehen mit (ebx) auch physikalishe Adressen?
Solange das Paging aktiv ist kannst Du überhaupt nicht direkt auf physische Adressen zugreifen sondern Du musst immer erst ein passendes Mapping erstellen und mit einer äquivalenten virtuellen Adresse arbeiten. Das Paging dauernd an und ab zu schalten ist auf jeden Fall keine gute Idee.


Grüße
Erik
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 12. December 2011, 17:34
@taljeth:
"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. Ich hoffe das Prinzip:
Java-> Import -> Semantic Code -> Export -> Bootbares Image
ist nachvollziehbar.

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.

@erik:
Danke für die Antworten. Bitte entschuldige meine Art Gedanken festzuhalten. Abgesehen davon vermute ich, dass es nicht unbedingt notwendig ist, alle Aspekte des Projekts zu kennen. Für uns sind in erster Linie Details zur Implementierung interessant, die im Dokument "Überblick der Architektur" sowieso nicht angesprochen werden. Wobei ich mich natürlich über jegliches Interesse freue und jede Frage gerne beantworten werde.

@erik 2:
Zitat
Kann ich komplett auf den Stack verzichten? Auch mit interrupts?
Nein.
Ich habe es geahnt. Ich werde einen kleinen Stack anlegen müssen um den Status vor der Unterbrechung wiederherzustellen. Interrupts kommen bei mir generell nur in eine Art Event-Queue, die vom root-Prozess regelmäßig bearbeitet wird. Deshalb leite ich die Einträge der IVT zu einem Interrupt-Handler-Proxy (Bezeichnung adäquat?)

Zitat
Call-Gates gefallen mir nicht. Kann man die auch weg lassen?
Ja, dann musst Du INT oder SYSCALL oder SYSENTER nutzen um vom Ring 3 in Ring 0 zu kommen. Ich persönlich würde eines der letzten 2 empfehlen aber die sind noch nicht so lange verfügbar was wieder die potentiellen CPUs reduziert.
Der Hypervisor führt immer nur kleine Prozeduren aus und springt dann wieder zurück. Diese Prozeduren kommen aus einem Code-Cache mit x86-Bytecode. Dieser wird aus Semantic Code exportiert (hypervised Export). Diese Prozeduren sollen im Ring 3 laufen, der Hypervisor in Ring 0. Die Prozedur in Ring 3 beinhaltet keine Sprünge (zumindest nicht nach außerhalb der Prozedur).

Wann treten Call-Gates sonst noch auf?

Zitat
Auch ohne CALLs nur mit JMP?
Diese Frage verstehe ich nicht. Wieso sollte man auf CALL verzichten? Das ergibt für mich persönlich nicht wirklich Sinn.
Da ich keinen Stack über SP verwende (Und damit auch kein CALL, RET, PUSH, POP und alle anderen Instruktionen für den Stack), springe ich vom Hypervisor in die Prozedur und am Ende dieser an eine feste Adresse zurück in den Hypervisor. Die Frage ist: kann ich während diesen JMPs den Ring ändern? So wie ich das verstanden habe, wird der Ring im Segment festgelegt.

Zitat
Gehen mit (ebx) auch physikalische Adressen?
Solange das Paging aktiv ist kannst Du überhaupt nicht direkt auf physische Adressen zugreifen sondern Du musst immer erst ein passendes Mapping erstellen und mit einer äquivalenten virtuellen Adresse arbeiten.
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?

Es sind noch ein paar Dinge offen, ich schreibe sie hier noch mal hin, damit sie nicht untergehen. Nicht gedrängt fühlen.
Wofür kann ich Tasks noch brauchen, eigentlich habe ich ja den Hypervisor?
falls nicht, dann brauche ich wohl auch kein TSS / TSR
Was haben Tasks mit Multi-Core zu tun? Was bedeutet mehrere Threads per Core?
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Svenska am 12. December 2011, 19:35
Wann treten Call-Gates sonst noch auf?
Call-Gates sind nur eine Möglichkeit zum Kontextwechsel. Üblicherweise verwendet man sie nicht mehr und nutzt stattdessen Interrupts (ähnlich dem DOS Funktionsverteiler "int 21h") oder - prozessor- und modusspezifisch - die Befehle SYSENTER bzw. SYSCALL.

springe ich vom Hypervisor in die Prozedur und am Ende dieser an eine feste Adresse zurück in den Hypervisor. Die Frage ist: kann ich während diesen JMPs den Ring ändern? So wie ich das verstanden habe, wird der Ring im Segment festgelegt.
Mit einem JMP kannst du den Ring nicht ändern. Wenn du das möchtest, eignet sich ein Sprung durch ein Call-Gate. Prinzipiell kannst du auch die Prozeduren im Ring 0 ausführen lassen und in der eigentlichen Ziel-Architektur eine spezielle Instruktion (JMPUSER) vorsehen. Die Sicherheitsprobleme mit diesem Ansatz sollten bekannt sein, wenn x86 aber ohnehin nur eine Zwischenlösung ist, ist das vielleicht akzeptabel.

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?
Wenn du physische Adressen bevorzugst, solltest du einen paginglosen Ansatz überdenken bzw. einfach den physischen Speicher 1:1 in deinen Adressraum mappen, dann sind virtuelle und physische Adressen immer gleich.

Wofür kann ich Tasks noch brauchen, eigentlich habe ich ja den Hypervisor?
Du brauchst in jedem Fall einen Task, um den Ring 3-Code auszuführen.

Was haben Tasks mit Multi-Core zu tun?
Nichts, außer, dass aus der Pseudoparallelität eine echte Parallelität wird.

Was bedeutet mehrere Threads per Core?
Das gleiche wie Multitasking auf einem Core, nur innerhalb eines Tasks.

Gruß,
Svenska
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: erik.vikinger am 12. December 2011, 20:33
Hallo,


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.
Von welchen Eigenschaften konkret fühlst Du Dich den überzeugt? Sorry, wenn ich das so doof frage aber Du solltest IMHO schon wissen auf was Du Dich einlässt und vor allem was Du eigentlich erreichen möchtest. Für "Many-Core" benötigst Du entweder ein wirklich gutes Speicher-Kohärenz-Protokoll (und das ist bei weitem keine triviale Angelegenheit) oder Du beschränkst Dich auf AMP. Wie taljeth schon angedeutet hat beschäftige ich mich ebenfalls mit der Entwicklung einer eigenen CPU, ein kleiner Einblick ist dort http://forum.lowlevel.eu/index.php?topic=2470.msg27699#msg27699 (http://forum.lowlevel.eu/index.php?topic=2470.msg27699#msg27699) (ließ Dir am besten die ganze Seite von oben bis unten durch, da sind noch mehr Leute die ne eigene CPU bauen), und muss ganz ehrlich sagen das dieses Thema auf jeden Fall deutlich komplexer ist als ich mir das vor 3 bis 4 Jahren vorgestellt hatte. Vor allem solltest Du eine konkrete Vorstellung davon haben was Dein Ziel sein soll, soll Deine Architektur möglichst einfach sein, spielt SMP eine Rolle, Speicherschutz (per Paging oder was anderes) oder möchtest Du eine möglichst hohe Performance. Da kann man sehr viele verschiedene Ziele miteinander kombinieren und deswegen muss man meiner persönlichen Meinung nach vorher wissen was man genau will und um genau das wirklich zu wissen sollte man auf möglichst vielen CPU-Architekturen praktisch fließend Assembler beherrschen, nur so entwickelt man ein gutes Gefühl dafür was die einzelnen CPU-Architekturen für Stärken und Schwächen haben, was ist elegant gelöst (viele empfinden ja MIPS aufgrund seiner extremen Beschränkung aufs wesentliche als sehr elegant, ich persönlich sehe das anders) oder was ist eventuell unintuitiv aber dafür performant (Itanium ist hierfür in gutes Beispiel). Fast alle CPUs haben die 4 üblichen Flags zusammen mit den 14 üblichen bedingten Sprüngen mit denen sie alle wichtigen integer-arithmetischen Bedingungen prüfen können aber diese Flags sind eigentlich immer auch ein Performance-Engpass da sie nur ein einziges mal vorhanden sind, Alpha hat aus diesem Grund gar keine Flags und ist schon deswegen mal einen genaueren Blick wert weil man aus der Art wie dieses Problem bei Alpha gelöst ist einiges lernen kann.

Bitte entschuldige meine Art Gedanken festzuhalten.
Dafür musst Du Dich nicht entschuldigen, vielmehr solltest Du bedenken das Du vielleicht selber nicht mehr weißt was Du mit einem kurzen Stichpunkt aus 4 oder 5 Worten eigentlich mal gemeint hast wenn Dein Projekt erst mal 5 Jahre läuft (und glaube lieber nicht das Du in 5 Jahren schon fertig bist).

Abgesehen davon vermute ich, dass es nicht unbedingt notwendig ist, alle Aspekte des Projekts zu kennen.
Wer den Überblick nicht hat kann auch bei Details nur selten gute Entscheidungen treffen.

Der Hypervisor führt immer nur kleine Prozeduren aus und springt dann wieder zurück.
Wozu dann überhaupt der Ring-Wechsel? Wenn dieser Code vom Hypervisor selber erzeugt wurde dann weiß dieser doch ob der gefährliche Operationen enthält bzw. kann sicherstellen das der Objekt-Code eben nichts gefährliches macht und schon ist alles Okay. Microsoft hat wimre mal mit .NET und Singularity (ich bin mir hier beim Namen nicht ganz sicher aber das iNetz kann Dir sicher weiterhelfen) mal etwas in der Richtung probiert, dort sollten wohl alle Programme und auch der Kernel im selben Adressraum liegen und da der Code grundsätzlich nur aus .NET-Byte-Code vom OS-Kernel selber in Objekt-Code überführt wurde kann so sichergestellt werden das keine Angriffe auf das restliche System enthalten sind.

Wann treten Call-Gates sonst noch auf?
Nur da wo Du sie aktiv einbaust. ;)

kann ich während diesen JMPs den Ring ändern?
Nur mit einem CALL-Gate, zumindest fällt mir auf x86 kein anderer Weg ein wenn man das unbedingt mit einem JMP machen will.

(Page Tables nutze ich erstmal nicht). Da meine Speicherverwaltung nur Virtuelle Adressen zurückgibt
Äh, das ist ein Widerspruch in sich. Obwohl, warte, bei x86 gibt es ja noch die Segmente und nach der offiziellen Intel-Terminologie bezieht sich virtuell auf den segmentierten Adressraum und die Adressen die dann per Paging in physische Adressen umgewandelt werden sind die linearen Adressen. Bitte beschreibe erst mal was Du genau machen möchtest. Und ob Du LEA brauchst hängt nicht von Deinem Speichermodell ab.


Grüße
Erik
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: kevin am 12. December 2011, 20:34
"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?

Zitat
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.

Zitat
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.

Zitat
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.

Zitat
Was bedeutet mehrere Threads per Core?
Meinst du im Kontext von Hyperthreading? Dann wären es logische CPUs.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 12. December 2011, 21:28
Ich werde mich morgen ausführlicher auf die Posts eingehen. Zuerst muss ich leider feststellen, dass ich immer wieder merke, dass bestimmte Sätze, welche ich schrieb wenig bis gar keinen Sinn machen, bzw. einzelne Bezeichnungen ungeschickt gewählt sind. Möglicherweise kann ich besser programmieren als formulieren??? Abgesehen davon bin ich heute nicht sehr konzentrationsfähig.

(Page Tables nutze ich erstmal nicht). Da meine Speicherverwaltung nur Virtuelle Adressen zurückgibt
Äh, das ist ein Widerspruch in sich.
nein, ich meinte page directory entries (PDE), sagt Wikipedia.

Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: kevin am 12. December 2011, 21:30
Du meinst, du benutzt 4-MB-Pages, nehme ich an.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 12. December 2011, 21:31
Du meinst, du benutzt 4-MB-Pages, nehme ich an.
korrekt.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 13. December 2011, 16:20
@taljeth:
Ich habe eben deinen früheren Post gelesen und will noch mal darauf eingehen.
Wenn du sowieso nur x86 nachbaust, wäre es nicht vielleicht eine Option, die heutige Hardwarevirtualisierung (SVM/VMX) für deine VM zu nutzen? Was gewinnst du damit, überhaupt eine VM zu haben, im Vergleich dazu, den Code direkt auf der Hardware laufen zu lassen?
In der Tat habe ich bereits darüber nachgedacht, VTx für die Virtualisierung einzelner Prozesse zu verwenden. Allerdings mehr als (redundante) Sicherheitsvorkehrung. Irgendwie muss ich Treibern (im Usermode-Prozess in Ring 3) gestatten auf Speicher, I/O Ports (bzw. Ring-0 Instruktionen ?) zuzugreifen. Da das mit einer White-List geschehen soll, müsste ich hier eine art Abstraktionsschicht vorsehen, welche jedoch für die Treiber transparent und auf x86 spezialisiert bleibt. Die Idee, VTx zu nutzen habe ich zurückgestellt, da mir dort die Kosten (Komplexität, Mehraufwand) im Vergleich zum Nutzen (Sicherheit) zu hoch sind. Abgesehen davon werde ich natürlich das fertige Image in einer VM testen und, so bald es möglich ist, darin einen Editor starten und von da an innerhalb des neuen Systems entwickeln.

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?
Die Software, die in den Prozessen läuft kommt ausschließlich aus Semantic Code, dieser wiederum wird entweder von Java/C++ importiert und/oder im semantischen Editor geschrieben. D.h. Software kommt ausschließlich als source code. Beschreibung gibts im Brainstorm zu Semantic Code (siehe meinen Post weiter oben).

Zitat
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. ;)
Das ist richtig. Mir gefällt dieses Prinzip, will aber noch weiter gehen. Ein Register ist ja quasi nur ein Speicherplatz für temporäre Werte, welcher sich durch seine schnelle Verfügbarkeit auszeichnet. Was wäre, wenn nun der gesamte RAM quasi als Register funktioniert. Damit wäre die Integrität der Daten bei einem Taskwechsel immer gewährleistet, auch ohne Zurückschreiben. Jeder Prozess könnte seinen eigenen Cache bekommen, in dem er seine häufig verwendeten Daten speichert. Der Vorteil von Semantic Code ist hierbei, dass die Abhängigkeiten von Daten über mehrere Prozesse/Threads statisch analysiert werden können.

Ich bin mir im Klaren darüber, dass es bezüglich der Zugriffszeit eine große Diskrepanz zwischen Zugriffen auf ein Register, respektive den RAM gibt.

Hierzu noch 2 Dinge:
Speicherinhalt, Datenobjekt: z.B. Int32, String, Vektor, Klassenobjekt, ... . Diese werden anhand ihrer Speicherklasse (Größe, power of 2) in fixed size Arrays gehalten. Jeweils eine Speicherklasse verwendet pro Prozess ein oder mehrere Pages. Somit enthält eine Page nur Objekte einer Speicherklasse. Zu jedem Datenobjekt gehört eine eindeutige (lineare?) Adresse.
Klassenobjekt, Liste, Speicherstruktur: Die Properties in Klassenobjekten sind Verweise auf andere Datenobjekte. Ein Identifier.Properity wird beim Zugriff von der Speicherwaltung zu einer (linearen?) Adresse aufgelöst. Dies geschieht durch Hash Tables. Jede Speicherstruktur basiert auf Hash Tables, wobei jede Struktur eine eigene Hash Table besitzt. Identifier.Property sind nur für eine Struktur eindeutig. Es gibt allerdings noch einige Vorkehrungen zu treffen bezüglich der Organisation von Strukturen und Hash Tables, weswegen ich mich zuerst auf fixed Export, also feste Adressen konzentrieren werde.
Edit: werde das erst in Java testen


@erik, Svenska: Eure Posts werde ich wohl noch mal gründlich lesen, vielen Dank dafür. Ich werde doch einen relativ flachen Stack anlegen, für Interrupts und 2 Tasks. Usermode in Ring 0 ist leider keine Option. Ich werde mich nun erstmal wieder mit dem Opcode-Assembler beschäftigen, vielleicht ein paar Operationen implementieren und mich dann wieder melden.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: bluecode am 13. December 2011, 20:34
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?
Die Software, die in den Prozessen läuft kommt ausschließlich aus Semantic Code, dieser wiederum wird entweder von Java/C++ importiert und/oder im semantischen Editor geschrieben. D.h. Software kommt ausschließlich als source code. Beschreibung gibts im Brainstorm zu Semantic Code (siehe meinen Post weiter oben).
Die Beschreibung ist ehrlich gesagt völlig unklar. Es fängt eigentlich schon beim Namen an: Was soll "semantic code" sein? Jeder Code hat Semantik (= Bedeutung), sonst ist der Code an sich nutzlos (gilt aber für jede Sprache). Was ich mir so vorstellen könnte das du meinst:
* eine tolle neue Programmiersprache mit deinen Lieblingsfeatures
* einen tollen neuen Editor der semantic highlighting macht (wie zB kdevelop, siehe hier (http://zwabel.wordpress.com/2009/01/08/c-ide-evolution-from-syntax-highlighting-to-semantic-highlighting/))
* in Anlehnung an das semantic web eine Art wie man sich aus vorhandenen Services, einer formalen Beschreibung was diese tun und einer formalen Beschreibung was die Zielanwendung tun soll, automagisch (durch Herleitung innerhalb eines logischen Kalküls) die Zielanwendung konstruiert wird
* ein modellgetriebener Ansatz zur Softwareentwicklung, bei der ausgehend von zB einem UML-Model source code generiert wird, d.h. die semantik des UML-Models wird in Code der Zielsprache mit der gleichen Semantik gegossen
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Svenska am 14. December 2011, 01:23
Ich halte ein Betriebssystem, bei dem jede Anwendung im Source-Code vorliegen muss außerhalb gewisser Elfenbeintürme für unsinnig.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 26. December 2011, 15:23
Ich konnte die letzten Tage dazu nutzen, den Opcode-Assembler zu erweitern und einen Wrapper für die Strukturen der diversen x86-Speicherverwaltungs-Tabellen zu schreiben. Bei den Strukturen brauche ich aber noch eine Rückmeldung, da ich mir nicht sicher bin, ob alle Felder richtig übersetzt wurden (Adressierungsarten, Little Endian). Die Instruktionen aus ExportOpcode.java habe ich testweise in eine Binärdatei geschrieben, disassembliert und das Ergebnis in den Listings hochgeladen.

Wer nicht gerade Ski fahren, Geschenke auspacken oder Feuerwerk zünden muss, kann sich das ja mal ansehen: http://forum.lowlevel.eu/index.php?topic=2948.msg34275#msg34275

Edit: Für das Listing der FPU Speicherzugriffe (misc) habe ich versehentlich 2x storeFloat(true) für Integer-Werte verwendet, was in FIST resultiert, die Option für Float-Werte fehlt dort im Listing.
Btw: In meinem Buch konnte ich keinen Opcode zur Instruktion FST mit 80-Bit Registern finden, weshalb ich auf FSTP ausweichen musste.
Titel: Re: Bootbarer Mikrokernel mit Hypervisor für Semantischen Code
Beitrag von: Dimension am 05. January 2012, 16:56
Musste gerade feststellen, dass ich in den vorherigen Posts vermehrt den Begriff "Bytecode" verwendet habe. Mir war der Unterschied zwischen Bytecode und Maschinencode nicht bewusst, aus dem Kontext geht hoffentlich hervor, dass ich x86-Maschinencode meinte.