发新话题
打印

remap_pfn_range函数的限制的疑问

remap_pfn_range函数的限制的疑问

陈老师 :
     您好!
    最近看了下linux的内存管理,结合<<深入理解linux内核>>和<<linux设备驱动程序>>看,在linux设备驱动程序425页上看到一句话,对remap_pfn_range函数的一个限制是:它只能访问保留页和超出物理内存的物理地址,remap_pfn_range不允许重新映射常规地址,包括调用get_free_page函数所获得的地址!请问下超出物理内存的物理地址怎么理解,为什么不能重新映射常规地址?? 还有429页上一句话:读者可能想要将ioremap返回的地址映射到用户空间上,但这么做是错误的,因为ioremap返回的地址比较特殊,不能把它当作普通的内核虚拟地址,应该使用remap_pfn_range函数将I/O内存重新映射到用户空间上。 请问这句话有怎么理解
  

    谢谢
remap_pfn_range()函数的原型:
int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);

   该函数的功能是创建页表。其中参数vma是内核根据用户的请求自己填写的,而参数addr表示内存映射开始处的虚拟地址,因此,该函数为addr~addr+size之间的虚拟地址构造页表。

   另外,pfn(Page Fram Number)是虚拟地址应该映射到的物理地址的页面号,实际上就是物理地址右移PAGE_SHIFT位。如果PAGE_SHIFT为4kb,则PAGE_SHIFT为12,因为PAGE_SHIFT等于1<<PAGE_SHIFT。最后一个参数prot是新页所要求的保护属性。
    在驱动程序中,一般能使用remap_pfn_range()映射内存中的保留页(如X86系统中的640KB~1MB区域)和设备I/O内存。因此,如果想把kmalloc()申请的内存映射到用户空间,则可以通过mem_map_reserve()把相应的内存设置为保留后就可以。

[ 本帖最后由 陈莉君 于 2008-7-4 21:18 编辑 ]
透析真谛,似拨云穿雾;共享智慧,如春风沐浴
http://www.kerneltravel.net
发新话题