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

我正在研究一个小型的embedded式系统。 当我的Linux启动到用户空间,我知道我的设备在物理内存中。 我想将它们映射到用户空间虚拟地址。 目前,我正在通过一个内核模块来做这件事。 我使用vmalloc / kmalloc(取决于大小),然后在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址。 我不认为这是正确的方式去。 首先我分配内存,然后我要求内核重新映射虚拟地址空间到一些不同的物理地址空间。 (最初在vmcall / kmalloc中映射物理 – >虚拟是有用的,因为我不关心这些物理页面,这绝对不是好的。

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

谢谢

Solutions Collecting From Web of "将物理地址映射到虚拟地址linux"

你要做的是访问所谓的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及其所有变体)使用一些访问器功能。

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

remap_pfn_range如何将内核内存重新映射到用户空间?

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