Direct Memory Access (DMA)
Using interrupts driven device drivers to transfer data to or from hardware
devices works well when the amount of data is reasonably low.
For example a 9600 baud modem can transfer approximately one character every
millisecond (1/1000'th second).
If the interrupt latency, the amount of time that it takes between the hardware
device raising the interrupt and the device driver's interrupt handling routine being called, is
low (say 2 milliseconds) then the overall system impact of the data transfer is very low.
The 9600 baud modem data transfer would only take 0.002% of the CPU's processing time.
For high speed devices, such as hard disk controllers or ethernet devices the
data transfer rate is a lot higher.
A SCSI device can transfer up to 40 Mbytes of information per second.
Direct Memory Access, or DMA, was invented to solve this problem.
A DMA controller allows devices to transfer data to or from the system's memory
without the intervention of the processor. A PC's ISA
DMA controller has 8 DMA channels of which 7 are available for use by
the device drivers. Each DMA channel has associated with it a 16 bit address register and a
16 bit count register.
To initiate a data transfer the device driver sets up the DMA channel's address
and count registers together
with the direction of the data transfer, read or write.
It then tells the device that it may start the DMA when it wishes.
When the transfer is complete the device interrupts the PC.
Whilst the transfer is taking place the CPU is free to do other things.
Device drivers have to be careful when using DMA. First of all the DMA
controller knows nothing of virtual memory, it only has access to the physical memory
in the system.
Therefore the memory that is being DMA'd to or from must be a contiguous block
of physical memory.
This means that you cannot DMA directly into the virtual address space of a
process.
You can however lock the process's physical pages into memory, preventing them
from being swapped out
to the swap device during a DMA operation.
Secondly, the DMA controller cannot access the whole of physical memory.
The DMA channel's address
register represents the first 16 bits of the DMA
address, the next 8 bits come from the page register.
This means that DMA requests are limited to the bottom 16 Mbytes of memory.
DMA channels are scarce resources, there are only 7 of them, and they cannot be
shared between device drivers. Just like interrupts, the device driver must be able to work out
which DMA channel it should use.
Like interrupts, some devices have a fixed DMA channel.
The floppy device, for example, always uses DMA channel 2.
Sometimes the DMA channel for a device can be set by jumpers; a number of
ethernet devices use this technique.
The more flexible devices can be told (via their CSRs) which DMA channels to use
and, in this case, the device
driver can simply pick a free DMA channel to use.
Linux tracks the usage of the DMA channels using a vector of dma_chan
data structures (one per
DMA channel).
The dma_chan data structure contains just two fields, a pointer to a
string describing the owner of
the DMA channel and a flag indicating if the DMA channel is allocated or not.
It is this vector of dma_chan data structures that is printed when you
cat /proc/dma.
|