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

时间:2013-05-18 10:21:21

标签: c memory-management linux-device-driver

我有一个PCI设备,它会在条形图中显示BAR和几个偏移量以访问设备。 在其中一个Bar偏移量上,我需要编程一个64KB的分配内存。在我的Linux驱动程序中,我使用kmalloc()分配64KB内存,据我所知返回虚拟地址。如果将其编程到偏移中,HW将无法看到相同的情况。如何将此虚拟地址转换为物理地址? 当我谷歌时,我看到几个指向virt_to_phys()的链接,但很少有回复说这对kmalloc()不起作用。知道如何去做吗?

2 个答案:

答案 0 :(得分:0)

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

我不会自己映射内存:这就是内核函数的用途。这样,您确定它适用于所有平台。我假设的64k块是PCI设备提供的一些内存映射?如果是,那么上述是正确的。如果不是,请提供更多信息。

答案 1 :(得分:0)

使用alloc_pages()函数,而不是使用kmalloc()。

struct page * alloc_pages(gfp_t gfp_mask,4);

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