2012-07-23 143 views
7

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

取而代之,有一种更好的方式将已知物理内存映射到用户空间进程。 (我知道的比我的用户空间程序等,没有人要去触摸内存。)

感谢

回答

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及其所有变种)。

0

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

相关问题