我正在开发一个linux设备驱动程序,我需要了解如何访问用户分配的内存区域。详细地说,对于32字节的缓冲区,用户调用:
void *UserAddr;
posix_memalign(&UserAddr, getpagesize(), 32); //allocation of the page-alligned buffer
memset(UserAddr, 0x55, 32); //just to see if the data in the buffer is correct
ioctl(fd, MAP_BUFFER, UserAddr); //call kernel module
现在,在内核模块ioctl中,我需要物理地址将其传递给pci设备进行DMA操作。我目前正在做的是(这个例子仅用于1页,以了解它是否正确):
if(!access_ok(VERIFY_READ,(char *)user_address,32*sizeof(u32)))
goto error1;
down_read(¤t->mm->mmap_sem);
if(get_user_pages(current, current->mm,(unsigned long)user_address,1,1,0,pages_list,NULL)<1)
goto error2;
up_read(¤t->mm->mmap_sem);
phys_addr=pci_map_page(dev,pages_list[0],0,PAGE_SIZE,DMA_BIDIRECTIONAL);
代码工作正常,但我的问题是: