为什么不能使用ioremap然后使用remap_pfn_range?

shd*_*shd 5 c linux kernel linux-kernel

在我的驱动程序中,我试图将返回的地址映射ioremap到用户空间地址.

  1. ioremap哪个地址返回?
  2. 它与kmalloc地址有什么不同?
  3. 如何映射返回的地址ioremap
  4. 应该插入哪个地址remap_pfn_range

Pet*_*ter 7

ioremap()如果您正在使用,则不需要remap_pfn_range(). ioremap()将物理地址映射到内核虚拟地址. remap_pfn_range()将物理地址直接映射到用户空间.只需将你的物理地址(由PAGE_SHIFT降档产生一个pfn)直接传递给remap_pfn_range().您的问题依次为:

  1. 内核虚拟地址
  2. kmalloc返回内核虚拟,但保证连续内存请参阅问题116343
  3. 你可以这样做,如果你virt_to_phys()先调用,将内核虚拟地址转换为物理.但如果您实际上不需要内核访问此内存范围,请跳过一步
  4. 物理地址,由PAGE_SHIFT降低产生pfn