Rechnerarchitekturen 2/DMA-Vortrag

Aus II-Wiki
Zur Navigation springen Zur Suche springen

Hi, da dieses RA2-Pseudo Wiki keine Diskussionsplattform bietet, sollten wir hier mal unsere geistigen Ergüsse zusammenfassen:

Vorlage

Powerpointvorlage

Planung

ich würde folgende Unterteilung vorschlagen (wir sind doch 5 Leute denke ich):

  • Was ist DMA überhaupt (direkter Sepicherzugriff also ohne CPU, Vorteile die wir dadurch haben (schneller, besser, toller), Nachteile, da komplexer und kompliziertere Logik). Gern auch wie das früher funktioniert hat. Wo wird das angewandt ( Grafikkarten, Sound, Festplatten, was weiß ich ....) --JackKnack
  • Wie funktioniert DMA überhaupt (CPU wird vom Bus getrennt, DMA übernimmt BUS und gibt ihn wieder zurück). Dazu dann dieses ganze Kanal-/Adressierungsgelumbe). Also wie wird es allgemein implementiert --> da würde ich fast sagen das es teilweise zu Falks teil mit reingehört, also wenn er sagt wies in der SW genutzt wird, muss man auch erklären können wie das implementiert wird. Andere Meinungen dazu? für alles habsch keine zeit zu, denke einfach das es recht komplex ist das thema; von daher fang ich mal an und gebs dann an andreas weiter. müssen wir uns das ma irgendwie aufteilen erther
  • so maln anfang gemacht... könnt ja mal schauen obs soweit passt; sonst andi ich hab mal noch was aufgeschrieben was du evtl. machen könntest davon. DMA.ppt
  • Welche Entwicklungen gab es, wie haben die funktioniert / was war so revolutionär daran (DMA, UDMA33, 66,....). Was gint es noch/wird noch kommen-> Zukunft? (Schoni)
hab mal ein bisschen was zusammengetragen: RA2.pdf
hab auch noch ein paar schöne Bildchen zur Veranschaulichung (ein paar Kabel dürften ja auch noch aufzutreiben sein)
  • Wie nutze ich DMA in meiner Software (das werde ich mal übernehmen wenn ich schon sone blöden Vorschäge mache :) -Falk )
    • Benutzerprogramme brauchen/können den DMA Controller nicht Programmieren
    • Extrem System & Architektur abhängig → Kernel abstrahiert das Interface soweit möglich
    • Data Transfer kann von Software oder Hardware ausgelöst werden
    • Problem 1 „Den DMA Puffer allozieren“
      • nicht alle Geräte können 32 Bit Adressen → Nicht der ganze Speicher ist Adressierbar
      • ISA kann sogar nur 16 Bit → max. 64Kbyte
      • Speicher muss zusammenhängend sein → Speicherfragmentierung verhindert das
      • CPU Cache muss für den Bereich deaktiviert werden
    • Problem 2 „Virtuelle Adressen“
      • Programme arbeiten mit Virtuellen Adressen die Hardware aber nicht (siehe MMU)
      • Umwandlung der Virtuellen Adressen in Reale Adressen
unsigned long virt_to_bus(volatile void * address);
void * bus_to_virt(unsigned long address);
  • Umsetzung
    • DMA Anfordern damit andere Wissen das wir damit Arbeiten
int request_dma(unsigned int channel, const char *name); 
void free_dma(unsigned int channel);
  • Den DMA Controller Ansteuern
    • Mehrzugriff speeren
unsigned long claim_dma_lock(); 
void release_dma_lock(unsigned long flags);
  • DMA Controller Funktionen
void set_dma_mode(unsigned int channel, char mode); 
  • Setzt den DMA Modus auf Lesen/Schreiben oder Cascadiert
void set_dma_addr(unsigned int channel, unsigned int addr);
  • Setzt den DMA Puffer (nur 24 Bit der Addresse werden verwendet)
void set_dma_count(unsigned int channel, unsigned int count);
  • Wieviel Bytes werden übertragen? Im 16Bit Modus muss es eine gerade Anzahl sein !!
void disable_dma(unsigned int channel); 
void enable_dma(unsigned int channel);
  • DMA Kanal im Controller Aktivieren bzw. Deaktivieren
int get_dma_residue(unsigned int channel); 
  • Ist der Transfer Abgeschlossen?
void clear_dma_ff(unsigned int channel) 
  • Setzt den DMA FlipFlop zurück der zwischen niederwertigen und höherwertigen Bytes unterscheidet bei der Programmierung
  • Beispiel Code
 int starte_dma_transfer(int Kanal, int Modus, void* buf,unsigned int size)
 {
    unsigned long flags;

    flags = claim_dma_lock(); //Sperre den Zugriff für andere Programme
    disable_dma(Kanal); // Deaktiviere den Kanal damit nix Schief läuft
    clear_dma_ff(Kanal); //FF zurücksetzen
    set_dma_mode(Kanal, Modus); // Setze den gewünschten DMA Modus
    set_dma_addr(Kanal, virt_to_bus(buf)); // Setze den Puffer
    set_dma_count(Kanal, size); //Soooo groß ist der Puffer
    enable_dma(channel); // OK Schalte den Kanal wieder an
    release_dma_lock(flags); // Gebe die Sperre wieder frei
    return 0;
 }


  • Dinge, die ich vergessen habe, aber noch wichtig sein könnten

Dann muss noch die Präsentation erstellt werden und der Vortrag auch gehalten werden. --JackKnack 14:50, 16. Mai. 2007 (CEST)

- Ich dachte ja, dass sich hier jeder mal ein Thema sucht/reserviert, aber ....tztztztztz. Gut, ich beschäftige mich jetzte mal mit dem Ersten Teil. --JackKnack 21:58, 19. Mai. 2007 (CEST)

- dann nehm ich mal den dritten Teil -- Schoni

Gruppenmitglieder

Andreas, Falk, Martin, Stefan, Steven