代码之家  ›  专栏  ›  技术社区  ›  agent.smith

将物理地址映射到虚拟地址linux

  •  9
  • agent.smith  · 技术社区  · 13 年前

    我正在开发一个小型嵌入式系统。当我的linux启动到用户空间时,我知道我的设备在物理内存中的位置。我想把它们映射到用户空间的虚拟地址中。目前,我正在通过一个内核模块来完成这项工作。我使用vmalloc/kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址。我认为这不是正确的做法。首先,我分配内存,然后我要求内核将虚拟地址空间重新映射到一些不同的物理地址空间。(最初在vmcall/kmalloc中映射的physical->virtual有点无用,因为我不在乎那些物理页面。这肯定不好。)

    相反,有一种更好的方法可以将已知的物理内存映射到用户空间进程中。(我知道除了我的用户空间过程之外,没有人会触碰那段记忆。)

    谢谢

    3 回复  |  直到 13 年前
        1
  •  7
  •   kaiwan    10 年前

    您要做的是访问 IO存储器 。我只能鼓励你阅读 Linux设备驱动程序 (LDD)一书,更具体地说是第9章。

    要“分配”这样一个区域,您需要拨打

    struct resource *request_mem_region(unsigned long start, unsigned long len, char *name)
    

    。在您的驱动程序可以访问它之前,您必须为它分配一个虚拟地址,这是通过调用

    void *ioremap(unsigned long phys_addr, unsigned long size)
    

    为了确保您的驱动程序能够在不同的体系结构/平台上工作,请确保对这些区域使用一些访问器功能(ioread8/16/32或iowrite8/16/32及其所有变体)。

        2
  •  4
  •   Community Mohan Dere    9 年前

    在内核模块中, remap_pfn_range() 可以用于将物理地址转换为虚拟地址。以下链接将有所帮助。

    How remap_pfn_range remaps kernel memory to user space?

        3
  •  0
  •   Juergen    11 年前

    在内核模块中,remap_pfn_range()可以用于将物理地址转换为虚拟地址。当您没有实际的设备时,您可以: 1) 创建虚拟设备, 2) 对这些虚拟设备使用mmap,通过该进程的remappfn_range虚拟映射访问相同的内核内存。 3) 通常在专用环境中,您可能还想固定这些物理页面,以免它们从您的流程中被带走。 4) 您也可以与不同的进程共享这些物理地址,但需要通过其他IPC机制独立处理同步,因为每个进程看起来都是不同的地址。