【问题标题】:Mapping physical addresses to virtual address linux将物理地址映射到虚拟地址linux
【发布时间】:2012-07-23 23:16:07
【问题描述】:

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

除此之外,还有一种更好的方法可以将已知物理内存映射到用户空间进程。 (我知道除了我的用户空间进程,没有人会碰那个内存。)

谢谢

【问题讨论】:

    标签: linux linux-kernel kernel driver linux-device-driver


    【解决方案1】:

    您要做的是访问所谓的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】:

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

      How remap_pfn_range remaps kernel memory to user space?

      【讨论】:

      • 我需要先做 mmap,然后再做 remap_pfn。然而,我不想那样做。我没有与该内存连接的设备。所以,我想直接将该物理内存映射到虚拟地址。谢谢
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-29
        • 2013-03-10
        • 2015-05-04
        相关资源
        最近更新 更多