C等价于IOMemoryDe​​scriptor类

时间:2015-06-29 21:41:34

标签: c++ c macos iokit mach

我正在使用IOKit编写一些C代码,并且需要使用IOMemoryDescriptor方法。不幸的是,我只能编译纯C源代码,这是一个C ++类。所以,我问是否有一些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();
}

1 个答案:

答案 0 :(得分:1)

基于BSD,xnu继承了一些BSD的内核API,包括copyin and copyout functions。它们在libkern.h中声明,并且它们几乎完全用于IOMemoryDescriptor,但没有别的。

你提到你正在使用IOKit - 如果你需要IOKit的功能之外的任何东西,你几乎不得不使用C ++编译器,或使用C来调用直接命名。

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