All devices have special hardware controllers. Normally, the OS has device drivers (which are kernel programs) that communicate with the controllers. The device drivers have registers, counters and buffers to store arguments and results. Normally, these drivers sits in a tight loop to see the I/O through. But these would tie up the CPU during the I/O. With DMA, The CPU first loads them, and then the device controller takes over.