我们可以在内核模块中使用virt_to_phys作为用户空间内存吗?

我将使用malloc在用户应用程序中分配内存,并通过字符驱动程序接口将malloc返回的地址发送到内核模块.

我将使用内核模块中的get_user_pages_fast来固定此内存的页面.

我可以使用virt_to_phys来获取malloc返回的地址.
有效吗?如果没有,那么我如何获得适当的实际地址?

我的目标是获取用户空间分配内存的物理地址.
我将传输大小限制为pagesize(4KB).

最佳答案 不,你不能,virt_to_phys将内核虚拟地址转换为物理地址. linux中存在3种(或4种)地址:

>内核虚拟地址:物理地址/ – 偏移量(PAGE_OFFSET).
>内核物理地址:实际物理地址(由__pa或virt_to_phys函数获得).
>用户虚拟地址:物理地址的转换是在进程的页表内.

请注意,页表’layout’取决于处理器的体系结构,因此您需要实现与您所使用的体系结构相对应的软件页表遍历.

最后一句话,存在的第四种地址是:

>总线地址:设备看到的地址.

点赞