A long time ago I implemented a sliding block memory allocator for a text editor in C. When allocating a block you could provide a relocation handler which would be called when the block got moved. That way the memory allocator could move blocks around at will to ensure minimum fragmentation. It worked very well and something similar would seem to be a good solution here. eg. If a DMA area had to be moved to make a larger continuous block for another user then the relocation handler could reprogram the hardware for the new address.