如何从内核访问用户空间缓冲区

时间:2013-12-06 11:50:47

标签: linux linux-kernel kernel-module ioctl memory-mapping

我正在开发一个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(&current->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(&current->mm->mmap_sem);

phys_addr=pci_map_page(dev,pages_list[0],0,PAGE_SIZE,DMA_BIDIRECTIONAL);

代码工作正常,但我的问题是:

  • 谁在“固定”页面?或者我必须明确调用SetPageReserved(pages_list [0])?
  • 当我使用缓冲区时它是如何工作的? pci_unmap,这就是全部?即使我打电话给SetPageReserved?
  • 一般来说,在用户空间地址上调用virt_to_phys是否安全(如果页面被固定)? (如果是DMA,则为virt_to_bus)
  • 这是访问用户空间缓冲区的“最佳做法”吗?

0 个答案:

没有答案