age*_*ith 8 linux kernel driver linux-device-driver linux-kernel
我正在研究一个小型嵌入式系统.当我的linux启动到用户空间时,我知道我的设备在物理内存中的位置.我想将它们映射到用户空间虚拟地址.目前,我是通过内核模块完成的.我使用vmalloc/kmalloc(取决于大小)然后我在返回的虚拟地址上使用ioremap_page_range来映射我的物理地址.我不认为这是正确的方法.首先,我分配内存,然后我要求内核将虚拟地址空间重新映射到一些不同的物理地址空间.(最初在vmcall/kmalloc中映射物理 - >虚拟是有点无用的,因为我不关心那些物理页面.这绝对不好.)
取而代之的是将已知物理内存映射到用户空间进程的更好方法.(我知道除了我的用户空间进程,没有人会触及那个记忆.)
谢谢
您要做的是访问所谓的IO内存.我只能鼓励您阅读Linux设备驱动程序(LDD)一书,更具体地说,请阅读第9章.
要"分配"这样的区域,你需要打电话
struct resource *request_mem_region(unsigned long start, unsigned long len, char *name)
Run Code Online (Sandbox Code Playgroud)
.在您的驱动程序可以访问它之前,您必须为其分配一个虚拟地址,这是通过调用来完成的
void *ioremap(unsigned long phys_addr, unsigned long size)
Run Code Online (Sandbox Code Playgroud)
为了确保您的驱动程序可以在不同的体系结构/平台上工作,请确保对这些区域使用一些访问器功能(ioread8/16/32或iowrite8/16/32及其所有变体).