On the topic of DMA, though its study and usage is beyond the scope of this book, I would nevertheless like to mention that Linux has a purpose-built set of APIs for DMA christened the DMA Engine. Driver authors performing DMA operations are very much expected to use these APIs and not directly use the slab or page allocator APIs (subtle hardware issues do turn up).
Further, several years back, Samsung engineers successfully merged a patch into the mainline kernel called the Contiguous Memory Allocator (CMA). Essentially, it allows the allocation of large physically contiguous memory chunks (of a size over the typical 4 MB limit!). This is required for DMA on some memory-hungry devices (you want to stream that ultra-HD quality movie on a big-screen tablet or TV?). The cool thing is that the CMA code is transparently built into the DMA Engine and DMA APIs. Thus, as usual, driver authors performing DMA operations should just stick...