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

标签 c memory-management linux-device-driver

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

最佳答案

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

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

关于c - 如何将 kmalloc() 地址转换为物理地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16623169/

相关文章:

c++ - C 和 C++ 中的 sizeof 结构或变量

objective-c - 释放按引用返回的 NSString 会导致崩溃

linux-kernel - 使用旧的设备文件作为字符设备驱动程序

c# - 为什么程序集的调用会占用如此多的 RAM?

c# - C#中小数据类型是如何打包的

linux - 罗技 G29 : Physical Maximum in HID Device Descriptor is to little

c - kfree 函数调用时发生了什么

objective-c - 静态内联函数调用之间静态变量的地址变化

c - 错误: lvalue required as left operand of assignment

c++ - 在指针变量中存储非零的整数常量