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

时间:2013-06-24 11:52:56

标签: c linux linux-kernel kernel

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

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

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

ioremap()返回内核空间虚拟地址。无法直接从用户空间访问此内容。有一种称为mmap()的机制,请参考hereMapping physical addresses to virtual address linux作为工作样本。