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

时间:2012-07-23 23:16:07

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

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

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

由于

3 个答案:

答案 0 :(得分:5)

您要做的是访问所谓的 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及其所有变体)。

答案 1 :(得分:3)

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

How remap_pfn_range remaps kernel memory to user space?

答案 2 :(得分:0)

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