【问题标题】:Why it is not possible to use ioremap then remap_pfn_range?为什么不能使用 ioremap 然后 remap_pfn_range?
【发布时间】:2013-06-20 22:07:46
【问题描述】:

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

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

【问题讨论】:

    标签: c linux linux-kernel kernel


    【解决方案1】:

    如果您使用的是remap_pfn_range(),则不需要ioremap()ioremap() 将物理地址映射到内核虚拟地址。 remap_pfn_range() 将物理地址直接映射到用户空间。只需将您的物理地址(通过 PAGE_SHIFT 降档以生成 pfn)直接传递给remap_pfn_range()。您的问题按顺序排列:

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

    【讨论】:

      【解决方案2】:

      ioremap() 返回内核空间虚拟地址。这不能直接从用户空间访问。有一个叫做 mmap() 的机制,参考hereMapping physical addresses to virtual address linux 的工作示例。

      【讨论】:

      • 看原帖中的#4
      猜你喜欢
      • 2016-04-03
      • 2015-02-12
      • 1970-01-01
      • 2017-08-24
      • 2023-04-07
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多