Die Geschichte von DMA und NVIDIA

Der IBM PC, den ich habe, ist alt, sie ist ein ibm pc 5160 mit 8088er Prozessor ich habe drei solcher Mainboards er hat ein altes Netzteil. Er ist zwar eigentlich XT, was aber nicht tragisch ist, weil IBM PC $\equiv$ IBM PC XT, aber eben kein AT, AT sind deutlich anders, mit 268er. Die IBM PC und IBM PC XT sind die guten. Die AT die nicht so beliebten. Das muss man sich merken, dass es drei gibt

  1. IBM PC
  2. IBM PC XT
  3. IBM PC AT

was macht das so schwer das zu unterscheiden, nicht XT/AT, sondern sie müssen wissen, es gibt drei. Wobei die ersten sind eigentlich gleich. Keine Sorge AT/XT verwechsele ich immer, aber ich verwechsle die Graphikkarten nicht. Vielleicht kann man das auswendig lernen, little endian und big endian. Das kann ich nämlich, ich habe das so gelernt


little endian: falsch rum
big endian: richtig rum

Vielleicht


AT: Falsch rum
XT: Richtig rum

Es gibt an Graphikkarten

  1. MDA (Monochrome)
  2. EGA (Enhanced Graphics Adapter)
  3. CGA (Color Graphics Adapter)
  4. VGA
  5. Daneben Hercules Graphikkarten

Und auf dem PC, gibt es an jumpern, die einstellung, es gibt ja, die Systemboard Switches, davon gibt es die Continously Perform Power On Selftest. Den macht er immer, nur dass er immer wieder von vorne anfängt, und es gibt die Einstellung Diskette 1, 2, 3, 4, keine

Die System Board Switches sind in Assembler als Address abfragbar. Die sind jeweils ein Pin/Bit

Und für die Graphikkarte:

  1. No Display Adapter
  2. Enhanced Graphics Adapter
  3. Color Graphics Adapter (2.. x 40)
  4. Color Graphics Adapter (20 x 80) oder so
  5. Professional Graphics Controller
  6. Monochrome Printer Adapter

Was sagt das? Monochrome ist klar. Das sind halt zwei Farben. Es gab auch IBM PC's ohne Display. Zum Beispiel bei Maschinensteuerung oder so - kann man sich vorstellen

Dann das spielt beim NVIDIA Problem von Linux eine Rolle

  1. Es gibt den Adapter. Der Setzt, das was vom Prozessor kommt direkt in die entsprechenden Werte für das MDA um, so zu sagen
  2. Dann kommt der Controller. Das heisst, unser HD44780, das hat damit nichts zu tun, also unser Display für unseren AVR, haben ja, Befehle, oder die SDA Festplatte. die haben einen controller, das haben die meisten Geräte. Die verstehen Protokoll Befehle, wie Daten lesen, daten schreiben. Der Adapter macht das direkt
  3. Ohne änderung am PC zu spühren, kommt der Controller, der versteht Protokoll Befehle, aber dann kommen Graphikkarten mit speicher und CPU, die haben einen eigenen Speicher, eigene CPU's. Die übertragen wohl mit DMA, ganze Graphikkarten Programme. Dazu war der erste Vodoo 3D Chip und dann jetzt NVIDIA. Die programmiersprache kann man mit CUDA lernen. Das sind spezielle Assembler Programme, die lassen sich halt mit CUDA, so heisst lernen, sind aber nicht quelloffen, propriätär. Deswegen der Streit

die haben Operanden irgendwie mit 6 Operanden oder so, anders als andere. Der Witz ist halt, dass ich ein Programm da hinschicke, mit MDA

MDA: Einfach an die entsprechende Speicherstelle schreiben

er hat ein alte Tastatur. Und altes Netzteil und so weiter ist eigentlich komplett alt was Neues auch das auch die Grafikkarte ega cga ich glaube, Hercules ah was ich trotzdem tue ich Kauf mir trotzdem ein komplett alten PC an mit einem Monitor und der komplett als System komplett ist. Ich finde es gerade bequem, dass ich hier Video Adapter haben trotzdem mit alten Bildschirm und allem

Es läuft Dost drauf auf dem jetzigen und die Spiele Digger dazu Turbo C. Turbo Assembler. Ich spiele mal ne Runde, digger.

Sie müssen zwischen Memory Mapped IO und DMA unterscheiden, das hat nichts miteinander zu tun. Mich hat mal eine Frau gefragt, können sie auch mit bluetooth. Ich baue ihnen vielleicht bald eine Schaltung mit Bluetooth. Weil es gibt halt Adapter. Man darf sich das nicht so vorstellen, dass man selber eine schaltung lötet. Sondern es gibt Bausteine. Das ist, wie mit dem UART - wenn sie beim UART sind sie schnell bei - also RS232 CCITT, dann sind sie schnell bei I2C und dann schnell bei USB - also sie können einfach USB machen, das sind aber fertige bausteine

beim x86er ist das ein externen Baustein und beim AVR, das lerne ich ja gerade ist der UART - auf dem Prozessor

Sie müssen halt Baudrate wissen, Zeichen pro Sekunde. Das hängt von ihrem Satz ab, ab sie 1 Bit Zeichen haben, das heisst 0/1 ist. Dann ist 0 oder 1 pro Sekunde ein Baud. Oder sie 5 Bit haben, wie bei CCITT-1 - von Baudot selber oder 256 Zeichen, ASCII Code oder

2^16
.

Gut - das muss man wissen, dann gibt es für den Baustein Register. Beim AVR müssen sie nur noch einen MAX232 anschliessen, weil RS232 arbeitet mit 12V und nicht mit 5V

So. Und dann gibt es einen UART Baustein, der kann integriert sein. Und dann geht auch Bluetooth. So, das ist das. Das andere ist - dass sie bei DMA einen Baustein. Ich habe 4 fertige x86er. Von Ebay. Jeweils 6 Euro oder so. Sie können eine einfache Schaltung bauen, und sie müssen halt ein EEPROM nehmen. Das ist kein Problem. Aber der Witz ist, DMA zum Beispiel, sie machen nicht selber einen schaltung

Der DMA Controller ist nicht mit dem Prozessor verbunden, sondern mit dem RAM - das ist ein eigener Baustein. Und wenn sie an eine Addresse schreiben, dann überträgt der das an das gerät

Und beim x86er, sind die typischen Bausteine PIC 8259A - das ist der Interrupt Controller, 8253, und dann 51 und 57, Paralleler und serieller Input/Output Controller. Und zum Beispiel Z80 Prozessor heissen die SIO/PIO

Und der DMA macht das selber, bei Memory Mapped I/O ist es so - die anbindung von x86er an den RAM und die I/O ist nicht extrem kompliziert. Schauen sie sich das Blockschaltbild an

Sie brauchen kein DMA - aber beim x86er kommen Memory Mapped I/O nicht herum. Das geht nicht anders. Weil das Konzept ist so

Folgendes: Sie haben einen externen Systembus

Sie müssen unterscheiden zwischen

  1. Interner Systembus
  2. Externer
Dann müssen sie unterscheiden

  1. Datenbus
  2. Addressbus
  3. Steuerbus
Der Steuerbus im Prozessor hat mit dem ausserhalb nichts zu tun. sie haben im Prozessor, ein Befehlsdekoder. Es gibt kein einheitliches System, für einen Steuerbus, das ist von CPU zu CPU anders. So, nach aussen, müssen sie zum Beispiel das RAM aktivieren mit WE - write enable

So, der Externe Systembus ist

  1. Datenbus
  2. Addressbus
  3. Steuerbus

Und wenn sie einen AVR angucken - sie brauchen beim x86er keine Interrupts, nicht zwingend. Das wird uns durch das multitasking und Betriebssystem DOS 0x21, so erklärt, aber sie brauchen keine Interrupts

Aber sie brauchen Memory Mapped I/O. Weil - beim AVR Atmega8, haben sie den RAM und den Speicher auf dem Baustein, natürlich haben sie Ports für die EA

Das sind 8 bit, jeweils, PORTA, PORTB, PORTC, ...

Jeweils 8 "Leitungen" Bits. Und - der Witz ist halt. Dass sie quasi 3 Geräte anschliessen können, oder vier


PORTA, PORTB, PORTC, PORTD
Und jetzt kommt Memory Mapped I/O. Der Intel hat quasi genauso einen Port, das ist PORTA - sagen wir, also statt

PORTA, PORTB, ...
hat der nur PORTA - man könnte sagen, der ist schlechter. Nur ein Gerät. Dafür 16 Bit.

Also ein Wort. Jetzt sind sie aber mit einem Gerät nicht zufrieden. das hat mit Interrupts nichts zu tun. Sie haben 16 Interrupts. Aber das sind Unterbrechungen, die werde ausgelöst. Da meldet sich jemand. Das brauchen sie aber nicht

Wenn sie dem LCD was schicken, dann brauchen sie keine Unterbrechung. Trotzdem haben sie

2^16
geräte

Was machen sie, wenn sie nur PORTA haben, sie brauchen

2^16
Ports. Brauchen sie nicht

sie nehmen, Addressbus und Datenbus, sie schicken die Daten an das Gerät, wie an den RAM - und sie brauchen aber

2^16
geräte. Dafür sie die Addressen. Das sind adressen von 0 bis
2^{16}-1
.

Gut - jetzt haben sie ein Problem. der eine Adress und Datenbus ist für den RAM zuständig. Was unterscheidet das jetzt von den Geräten

Und jetzt muss man aufpassen. Man könnte an der CPU ein Bit machen, wenn das HIGH ist, dann ist der RAM gemeint. Wenn es LOW ist, dann ist die E/A gemeint

Und genau ist es. Beim x86er gibt es - 3 Bit. Sie können ins Blockschaltbild gucken. Da sind 3 Bit. Die unterscheiden, einen Zugriff vom RAM von dem von der E/A. Und der Witz ist - dass das Pins aussen dran sind

So, jetzt ist die Frage - warum heisst das Memory Mapped I/O. Speicherbereich. Das ist eine verwechslung. Bei DMA ist der Speicher im RAM - und der Controller, das machen sie nicht selber überträgt die Daten

Memory Mapped I/O benutzt wie der RAM, Addressen und Datenbus. Und die Addressen sind wie alle. Aber das ist kein Bereich im Arbeitsspeicher

Sie schreiben auf den Bus aussen auf Daten und Addressen, derselbe Bus. Aber ein Mal ist RAM gemeint und ein Mal E/A

Und dann eben 1 Bit könnte man sagen, aussen dran, zur unterscheidung, oder - 3 Bit beim x86

Jetzt wie handelt man das mit den 3 Bit. Komplizierte Schaltung bauen. Nein eben nicht Intel bietet einen Baustein an. Die 3 Bit, sind am x86er kompliziert, das ist nicht easy. Es gibt einen fertigen Baustein

Es gibt nur eine Frage. Wie setze ich die Bits? Wenn ich HIGH die E/A will und LOW den RAM, wie mache ich das?

Jetzt müssen sie gucken, das kommt in ihrem Programm vor

Es gibt normalerweise

  1. Laden/Load
  2. Speichern/Store
  3. Register-Register: Move

Laden, ist von Speicher zu Register Speichern von Register zu Speicher Move von Register zu Register

Bei Intel sind alle zu MOV zusammengefasst

Aber was mit der E/A.Sie kommen um Memory Mapped I/O herum. Nur wie Bit setzen?

Ganz einfach es gibt die Befehle

IN/OUT

Und beim AVR geht


in r16, PORTD
zum Beispiel. Und jetzt haben sie 4 Ports, PORTA, PORTB, PORTC, PORTD. So schreiben sie das hin

und bei Intel sagen wir


out 0x0f, ax
sagen wir mal. Das heisst, wir geben bei out, statt A, B, C, D, und Ende, die Addresse an. Und Memory Mapped I/O heisst, wir verwenden den selben Addressbus. Aber es ist nicht im RAM. 3 Bit am x86er unterscheiden das. Wie die Setzen?

Das machen die Befehle


IN/OUT
MOV
selber, oder

in/out
mov, ld, st
selber. Und wie bauen die Schaltung gar nicht. Wir nehmen einen Baustein

So, das ist das. Damit ist Memory Mapped I/O und DMA geklärt

was macht die Graphikkarte aus?

Und was ist, wenn sie ihren UART - Memory Mapped I/O Controller, Bluetooth Controller doch selber bauen wollen

Dann tun sie mir einen Gefallen. Generell kein Problem. Sie müssen vor allem auf die Spezifikation achten. Sie müssen nichts erfinden. RS-232 wurde erfunden. Gut, die Register machen sie. dann nehmen sie einen FPGA und machen den in VHDL und sie machen ins Windeseile - einen Cache speicher, CAM - Inhaltsaddressiert in VHDL weil sie einen Latch schreiben, dann ein FF, dann ein Register, dann sie können das beliebig verfiehlfältigen, einen Speicher und mit einer Schaltung, die sie verfiehlfältigen einen Inhaltsadressierten

Ebenso so schnell der eigene Bluetooth Controller. Müssen sie aber nicht.

So und wenn das passiert ist. Was macht die graphikkarte

Die normale, die erste

Stellen sie sich vor. Sie senden 'a'. wenn sie das senden wird auf ihrem Monochromen Text Display - dann kommt ein 'a' auf dem Display. das ist unser Adapter. Und - ja, warum überhaupt. Wissen sie, wenn sie das Kabel an den Prozessor anlöten, dann wird sich manch einer sagen, was ist das denn. Deswegen gibt es einen Adapter. Der setzt aber das - was der Prozessor sendet, quasi 1 zu 1 um. Das ist der Adapter

Jetzt kommt der Controller. sagen wir der geht so. Sagen wir einfach mal. Der kennt die Befehle

READ/WRITE/POWER ON/OFF

So, jetzt können sie die Graphikkarte auslesen und abschalten. Dafür gibt es daten, das sind die dargestellten Zeichen und es gibt die Befehle READ/WRITE/POWER ON/OFF

Und - dann ist das ein Controller

Jetzt kommt 3D - sie können einen 3D Soundkarte machen, mit AVR oder ARM32 Cortex 7 oder mit FPGA

Sie haben jetzt eine Graphikkarte, die hat keinen Controller - da senden sie lesen schreiben. sondern sie haben assembler programme, zum Beispiel


add r0, r0, r1
add r1, r0, r1
add r2, r1, r0
so geht das immer weiter. Das macht die 3D Graphikkarte. Anderer Prozessor andere Programme. Das heisst, andere ISA

Instruction Set Architecture

Das ist was der Programmierer sieht. jetzt haben sie 5 Register. Oder so. Das halt eine andere CPU. Die hat auch einen Speicher

Der Unterschied - sie haben halt keine x86er Programme, also


again:
mov ax, 0xff
cmp ax, 0xff
je again
Sondern halt NVIDIA Assembler Programme. Das ist von der ISA abhängig. Instruction Set Architecture jeder Prozessor hat seine eigene. Andere Programme

ldi r16, 0xff
add r15, r15, r15
Ich würde sagen das ist kein NVIDIA Programm, sondern MIPS32, andere ISA

Und jetzt egal. Wie kommt das Programm in den speicher von der Graphikkarte

Jetzt kommt DMA. Sie können IN/OUT nehmen. Könnten sie? Macht das das langsamer. Ja, aber darum geht es nicht

Wenn sie an Graphikkarte denken, denken sie an Shadder einheiten

das brauchen sie nicht unbedingt. Schon aber - das ist weil ihre Graphikkarte - darauf spezialisiert ist

so, nehmen eine CPU und eine RAM. Für die Graphikkarte

Und sie schicken das Programm an die Graka. Und was macht das schnell? Das DMA oder IN/OUT = Memory Mapped I/O

keins von beiden. Angenommen sie haben ein Quadrat

Sie könnten auch Memory Mapped I/O. Ein Quadrat hat vier Ecken

Und sie wollen einen roten Bildschirm, mit einem Blauen Quadrat.

jetzt haben sie


a, a+width
b = a+hight
d = (width+a, hight+a)
Kurz und gut 4 Punkte, 4 Ecken. a, b, c, d

Gut, wenn sie das Bildschirm darstellen wollen, müssen sie von x0, bis x127 und von y0 bis y127

Durchlaufen, zeile spalte, für die Pixel Und müssen jeden Pixel rot oder blau färben

Wenn sie das machen, dann haben sie 128x128 Rechenoperationen

Das heisst, sie müssen den speicherbereich durchgehen - 128x128 Jetzt müssen die alle durchgehen und müssen machen rot oder blau, je nachdem innerhalb des Quadrats oder ausserhalb, begrenzt durch a, b, c, d. Ecken mit kanten, (a,b), (b,c), (c,d), (d,a)

Gut. Wenn sie das durchlaufen ein Mal OK. angenommen das quadrat ändert seine Farbe ständig 25x pro Sekunde. Das Programm was sie haben macht anders. Dann lassen sie das die Graphikkarte machen

Sie senden, a, b, c, d und blau und rot. Jetzt geht die Graphikkarte die Pixel durch

Jetzt müssen sie in ihrem Programm keine schleife machen, mit 128x128 durchlaufen

eine geschachtelte, aussen 128, innen 128

Sie senden per DMA und per IN/OUT nur a, b, c, d und rot und blau

So, jetzt haben sie ein Problem. Sie können lauter Punkte senden, a, b,c, d, e, f, g, ...

Wenn die welt so einfach wäre.

Jetzt wo die Graka programme ausführt. schicken sie doch einfach das Programm rüber, wie


ldi r16, 0xff
add r15, r15, r15
Schicken sie das einfach rüber. 512 kByte Programm. Schicken sie das rüber. da ist eine CPU und ein RAM - und kann selber Programme ausführen. allgemeine Programme

Und dann nehmen sie DMA - Sie schreiben Das Programm, es ist 512 kByte. Tun es an die DMA Addresse die Graka übernimmt es, und lässt es laufen. Und - was die Shedder Einheit

Es gibt halt typisch graphische Problem. Antialising. Müssen sie nicht verstehen

Wenn sie Geraden zeichnen, dann haben sie Pixel und sie machen eine Schräge. s Dann haben sie


x, y
x+1, y+1
x+2, y+2
...
Wenn sie einen Funktionsplotter schreiben, dann sieht die Schräge gerade so aus, als wären da lauter quadrate. Also machen sie neben die schwarzen Quadrate, graue, dann sieht das glatt aus

Das ist eine typische aufgabe der Graphikkarte, was die selber macht, das müssen sie nicht machen

Das ist so zu sagen, darauf ist die spezialisiert. Ansonsten führt die ganz normale Programme in ihrem RAM aus, die im RAM der CPU vom Computer sind und per DMA 512 kByte zum Beispiel in den RAM der Graka geladen werden. Werden ausgeführt und spezialisiert ist sie auf Antialysing z.b.

fertig