我正在使用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++ - 相当于IOMemoryDescriptor类的C,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31126075/