IOMemoryDe​​scriptor class 的 C 等价物

C equivalent of IOMemoryDescriptor class

我正在使用 IOKit 编写一些 C 代码,并且需要使用 IOMemoryDescriptor 方法。不幸的是,我只能编译纯 C 源代码,那是 C++ class。所以,我想问是否有一些 C 接口可以让我执行相同的操作。

具体来说,我想要一个几乎可以完成此任务但可以编译为 C:

的函数
#include <IOKit/IOMemoryDescriptor.h>
extern "C" void CopyOut(mach_vm_address_t src, void *dst, size_t size)
{
    IOMemoryDescriptor *memDesc;
    memDesc = IOMemoryDescriptor::withAddressRange(src, size, kIODirectionOut, current_task());
    // Error checking removed for brevity
    memDesc->prepare();
    memDesc->readBytes(0, dst, size);
    memDesc->complete();
    memDesc->release();
}

xnu基于BSD,继承了BSD的部分内核API,包括copyin and copyout functions。它们在 libkern.h 中声明,它们几乎可以完成您使用 IOMemoryDescriptor 的功能,但除此之外别无其他。

你确实提到你正在使用 IOKit - 如果你需要 IOKit 功能之外的任何东西,你几乎必须使用 C++ 编译器,或者使用 C 直接调用损坏的名称。

如果你不熟悉使用奇怪的编译器来构建 kexts,我会警告你 x86_64 的内核代码不能使用堆栈的 red zone,因为它可以' 由于中断处理而存在。如果您的编译器假定存在红色区域,您将遇到奇怪的崩溃。 Clang 和 gcc 有相应的标志来禁用红色区域。 (-mno-red-zone,如果我没记错的话,通过内核模式标志自动激活)即使您使用的是非官方编译器,在最后阶段链接到使用 clang 的 C++ 编译器构建的目标文件也应该可以正常工作包装任何其他 C++ API。