一尘不染

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

linux

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

取而代之的是,有一种更好的方法将已知的物理内存映射到用户空间进程中。(我知道除了用户空间过程外,没有人会触摸该内存。)

谢谢


阅读 393

收藏
2020-06-07

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

2020-06-07