我正在使用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();
}
答案 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。