Advertisement
Dimension

Architektur Überblick

Dec 10th, 2011
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.57 KB | None | 0 0
  1. Kann sein, dass ich was vergesse, meine Notizen sind über viele verschiedene Systeme verteilt. Es ist auch nicht so, dass ich alles gleich aufschreibe, manchmal schreibe ich aber auch ganz schönen Quatsch. Ich denke wichtig ist vor Allem, dass ich weiß, wo ich mit dem Projekt hin will und wo ich Chancen sehe das in der Realität umzusetzen.
  2.  
  3. Es geht ja eigentlich um eine neue Hardware-Architektur, unter x86 will ich mich mit den dortigen Lösungsansätzen beschäftigen.
  4.  
  5. "Fahrplan": Java-Emulator -> x86 Mikrokernel -> HW-Design
  6.  
  7. Eingangs sollte ich erwähnen, dass die Architektur NICHT primär auf A: Performance, B: Speichereffizienz oder C: Kosteneffizienz ausgelegt ist. Ich vernachlässige hier den Semantischen Editor, Diagramme und andere Aspekte zur Entwicklung und konzentriere mich mehr auf das hardwarerelevante Design.
  8.  
  9.  
  10. SW-Seite:
  11.  
  12. Operationen: jeweils ein Element der Flusskontrolle oder eines Ausdrucks.
  13.  
  14. Umgebung: Mit Umgebung meine ich hier nur deklarierte Variablen zur Zeit der Ausführung.
  15.  
  16. Deklaration: Bestimmte Operationen (OP_SEQUENCE) können Variablen deklarieren. Diese werden auf ihren Stack gespusht und stehen ab sofort als Umgebung zur Verfügung. Am Ende einer Operation wird der Stack mit setSize() auf den Ausgangszustand zurückgesetzt.
  17.  
  18. Funktionen: Man könnte sagen, jede Operation ist eigentlich ein Funktionsaufruf, was so nicht stimmt. In der Tat unterschieden sich Funktionen von anderem Code aber nur durch spezielle Anforderungen an die Umgebung des Aufrufs.
  19.  
  20. Variablen 1: Variablen haben eine "Version". Da jedes Stück Code quasi unabhängig von seinen "Eltern" ist, kann dieses von jedem Punkt aus aufgerufen werden. Die Variablenzugriffe stellen dabei Zugriffe auf ihre Umgebung dar und können ebenfalls auf weitere zurückliegende Versionen zugreifen (Stack).
  21.  
  22. Variablen 2: Alle Codes und Types (Klassen) werden wie Daten behandelt. Soll heissen, dass ein Prozess nur seine Variablen-Stacks verwaltet.
  23.  
  24. Abstrakter Code / Makro: da Funktionen auf ihre Umgebung zugreifen und Code wie Daten in Variablen gehalten wird, kann man elegant Makros schreiben, welche die selbe Aufgabe in mehreren Varianten bearbeiten können. Stichwort: habe keins, habe mich aber schon OFT über das Fehlen einer solchen Möglichkeit aufgeregt.
  25.  
  26. Strukturen: Klassen, Listen, Vektor-Arrays, Hashmaps, ... allgemein implementiert als Hashmaps ähnlich JSON-Objects mit Key-Value Definitionen. Im Emulator-Code habe ich häufig sowas: resolve(new AccessChain(new StackAccess(), new StructureAccess(), ...))
  27.  
  28. Identifier: Alle Variablen, Struktur-Properties, Threads, Prozesse, Programme, Hardware-Einheiten, ... haben ihren eigenen eindeutigen Identifier, mit dem auf sie zugegriffen werden kann. Diese setzen sich generell zusammen aus einem Name von Menschen gewählt und einem Zähler, neben anderen Abhängigkeiten (z.B. Thread welches Prozesses).
  29.  
  30. Hypervisor: vermutlich der interessanteste Teil. Besteht aus einem Scheduler, der Speicherverwaltung und Zugriffskontrolle. Der Scheduler arbitriert die Prozesse/Threads, popt den Callstack, pusht Variablen-Stacks (Deklaration) und pusht den Callstack pro untergeordneter Operation.
  31.  
  32. Subsysteme: APIs verschiedener Plattformen bereitstellen.
  33. Treiber: normaler Code, erweiterte Berechtigungen: Port I/O, Interrupt, ...
  34. Import: vorerst nur Java. Später alles, was sich irgendwie kompakt realisieren lässt (antlr/javacc)
  35. Export: vorerst nur x86 wie eingangserwähnt zur Evaluierung von praktikablen Ansätzen.
  36. (Thread-)Synchronization: Operationen sind schonmal atomar. Alles andere muss mit speziellen Deklarationen erfolgen. Auf mögliche Deadlocks wird hingewiesen.
  37. Ausdrücke: haben einen eigenen Stack für Operanden/Ergebnisse. Ansonsten normale Ausführung (suspendable).
  38.  
  39. HW-Seite:
  40.  
  41. Hypervisor: nach dem Bootstrap-Code kommt der Hypervisor code. Dieser funktioniert mit festen call stacks (max 8 fach rekursion oder so) und festen speicheradressen.
  42.  
  43. Layout:
  44. 0 - 0x400 interrupt vector table
  45. 0x400 - 0x500 bios1
  46. ab 0x500
  47. fixed procedure jump table
  48. procedureList (non-hypervised procedures, use fixed stack for executing hypervisor)
  49. interrupt proxy list ()
  50. 0xA0000 - 0xC0000 vga
  51. 0xC0000 - 0x100000 bios2
  52. ab 0x100000 bootstrap code
  53. dann:
  54. page directory
  55. global descriptor table
  56. taskstate segments (one per core)
  57. fixed memory for hypervisor
  58. process list
  59.  
  60. äh, ich schicke noch den export-code in java, noch nicht ausgereift...
  61.  
  62.  
  63. Speicherverwaltung 1: Jeder Prozess hat seine eigenen Pages. Jede Page beinhaltet ausschließlich Objekte einer festen Größe (power of 2). Neue pages werden zum Prozess allokiert, wenn alle pages dieser Speicherklasse voll sind oder komprimiert und deallokiert, wenn die Auslastung von Pages unter einen bestimmten Schwellwert fällt. Hier kann man wunderbar alle Algorithmen parallel in HW laufen lassen.
  64.  
  65. Speicherverwaltung 2: Code, Daten und Management-Daten (hashtables, paging info) getrennt.
  66.  
  67. Persistenz: Soll allein durch Swapping von Pages realisiert werden. Sowas wie FAT kommt erst später.
  68.  
  69. Scheduling: Round Robin mit Priorität (Prozesse kommen nur dran, wenn alle Prozesse höherer Priorität schlafen). Threads analog zu Prozessen, jedoch erst, wenn der jeweilige Prozess ausgeführt wird.
  70.  
  71. Cache: Die neue Architektur geht ausschließlich über die Speicherverwaltung und hat keine Mehrzweckregister. Deshalb muss der Cache eine Schnelle Alternative zu Registern bieten. Eigentlich ist Cache ja nur teurer als RAM...
  72.  
  73. Multi-Core: Da der Datenfluss im Code statisch analysiert werden kann, können Programme massiv parallel und auf mehreren Cores laufen. Benötigt natürlich möglichst schnellen Austausch von Daten und Ereignissen zwischen den Cores.
  74.  
  75. Distributed: Ähnlich Punkt Multi-Core. Ein Programm kann dynamisch auf mehrere Hardware-Einheiten verteilt werden. Je nach Bandbreite und Latenz kann dies dynamisch angepasst werden. Stichwörter: Webanwendung, Cloud.
  76.  
  77. Kommunikationsprotokoll: Jedes Programm kann Ereignisse an andere Programme senden und auf Variablen (und damit auch Code) zugreifen (IPC). Die Kommunikation zwischen Hardware-Einheiten (Bus) und im LAN erfolgt oberhalb der Übertragungsschicht einem standardisierten Protokoll, welches identisch ist zum Protokoll der IPC. Jedes Gerät hat seinen eigenen eindeutigen Identifier.
  78.  
  79. Netzwerk: Zwischen Geräten der erwähnten Architektur gibt es ausschließlich die Kommunikation über IPC.
  80.  
  81.  
  82. Also es gibt ca 1000 Dinge, die ich zuirgendeiner Zeit mal evaluiert und entschieden habe. Da ich diese nun für selbstverständlich halte könnte es unter Umständen schwer bis unmöglich sein meine Gedanken nachzuvollziehen. In diesem Fall bitte fragen.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement