Аноним довольно профессионально описал как это сделать с mmap, но там есть ряд своих тонкостей.
Например, если не пишешь свои address_space operations, то нужно объявлять VMA как VM_RESERVED или VM_LOCKED, чтобы vmscan/kswapd не отправил страницы в swap

.
В этом отношении direct_IO попроще и именно поэтому я его и посоветовал.
P.S. Правда, в случае с direct_IO могут возникнуть интересные эффекты, если страница будет выделена выше 4 Гб (на PC)... Не знаю могут ли Bus Master устройства так высоко залезать.