小编via*_*lly的帖子

如何使用 PCIDriverKit 内存映射 PCI BAR?

如何将 PCI 基地址寄存器 (BAR) 从 PCIDriverKit 驱动程序 (DEXT) 内存映射到用户空间应用程序?

从驱动程序扩展到应用程序的内存映射可以通过在用户客户端子类(在驱动程序端)中实现IOUserClient::CopyClientMemoryForType然后调用IOConnectMapMemory64(从用户空间应用程序端)来完成。这在相关的答案中已经得到了非常好的和彻底的解释。

唯一缺少的一点是获取与所需 PCI BAR 相对应的IOMemoryDe​​scriptor,以便从CopyClientMemoryForType实现中返回它。

示例代码

另一种方式问,给定以下简化代码,会执行什么imaginaryFunctionWhichReturnsTheBARBuffer

kern_return_t IMPL(MyUserClient, CopyClientMemoryForType) //(uint64_t type, uint64_t *options, IOMemoryDescriptor **memory)
{
    IOMemoryDescriptor* buffer = nullptr;
    
    imaginaryFunctionWhichReturnsTheBARBuffer(ivars->pciDevice /* IOPCIDevice */, kPCIMemoryRangeBAR0, &buffer);

    *memory = buffer;

    return kIOReturnSuccess;
}
Run Code Online (Sandbox Code Playgroud)

前面的代码ivars->pciDevice中指的是一个现成的IOPCIDevice(例如:它已经根据最新的最佳实践成功匹配、打开和配置)。

这意味着已经可以使用各种配置内存读/写方法来访问所需 PCI BAR 内存的显式偏移量。缺少(或不清楚)的是如何使用这些 API(或等效 API)将与 PCI BAR 对应的整个缓冲区映射到用户空间应用程序。

可能相关也可能不相关的随机注释 …

c++ macos iokit macos-system-extension driverkit

9
推荐指数
1
解决办法
903
查看次数

标签 统计

c++ ×1

driverkit ×1

iokit ×1

macos ×1

macos-system-extension ×1