Entdecken Sie eBooks
Kategorien
Entdecken Sie Hörbücher
Kategorien
Entdecken Sie Zeitschriften
Kategorien
Entdecken Sie Dokumente
Kategorien
(x86 allows all the following except nr. 1, but that’s stupid)
Unmittelbar:
- inc 3
Register Addressierung:
- inc eax
Speicheradressierung:
Adresse wird zur Laufzeit berechnet (so not mov [0x3245], 3) → Iteration for example
Direkte Addressierung:
- inc [0x3245]
Register Indirekte Add.:
- inc [eax]
Based mode:
- mov dx, [ebx+12]
Based indexed mode:
- mov dx, [ebx+ecx]
Based indexed mode w displacement:
- mov dx, [ebx+ecx + 8]
Based indexed mode w displacement and scaling:
- mov dx, [ebx+ecx*4 + 8]
Speicherindirekte Zugriffe:
- Address is a pointer to another object (e.g. linked list)
General: General:
- Variable Befehlslänge (verschiedene - Konstante Befehlslänge
Arten von Adresskodierung) -
PROS: PROS:
- Einfache Programmierung - Effizient
- Weniger Speicherbedarf - Schnell zu dekodieren
- Durch Mikroprogramme realisiert - Durch feste Verdrahtung realisiert
CONS: CONS:
Nulladressform (Kellermaschine):
- Keine explizite Operandenspezifikation
- JVM
Einadressform (Akkumulatormaschine):
- Ein Operand (Ergebnis im akkumulator immer abgelegt und damit
weitergemacht) (Shit because unflexible and need to write and load AC
constantly)
- Von-Neumann-Entwurf, fruehe 8-Bit Prozessoren
Zweiadressform (Registermaschine):
- Ergebnis überschreibt ersten Operanden (meistens Register-Speicher-Modell,
also höchstens ein operand vom Speicher)
- IA-32
Dreiadressform (Reg.-Reg.-modell/ Speicher-Speicher-Modell):
- We can say where to store the answer
- Speicher speicher means tons of speicherzugriffe and befehle need lotsa storage
- Register-register not (since it’s not adresses, so almost all RISC use this)
IA-32
Aufrufkonvention:
- Caller speichert Variablen + Params
auf dem Stack
- Call pushed BZ (so return address in
this case)
- EBP ist die Basis vom Stack fürs
Unterprogramm
- ESP zeigt wo der Stack grad ist
- Aufrufer räumt Stack auf
- Little endian
- Wichtig: Kompatibilität in beide Richtungen
- Datentypen (Byte, word, dword, qword [8-64 bit])
- Register( general purpose vs single purpose) (aber eher wenige)
- Statusregister
- Adressierungsart(everything above, so pretty complex)
- Befehlsform(1-15 Byte)
- Parameter aufm Stack
ARM v8:
- RISC (32 bit pro Befehl → Nicht jede Konstante kann in Befehl, müssen mit aus
Pool oder mit shifts erstellt werden, nur relative Sprungadressen möglich)
- Register-register maschine
- LOAD STORE fuer Speicher, sachen kann man nur in Registern tun
- Register indirekte Adressierung mit 12 bit oder Register Offset
- Viel mehr Register, 64 bit → Register Parameter
Mehrbenutzersystem
System Modus:
- Kann alles, fuer Betriebssystem, soviel Speicher wie er will
Benutzermodus:
- Kein Zugriff auf I/O, kein Zugriff auf Konfigurationsregister, muss Speicher vom
OS anfragen
Wechsel:
- System -> Benutzer: Schreiben auf ein Kontrollregister/IRET
- Benutzer -> System: Muss kontrollierter sein, spezielle Befehle: “Trap/System
Call”
- Sichert Rückadresse, springt an bestimmte adresse, schaltet
Systemmodus ein, fuehrt code durch, springt zurück -> Sichert das nicht
jeder Code ausgeführt werden kann
Virtuelle Adressen
Problem: Jede virtuelle Adresse auf jedes physikalische Addresses abzubilden
bräuchte riesige Tabelle → Paging
Zugreifen: -Virt. Adresse zerlegen, Basis in Tabelle finden, passenden Eintrag finden,
Checks: Eintrag gültig? Privilegiert? Nur lesen? Wenn gut, fertig umrechnen (bei IA32
ist das ein Basisregister + index reg*skalierung + displacement), zugreifen.
Objektdatei:
- Identifikation, Einsprungpunkt, referenz tabelle, befehle, relocation
woerterbuch (stuff that needs to be relocated, sprungziele zB), debug info
- Meist ELF (Executable and linkable format) Struktur
- Elf Header, Program Header, .text (code), .rodata (constants),
.data(allocated and defined memory), section header table (describes
sections of code)
Next: Linker
Makro Prozeduraufruf
Linker:
1. Tabelle von Modul + Länge
2. Anfangsadresse von jedem Modul bestimmen
3. Anfangsaddresse auf jede Referenz draufaddieren
4. Externe Aufrufe auch aktualisieren
Statische Bibliotheken Dynamisch Bibliotheken
Pro: Pro:
Automatisch vorhanden Nur Laden wenn nötig, spart Platz
Schnelleres Laden Kleiner Datei
Gemeinsam nutzbar
Austauschbar ohne neu Kompilieren zu
müssen
Con: Con:
Grossere Datei Versionskonflikte
Muss bei Update neu kompilieren Fehlt auf System wo Code runned
Jede obj muss die file selbst kopieren Langsameres Laden
Compiler
Praeprozessor: - in: Quelltext
out: Quelltext mit ersetzten
makros, statischen libraries usw.
Compiler:
Lexikalische Anal.:
- Liest Buchstaben, trägt
Variablen in Symboltabelle
ein, erzeugt Tokens (oft
pointers auf Symboltabelle
or constant)
Syntaktische Anal.:
- Checkt auf syntax errors, erstellt syntaxbaum
Semantische Anal.:
- Fuegt Typinformationen ein, checkt semantische Konsistenz (Typkonsistenz)
Zwischencode Generator:
- Oft in 3-Adressform oder Abstract Syntax Tree (um Ausführungsreihenfolge zu
bestimmen
Optimierung (maschinenunabhängig):
- Verschiedene Ziele möglich (Speicher, Effizienz, Geschwindigkeit etc.)
Laufzeitsystem:
- Dynamische Speicherallozierung
- Dynamische Bibliotheken
- I/O
Pro: Pro:
Keine Kompilierung Portabel
Flexibler, dynamischer
Portabel
x86 Computer
Real Mode Protected Mode
Arbeitsspeicherbereiche:
- 0KB - 640 KB: Lower Memory Area
- Speicher fuer BIOS Daten, OS (Interrupt vector Tabellen [0-400 Byte]), 16
Bit Applikationen
- 640 KB - 1 MB: Upper Memory Area
- Speicher für andere Hardwarekomponenten (BIOS ROM, Videokarte)
- 1MB - 1,06 MB High Memory Area:
- Max. Segmentstartadresse ist 0xFFFF0 (weil 16 bit pro segment)
- 32 Bit Programme brauchen 21tes Bit im Adressbus, manche 16 bit
wollen ohne
- 1 MB - 1 GB: Extended Memory
- Normal RAM (DOS/4GW extension needed for MS-DOS because
programs need more than 1 MB, but 32 bit protected mode isn’t
compatible with MSDOS → Extensions is bridge)
Bussystem:
- Bei 16 Bit ISA:
- Datenbus: 16 Bit
- Adressbus: 24 Bit
- Kontroll/Steuerbus (Lesen/Schreiben, Kontrolle ueber Bus etc.)
I/O:
- Besonderer Weg mit I/O zu reden IO hat separaten Adressraum, zB
OUT 20h, AL ; Schreibe Inhalt von AL nach I/O port 20h
- IN: Maus, Tastatur erzeugen interrupt requests (IRQ) → Programmable Interrupt
Controller (PIC) sagts dem Prozessor, prozessor machts, pic sagts der Maus
(nicht mit BIOS, da zwar rückwärtskompatibel aber langsamer)
- OUT: zB mit DMA Kontroller um nicht Prozessor zu unterbrechen fuer Sound
BIOS:
- Basic I/O System, where eip starts when booting computer
Booting:
- 1. Reset →Register mit vordefinierten Werten gestartet, zB EIP = 0xFFFF0
- 2. BIOS → Code an bei EIP wird ausgeführt, BIOS ROM an 0xF0000 - 0xFFFFF,
macht ein paar Hardware tests und init
- 3. Bootloader → BIOS lädt Bootloader, Bootloader kontrolliert, lädt mehr
Komponenten wenn nötig, spricht mit hardware über BIOS, lädt und init OS
- 4. OS → OS starts up
- 5. Programm → Programm wird gestartet
DMA Controller:
- Can control bus + directly access memory
- Communication & programmable with IO ports skips processor which is good
Mikroprogrammierung
Elemente sind Schaltnetze
(+Signalbuffer um Daten kurz zu
halten):
- zB Multiplexer
- zB Dekodierer (Funktion zB
one-hot encoding)
Direkte Umsetzung von ISA auf Gatter, ISA Opcodes dekodieren und
fuer simple ISAa Mikroprogramme ausloesen
Pro: Pro:
- Hohe Performanz - Leichteres Design
- Leichter korrigierbar
- Fehler nicht so schlimm
- Taktsteuerung
Con: Con:
- Entwicklung dauert - Langsamer
- Fehleranfällig
- Schwer anpassbar
Architektur Mikroprogramm
- Speicher
- 80 bit Befehle → Befehle können auch kodiert sein → Pro weniger speicher,
leichter programmierbar Con dekodieren, extra hardware
- Horizontal (nicht kodiert), vertikal (stark kodiert), quasi horizontal (optimal
kodiert ist unsere)
- 4000 Befehle → 40 KB
- Tabelle wobei jeder Opcode auf ein Mikroprogramm verweist
- Mikroprogrammspeicher Optionen: ROM/PROM/RAM/Hybrid
- Leitwerk
- Berechnet Mikroinstruktionzähler, holt befehl, tut ihn in MI-Register
- Adressen multiplexer intern hat 5 Eingänge: 0, externe adresse,
mi-befehlszähler, Zählerregister, stack
- INST PLA (Instruktion Programmable Logic Array) bestimmt welche
genommen wird mit befehlen aus mi-register (bestimmt auch stack und
Zähler)
- Makrobefehl ausführen: JMAP loest mikro aus, dann makro bz auf
adressbus und in makro instruktionsregister lesen
Mikro Programmzyklus (getaktet):
- Adresse nächster Mikrobefehl bestimmen,
- Befehl holen und in Mikroinstruktion Register laden
- Signale lösen Programm aus
Rechenwerk
- Nur 4 bit, kann man aber verknüpfen und übertrag durchgeben
- See picture basically → Register Als Schaltwerke, ALU & ALU auswahl als
Schaltnetz/Multiplexer, Schiebeeinheiten und Auswahl signale auch Schaltnetze
Schaltnetze
ROM -> Decoder (One hot encodes addr) + Encoder (Takes one hot encoding makes it
into data)
Definitionen:
Hazards:
- Spezifikationswidriger Wert des Ausgangssignals in Abhängigkeit des
Zeitverhaltens von Signalen in Schaltnetzen -> Temporäres problem
Races:
- Problem beim Ausgangswert durch Verzögerung bei Rückkopplung ->
Permanent problem
Umgehen davon durch Taktung (kostet aber mehr Zeit, weil man auf alle wartet),
anderes Schaltnetzdesign
Am billigsten nur NAND, wird in Praxis auch oft so gemacht
Schaltwerke
Endliche Automaten:
- Endliche Anzahl an zuständen
- Mealy Automat: Resultat hängt vom Zustand und
Eingang ab Sechstupel aus E(Eingangsmenge),
A,Q, 𝜆, 𝛿, q (Anfangszustand)
- Automatentafel/ Automatengraph fuer A = {abcd}, E
= {x,z,y}, Q={1,2}
Moore Mealy
- Resultat hängt nur von Zustand - Resultat hängt vom Zustand und
ab → Eingang bestimmt nur Eingang ab
Zustand
Definitionen:
- Prozess: Sequentielle Abfolge von Schritten
- Parallelität: Es gibt einen Zeitpunkt zu dem beide laufen
- Asynchron: Keine Zeitbeziehung
- Funktionalität: Funktional wenn Eingaben reproduzierbar und eindeutig auf
Ausgaben abgebildet werden (asynchron meist nicht funktional)
Taktung:
- Verschiedene Teile vom Computer oft unterschiedlich getaktet
- Taktung heute variabel, kann vom Nutzer (Dynamic Voltage and Frequency
Scaling [DVFS] → Kann für wenig energie optimieren) oder Temp (power
capping) gesteuert werden oder prozessorauslastung
- Synchronisiert die Maschine
Bauelement Schicht
Schaltungsentwurf
Optionen:
- Komponenten → MI
- Application-Specific
integrated circuit
- Programmable Logic
Device
- Programmierbare
Schaltungen →
Billiger, kleiner aber
weniger schnell als
ASIC, entwicklung
schneller als Gatter
VHDL
Structural Behavioral Dataflow
Speicher
Memory wall “Von Neumann Flaschenhals”:
- Speicherzugriffe dauern, Befehle die auf Speicher zugreifen warten und
Prozessor ist im Leerlauf → Improve VNA fuer bessere Latenz und Bandbreite
Arten: RAM, ROM, PROM, (E)EPROM (Electrically erasable/ UV light)
Speicher und CPU zusammen? -> DRAM und Logik nicht ganz kompatibel, SRAM zu
teuer
Gross und langsamer Speicher oder schneller und kleiner Speicher → Cache
Cache
- Cache enthält immer Kopie aus
Hauptspeicher, unlike register
- Transparent verwaltet → Benutzer
merkt nichts davon, Hardware mit
Hilfe von Software entscheidet was
cached wird → Zeitliche Lokalität +
Räumliche Lokalität
- Immer ganze Zahlen laden, weil
billiger und Räumliche Lokalität
- Nicht-Assoziativer Cache:
- Jede Adresse ist eine
Cachezeile
- Pro: Leicht zu bauen, schnell
- Con: Oft verdrangung, unflexibel
- Fragen:
- Welche Cachezeile verdrängt man? → Least recently/ Least frequently
used
- Wann aktualisiert man den Speicher? → Sofort, “write through”, Später,
“write back” (man merkt sich mit dirty bit das die Zeile geändert wurde)
- Cache-Miss: Wird Datum in Cache eingelagert? → Write-allocation, ja, No
Write-Allocation nein, cache macht nichts
- Cache vor oder nach MMU?
- Virtually indexed cache (vor MMU):
- Pro: Direkter Zugang, schneller
- Con: Mehrere Prozesse können gleiche virt. Adresse
verwenden → Vor Prozesswechsel Cache loeschen/ Tag um
Process Id erweitern → Langsamer, also besser für kleine
Caches
- Physically indexed cache (nach MMU):
Pipelining
Metric: CPI (Cycles
per Instruction)/ IPC
Ideal: Bei k Takten
pro Befehl k Befehle
gleichzeitig in
Bearbeitung
→ Ausführen eines
Programms dauert
dann k-1 + n
Probleme:
- Pipeline fehlt
Ressourcen in
Hardware
Structural
Hazard
- Datenabhängigkeiten nicht erfüllt Data Hazard → Lösung: Forwarding
Parallelität
Dynamic Scheduling:
- Befehle out-of-order ausführen
- Pro: Schneller, paralleler
- Con: Mehr Buchhaltung, Speicher muss konsistent gehalten werden obwohl
Speicherzugriffe vertauscht werden
Superskalarprinzip:
- Mehrere Kerne, Dekodierer usw.
- Transparent?
- Pro: Leichter zu programmieren
- Con: Komplexe Hardware,
Compiler hat nicht alle Infos
Flynn’s Classification:
- SIMD: Hoehere Leistung, aber nur ein
Hardware Thread
- MIMD: Mehrere Threads, jeder führt
getrennte Instruktionsstroeme aus
(shared Resourcen je nachdem anders
Speicher immer shared und E/A
often, sonst getrennte computer)
- Jeder Prozessor hat mehrere
threads (jeder Thread eigener
BZ und eigene Register, eigener Stack, eigene Befehle)
- Einfaches Multithreading -> Je nach takt umschalten
- Simultaneous MT -> Gleichzeitige Nutzung von Ressourcen → OoO
Konsequenzen:
- Mehrere Kerne, ein Speicher, ein Bus → Weg von normalen bussen, hin zu
direkteren Speicheranbindungen, mehrere Speicherkontroller direkt in Prozessor
- Verzeichnisbasierte Kohärenz:
Zentrales Verzeichnis merkt sich wo was liegt, keine Busse aber mehr
Aufwand
- Problem: False sharing, Info wandert zwischen Cache obwohl es nicht
nötig ist
- Spin Locks: Warte auf lock wenn vergeben Pro: Schnelle Reaktion Con:
Kostet Ressourcen für nix
- Yielding Locks: Falls Lock vergeben, mach was anderes Pro: Keine
Verschwendung Con: Langsamere Reaktion
E/A
- PCI: Peripheral Component Interconnect
- Verbunde mit CPU via Hostbridge