C 为什么不能使用ioremap然后重新映射pfn范围?

C 为什么不能使用ioremap然后重新映射pfn范围?,c,linux,linux-kernel,kernel,C,Linux,Linux Kernel,Kernel,在我的驱动程序中,我试图将从ioremap返回的地址映射到用户空间地址 从ioremap返回什么类型的地址 它与kmalloc地址有何不同 如何映射从ioremap返回的地址 应将哪个地址插入到重新映射pfn范围中 ioremap()返回内核空间虚拟地址。无法直接从用户空间访问此文件。有一种称为mmap()的机制,请参阅和以了解工作示例。如果使用的是remap\u pfn\u range(),则不需要ioremap()ioremap()将物理地址映射到内核虚拟地址remap_pfn_range(

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

  • ioremap
    返回什么类型的地址
  • 它与
    kmalloc
    地址有何不同
  • 如何映射从
    ioremap
    返回的地址
  • 应将哪个地址插入到重新映射pfn范围中

  • ioremap()
    返回内核空间虚拟地址。无法直接从用户空间访问此文件。有一种称为mmap()的机制,请参阅和以了解工作示例。

    如果使用的是
    remap\u pfn\u range()
    ,则不需要
    ioremap()
    ioremap()
    将物理地址映射到内核虚拟地址
    remap_pfn_range()
    将物理地址直接映射到用户空间。只需将您的物理地址直接传递到
    remap\u pfn\u range()
    。请依次提问:

  • 内核虚拟地址
  • kmalloc返回内核虚拟内存,但保证连续内存
  • 如果首先调用
    virt\u to\u phys()
    ,将内核虚拟地址转换为物理地址,则可以执行此操作。但是,如果您实际上不需要内核访问此内存范围,请跳过一步
  • 物理地址,通过PAGE_SHIFT降档以生成pfn
  • 请看原始帖子中的第4条