2

我有一个 PCI 设备,它公开了一个 BAR,并且在栏中有几个偏移量用于访问该设备。在 Bar 偏移量之一上,我需要对分配的 64KB 内存进行编程。在我的 Linux 驱动程序中,我使用 kmalloc() 分配了 64KB 的内存,据我所知,它返回虚拟地址。如果将其编程到偏移量中,硬件将无法看到相同的内容。如何将此虚拟地址转换为物理地址?当我使用 Google 时,我看到很少有指向 virt_to_phys() 的链接,但很少有回应说这不适用于 kmalloc()。知道该怎么做吗?

4

2 回答 2

0

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

结构页* alloc_pages(gfp_t gfp_mask, 4 );

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

于 2013-05-21T09:02:15.337 回答
0

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

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

于 2013-05-18T11:41:59.333 回答