Для DMA нужно чтобы буфер был в no cache area, иначе есть шанс словить косяка в данных.
Вот кусок из httpd-ack, на который я ориентировался при создании кастомных функций для чтения диска и на которых основан код рипа GD на SD самого автора этого мода:
PHP код:
#define MAX_SECTOR_READ 128
#define SECTOR_BUFFER (2352*(MAX_SECTOR_READ + 1))
#define MMAP_NOCACHE 0x20000000
char *buf, *nocache;
buf = memalign(32, SECTOR_BUFFER);
nocache = (void*)((mem_ptr_t) buf | MMAP_NOCACHE);
...
Как видишь буфер у него гораздо больше. И не нужно его в стек запихивать, будет overflow. Стек не резиновый (всего 64кб на сколько я помню на тред), лучше динамически память выделять в таких случаях.
Я думаю что он не спроста такое количество считывает за раз, попробуй и ты.