2

我正在使用 编写一些 C 代码IOKit,并且需要使用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();
}
4

1 回答 1

3

xnu 基于 BSD,继承了 BSD 的一些内核 API,包括copyincopyout函数。它们在 libkern.h 中声明,它们几乎完成了您使用的IOMemoryDescriptorfor 的工作,但没有别的。

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

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

于 2015-06-30T15:41:30.423 回答