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

具体来说,我想要一个功能差不多的函数,但是可以将其编译为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();
}

最佳答案

基于BSD的xnu继承了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++蜜蜂。

关于c++ - 相当于IOMemoryDe​​scriptor类的C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31126075/

10-11 23:18