Komponenten/Busse. Dr.-Ing. Volkmar Sieh. Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2010/2011

Ähnliche Dokumente
Komponenten/Busse. Dr.-Ing. Volkmar Sieh

Komponenten/Busse. Dr.-Ing. Volkmar Sieh. Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2009

Emulation. Dr.-Ing. Volkmar Sieh. Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg

Architektur/Chip/Komponente

Hinweise C-Programmierung

Cache II. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2011

Just-In-Time-Compiler (2)

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

Busse. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2008/2009

Just-In-Time-Compiler (2)

Einschub: HW-Zugriff aus dem Userspace

Aufgabe 1 Entwicklung einer Virtuellen Maschine

Busse. Dr.-Ing. Volkmar Sieh WS 2005/2006. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Hardware PCI-Bus. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Virtueller Speicher und Memory Management

Hardware und Gerätetreiber

Speicher. Speicher. Speicherhierarchie. Speicher. Interessante Zahlen:

Schreiben von Pages. Schreiben einer Page in den Swap Space ist sehr teuer (kostet millionen von CPU Zyklen).

Multiprozessoren. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2011

Übungen zu Grundlagen der Rechnerarchitektur und -organisation: Bonusaufgaben Übung 6 und Präsenzaufgaben Übung 7

Assembler - Einleitung

Übungen zu Grundlagen der Rechnerarchitektur und -organisation: Bonusaufgaben Übung 9 und Präsenzaufgaben Übung 10

Hardware-basierte Virtualisierung

Assembler Kontrollstrukturen

x86 Open Source Virtualisierungstechniken Thomas Glanzmann

Rechnerorganisation. 1. Juni 201 KC Posch

Hardware-basierte Virtualisierung

Wie groß ist die Page Table?

Paravirtualisierung (2)

Vorlesung: Rechnerstrukturen, Teil 2 (Modul IP7)

Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1

Umstellung auf neue Pipeline

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C

Just-In-Time-Compiler (1)

Bibliotheks-basierte Virtualisierung

Homogene Multi-Core-Prozessor-Architekturen

Übungen zu Grundlagen der Rechnerarchitektur und -organisation (ÜGRa)

Rechnerorganisation. Überblick über den Teil 13

Cache Grundlagen. Schreibender Cache Zugriff. SS 2012 Grundlagen der Rechnerarchitektur Speicher 22

Informatik - Übungsstunde

Assembler - Variablen

Zeiger vom Typ void* benötigen weniger Speicher als andere Zeiger, da bei anderen Zeigertypen zusätzlich die Größe gespeichert werden muss.

Assembler - Adressierungsarten

Übungen zu Grundlagen der Rechnerarchitektur und -organisation: Bonusaufgaben Übung 8 und Präsenzaufgaben Übung 9

Besprechung des 9. Übungsblattes Virtuelle Speicherverwaltung Aufgaben

Quiz. Gegeben sei ein 16KB Cache mit 32 Byte Blockgröße. Wie verteilen sich die Bits einer 32 Bit Adresse auf: Tag Index Byte Offset.

Übung zu Betriebssysteme

Eine Familie von gemeinsamen Speichern für MPSoCs

Betriebssysteme Vorstellung

Datenübertragung per Direct Memory Access (DMA)

Übungen zu Grundlagen der systemnahen Programmierung in C (GSPiC) im Sommersemester 2018

Einführung in C. Alexander Batoulis. 5. Mai Fakutltät IV Technische Universität Berlin

Treiber PCI-Subsystem

Cache. Dr.-Ing. Volkmar Sieh. Institut für Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg SS 2011

Einführung in die Programmiersprache C

Übersicht. Busse. Übersicht. Bus, Bridge, I/O-Controller. Einleitung Hersteller-Konfiguration Manuelle Konfiguration Programmierbare Konfiguration

Verschiedenes. Peter B. Ladkin

ggf. page fault virtuelle Adresse physikalische Adresse Hauptspeicher Seitenrahmen Register Seitentabelle logical address page number frame number

Assembler Integer-Arithmetik

Aufgabe 2 - Erweiterung um PIC und Interrupts

Variablen. Deklaration: «Datentyp» «Variablenname» Datentyp bestimmt Größe in Bytes: sizeof Beispiel: long int v; Größe: 4 Bytes

Aufgabe 2 - Erweiterung um PIC und Interrupts

Programmiertechnik. Teil 4. C++ Funktionen: Prototypen Overloading Parameter. C++ Funktionen: Eigenschaften

Hardware Logik-Analysatoren

In heutigen Computern findet man schnellen/teuren als auch langsamen/billigen Speicher

Einführung Sprachfeatures Hinweise, Tipps und Styleguide Informationen. Einführung in C. Patrick Schulz

Systemnahe Programmierung in C (SPiC)

Assembler Unterprogramme

Mikroprozessortechnik Grundlagen 1

Hardware & Kernel-Module

Assembler. Dr.-Ing. Volkmar Sieh. Department Informatik 4 Verteilte Systeme und Betriebssysteme Friedrich-Alexander-Universität Erlangen-Nürnberg

Technische Informatik 1 - HS 2017

Datenstrukturen, Alignment Stack Prozeduraufruf, Parameterübergabe und -rückgabe (Calling Conventions) Leaf procedures

Echtzeitbetriebssysteme

Einführung. GPU-Versuch. Andreas Schäfer Friedrich-Alexander-Universität Erlangen-Nürnberg

RAM. Konsistenzprobleme entstehen => CPU - durch Verzögerung in Warteschlange, Umfangreiche Pufferung in den PCI Brücken. lesen. EOP-Signal.

Cache-Speicher. Design Digitaler Systeme. Prof. Dr.-Ing. Rainer Bermbach

Tag 8 Repetitorium Informatik (Java)


VHDL - Synthese. Dr.-Ing. Matthias Sand. Lehrstuhl für Informatik 3 (Rechnerarchitektur) Friedrich-Alexander-Universität Erlangen-Nürnberg

Datenpfad einer einfachen MIPS CPU

Vorlesung Modellierung und Simulation heterogener Systeme

Praktikum angewandte Systemsoftwaretechnik (PASST)

Assignment #2. Virtueller Speicher Virtual Memory WS 2012/2013 IAIK 1

Rechnerstrukturen. 6. System. Systemebene. Rechnerstrukturen Wintersemester 2002/03. (c) Peter Sturm, Universität Trier 1. Prozessor.

Pointer und Arrays. INE1, Montag M. Thaler, Office TG208. ZHAW, M. Thaler, K. Rege, G.

Einführung in die Programmiersprache C

Einführung in die Programmiersprache C

Vorlesung 3: Verschiedenes

Transkript:

Komponenten/Busse Dr.-Ing. Volkmar Sieh Department Informatik 3: Rechnerarchitektur Friedrich-Alexander-Universität Erlangen-Nürnberg WS 2010/2011 Komponenten/Busse 1/29 2010-09-28

Komponenten/Busse Praxis Beispiel war einfach; Praxis u.u. sehr viel komplexer: mehrere Busse; jeweils mehrere angeschl. Geräte mehrere CPUs mehrere RAM-Module mehrere (verschiedene) I/O-Geräte Zusätzliche Forderung: Konfigurierbarkeit Komponenten/Busse 2/29 2010-09-28

Komponenten/Busse Praxis Einfacher Standard -PC: ca. 300 Komponenten und Kabel! Komponenten/Busse 3/29 2010-09-28

Komponenten/Busse Praxis Beispiel: FAUmachine Motherboard: Komponenten/Busse 4/29 2010-09-28

Komponenten/Busse Motivation Werden Komponenten (z.b. CPU, RAM, ROM, I/O-Geräte) Busse (z.b. PCI-Bus, ISA-Bus) getrennt voneinander modelliert, können sie wiederverwendet werden (z.b. für Multiprozessor-System mit mehreren Speicher-Modulen und mehreren Platten). Komponenten/Busse 5/29 2010-09-28

Komponenten/Busse Motivation Alle Komponenten sollten keine globalen/statischen Variablen verwenden. Sonst können sie nur einmal instanziert werden. Jede Komponente muss ihren Speicher allozieren. Zugriff auf Zustand nur über Pointer. Komponenten/Busse 6/29 2010-09-28

Komponenten/Busse Callbacks Callback-Funktionen: CPU(s) und I/O-Geräte melden sich an ihrem Bus an. Sie hinterlegen Funktionen, die bei entsprechenden Bus-Zyklen aufgerufen werden sollen ( Callback -Funktionen), und übergeben Pointer auf ihren Zustandsspeicher ( State -Pointer). CPU ruft Bus-Funktion (z.b. inb) auf. Bus-Funktion ruft der Reihe nach die Funktionen der angeschlossenen I/O-Geräte auf (z.b. ser_in, disk_in) und übergibt State-Pointer wieder. Jedes aufgerufene Gerät überprüft anhand der übergebenen Adresse/Ports selbst, ob es gemeint ist. Komponenten/Busse 7/29 2010-09-28

Komponenten/Busse Callbacks struct bus_funcs { void (*in)(void *state, int port, uint8_t *valp); void (*out)(void *state, int port, uint8_t val); void (*load)(void *state, int addr, uint8_t *valp); void (*store)(void *state, int addr, uint8_t val);... ; struct bus { struct { void *state; struct bus_funcs *funcs; member[nmembers]; unsigned int nmembers; ; Komponenten/Busse 8/29 2010-09-28

Komponenten/Busse Callbacks void bus_connect( struct bus *bus, void *state, struct bus_funcs *funcs ) { bus->member[bus->nmembers].state = state; bus->member[bus->nmembers].funcs = funcs; bus->nmembers++; Komponenten/Busse 9/29 2010-09-28

Komponenten/Busse Callbacks void bus_out( struct bus *bus, int port, uint8_t val ) { unsigned int i; for (i = 0; i < bus->nmembers; i++) { (bus->member[i].func->out)(bus->member[i].state, port, val); Komponenten/Busse 10/29 2010-09-28

Komponenten/Busse Callbacks void bus_in( struct bus *bus, int port, uint8_t *valp ) { unsigned int i; *valp = 0x00; /* Or: *valp = 0xff; */ for (i = 0; i < bus->nmembers; i++) { (bus->member[i].func->in)(bus->member[i].state, port, valp); Alle angeschlossenen Geräte werden aufgerufen. Eines (oder keines!) trägt den Return-Wert ein. Komponenten/Busse 11/29 2010-09-28

Komponenten/Busse Aufbau des Systems durch system_init() { bus = bus_new(); cpu = cpu_new(bus); ram = ram_new(bus, 0x0000, 0x4000); rom = rom_new(bus, 0x4000); ser = ser_new(bus, 0x00); disk = disk_new(bus, 0x04); Komponenten/Busse 12/29 2010-09-28

Komponenten/Busse Emulation des Systems durch system_step() { for (;;) { /* bus_step(bus); */ cpu_step(cpu); /* ram_step(ram); */ /* rom_step(rom); */ ser_step(ser); disk_step(disk); Komponenten/Busse 13/29 2010-09-28

Komponenten/Busse struct ser { /* Config */ int port; /* Ports */ struct bus *bus; ; /* State */ int key; int avail; Komponenten/Busse 14/29 2010-09-28

Komponenten/Busse ser_in(struct ser *ser, int port, uint8_t *valp) { if (port < ser->port ser->port + 1 < port) return; switch (port & 1) { case 0: ser->avail = 0; *valp = ser->key; return; case 1: *valp = ser->avail; return; ser_out(struct ser *ser, int port, uint8_t val) { if (port!= ser->port) return; host_print_char(val); Komponenten/Busse 15/29 2010-09-28

Komponenten/Busse ser_step(struct ser *ser) { if (host_key_avail()) { ser->key = host_get_key(); ser->avail = 1; bus_interrupt(ser->bus, ser); Komponenten/Busse 16/29 2010-09-28

Komponenten/Busse struct ser *ser_new(struct bus *bus, int port) { static const struct bus_funcs ser_funcs = {.in = ser_in,.out = ser_out, ; struct ser *ser = malloc(sizeof(struct ser)); ser->port = port; ser->bus = bus; ser->key = 0; ser->avail = 0; bus_connect(bus, ser, &ser_funcs); return ser; Komponenten/Busse 17/29 2010-09-28

Komponenten/Busse Komponenten und Busse entsprechen in VHDL-Entities bzw. -Signalen. Bus-Funktionsaufrufe (z.b. bus_in, bus_store) entsprechen Bus-Zyklen echter Busse (hier IOR- bzw. MEMW-Zyklus). Komponenten/Busse 18/29 2010-09-28

Komponenten/Busse Performance Die Bus-Indirektionsstufen kosten leider Performance. CPU -> Bus -> RAM CPU -> Bus -> I/O In Realität leider sogar noch längere Wege: z.b.: CPU -> Host-Bus -> North-Bridge -> Mem-Bus -> RAM CPU -> Host-Bus -> North-Bridge -> PCI-Bus -> South-Bridge -> ISA-Bus -> I/O Komponenten/Busse 19/29 2010-09-28

Komponenten/Busse Performance Komponenten/Busse 20/29 2010-09-28

Komponenten/Busse Performance Lösung für I/O-Komponenten: Weiterreichen der Callback-Funktionen an die CPU und Cachen der Callback-Funktionen in der CPU Lösung für Speicher: Weiterreichen der Adresse an die CPU und direktes Nutzen des Speichers durch die CPU Komponenten/Busse 21/29 2010-09-28

Komponenten/Busse I/O-Port-Info-Caching I/O-Zugriffe auf den gleichen Port gehen (fast) immer wieder an das gleiche I/O-Gerät => in- bzw. out-callback-pointer in der CPU cachen Komponenten/Busse 22/29 2010-09-28

Komponenten/Busse I/O-Port-Info-Caching bus_in_info( struct bus *bus, int port, void **statep, void (**inp)(int, uint8_t *) ) { unsigned int i; *inp = NULL; for (i = 0; i < bus->nmembers; i++) { bus->member[i].func->in_info(bus->member[i].state, port, statep, inp); Entsprechend: bus_out_info. Evntl. existiert noch eine Funktion zum Flushen der I/O-Info (wenn Ports sich ändern). Komponenten/Busse 23/29 2010-09-28

Komponenten/Busse I/O-Port-Info-Caching void *state[0x10000]; void (*in_cb[0x10000])(void *state, int port, uint8_t *valp in(int port, uint8_t *valp) { void (*func)(void *state, int port, uint8_t *valp); func = in_cb[port]; if (! func) { bus_in_info(bus, port, &state[port], &in_cb[port]); func = in_cb[port]; if (! func) return; func(state[port], port, valp); Entsprechend: out. Bridges reichen bus_{in,out_info-aufrufe einfach weiter. Komponenten/Busse 24/29 2010-09-28

Komponenten/Busse Memory-Zugriff bei Speicherzugriffen muss nichts simuliert werden i.a. existiert Speicher immer in Vielfachen von ganzen Pages (x86: 4kByte) => direktes Zugriff der CPU auf den Speicher Ausnahme: Zugriff auf Memory-mapped-I/O-Bereiche (z.b. Grafikkarte)! Komponenten/Busse 25/29 2010-09-28

Komponenten/Busse Memory-Info-Caching bus_load_info( struct bus *bus, int addr, uint8_t **memp ) { unsigned int i; *memp = NULL; for (i = 0; i < bus->nmembers; i++) { bus->member[i].func->load_info(bus->member[i].state addr, memp); Entsprechend: bus_store_info. Evntl. existiert noch eine Funktion zum Invalidieren der gecachten Speicheradressen (wenn physikalischer Speicher sich ändert). Komponenten/Busse 26/29 2010-09-28

Komponenten/Busse Memory-Info-Caching uint8_t *mem[1 << (32-12)]; uint8_t load(uint32_t addr) { uint8_t *p; p = mem[addr >> 12]; if (! p) { bus_load_info(bus, addr, &mem[addr >> 12]); p = mem[addr >> 12]; if (! p) return bus_load(bus, addr); return *(p + (addr & 0xfff)); Entsprechend: store. Komponenten/Busse 27/29 2010-09-28

Komponenten/Busse MMU und Memory-Info-Caching MMU macht Lookup in TLB Memory-Info-Caching macht Lookup im Info-Cache => Speicherzugriffe sehr aufwändig! Sehr wichtige Idee: Lookups verknüpfen: MMU macht Lookup in TLB im TLB stehen nicht mehr physikalische Adressen sondern direkt die Pointer zu den emulierten Speicherseiten => Speicherzugriff über einen, schnellen Lookup! Komponenten/Busse 28/29 2010-09-28

Komponenten/Busse MMU und Memory-Info-Caching Ergebnisse dieses Abschnitts: Man kann komplexe Systeme aufbauen, man kann die einzelnen Komponenten gut voneinander trennen, man kann die einzelnen Busse gut voneinander trennen, man kann die Systeme konfigurierbar machen, ohne große Performance-Einbußen hinnehmen zu müssen. Motto: Cachen, was cache-bar ist...! Komponenten/Busse 29/29 2010-09-28