Womöglich kommt der "gefühlte Widerspruch" ja daher, daß man "braucht
keine CPU" unterschiedlich verstehen kann. Denn zwar tut die CPU nichts
zu einem gerade laufenden DMA Transfer, andererseits darf sie dann
aber auch nichts anderes tun. Sie wird vom DMAC [1] angehalten, weil CPU
und DMAC den gleichen Bus benutzen. Für eine dritte Instanz, sagen wir
mal eine CPU-hungrige Funktion, ist die CPU in der Konsequenz trotzdem
kurz weg, während der DMA Transfer läuft. Aus deren Sicht macht es
keinen Unterschied, ob die CPU gerade fehlt weil der DMAC den Bus
braucht, oder ob sie fehlt weil sie gerade selber Daten von A nach B
schaufelt.
Nächster Punkt: "Die CPU muss einmal die DMA initialisieren und kann
dann was anderes machen" ist eine schamlose Übertreibung. Denn während
ein DMAC zwar eine Speicheradresse inkrementieren kann, um so z.B. Daten
vom I/O in einen RAM-Puffer zu schieben, so ist der RAM doch i.d.R. sehr
endlich. Das heißt nach ein paar hundert, spätestens ein paar tausend
Einzeltransfers ist der Puffer voll. Und dann muß die CPU sich nicht nur
um den Puffer-Inhalt kümmern, sondern auch den DMAC neu konfigurieren,
etwa auf den Pufferanfang zurücksetzen oder auf einen anderen Puffer.
Drittens: asynchron. Bedeutet natürlich nicht unabhängig vom CPU-Takt,
weil der ja gleichzeitig auch der Bustakt ist. Es ist in der gleichen
Bedeutung asynchron wie es ein Interrupt ist. Ein DMA Transfer wird
typischerweise von einem Hardware-Ereignis ausgelöst (z.B. UART hat ein
Byte empfangen). Und das ist halt asynchron zu dem was die CPU gerade
tut.
Letztens: die Busübernahme. Das war in der guten alten Zeit <tm> in der
Tat einfacher zu verstehen, als CPU und DMAC noch getrennte IC waren und
der Bus sich in Form von Leitungen quer über die Platine manifestierte.
Aber das Grundprinzip ist immer noch das gleiche: der DMAC signalisiert
der CPU daß er den Bus braucht. Die CPU prüft dieses Signal am Ende
eines Befehlszyklus (also dann wenn der gerade laufende Befehl fertig
ist). Wenn das Signal aktiv ist, macht die CPU den Bus frei und
signalisiert über ein zweites Signal dem DMAC daß er jetzt darf. Wenn
der DMAC fertig ist, setzt er sein Anforderungssignal zurück und die CPU
macht da weiter, wo sie angehalten hat. Die Signale hießen früher mal
BUSRQ und BUSAK. Wenn es mehrere DMAC gibt, braucht man natürlich noch
Prioritätslogik etc.
[1] DMAC = DMA Controller
XL