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