В приложении пространстве пользователя выделяется большой объем памяти, 128 Мб и более. Необходимо получить физические адреса всех страниц этой памяти для формирования DMA буфера. Адрес буфера пользователя передается в модуль ядра в функцию get_user_pages():
int n_pages = 0;
struct page** locked_pages = kmalloc(
(userSpaceSize/PAGE_SIZE)*sizeof(struct page*),
GFP_KERNEL));
down_read(¤t->mm->mmap_sem);
n_pages = get_user_pages(current,
current->mm,
userSpaceAddress,
(userSpaceSize/PAGE_SIZE),
1,
0,
locked_pages, NULL);
up_read(¤t->mm->mmap_sem);
for(i=0; i<n_pages; i++) {
printk("<0>%s - %s(): page[%d] = %p\n",
DRVNAME, __FUNCTION__, i,
locked_pages[i]);
}
log при userSpaceSize = 0x4000: (при больших размерах результат такой же)
UserMemoryLock(): Lock 4 memory pages
UserMemoryLock(): page[0] = c17625e0
UserMemoryLock(): page[1] = c17625e0
UserMemoryLock(): page[2] = c17625e0
UserMemoryLock(): page[3] = c17625e0