繁体   English   中英

如何将kmalloc()地址转换为物理地址

[英]How to convert kmalloc() address to physical address

我有一个PCI设备,该设备公开了BAR,并且在访问设备的栏中几乎没有偏移。 在小节偏移之一上,我需要对64KB分配的内存进行编程。 在我的Linux驱动程序中,我使用kmalloc()分配了64KB的内存,据我所知返回了虚拟地址。 如果将此设置为偏移量,则HW将无法看到相同的内容。 如何将该虚拟地址转换为物理地址? 当我使用Google时,我看不到指向virt_to_phys()的链接,但很少有响应说这与kmalloc()不能很好地配合。 任何想法如何去做?

通常,您可以从内核驱动程序中使用pci_resource_start()/ pci_resource_end()。 我假设您正在编写设备驱动程序?

我不会自己映射内存:这就是内核功能所在的位置。 这样,您确定它可以在所有平台上运行。 我认为该64k块是PCI设备提供的一些内存映射? 如果是,则以上是正确的。 如果否,请提供更多信息。

与其使用kmalloc(),不如使用alloc_pages()函数。

struct page * alloc_pages(gfp_t gfp_mask,4);

一页是4K,因此它将分配2 ^ 4 = 16页,这等于16 * 4K = 64K内存,并返回物理地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM