我正在使用 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 直接调用损坏的名称。
如果您不熟悉使用奇怪的编译器来构建 kext,我只是警告您 x86_64 的内核代码不得使用 red zone堆栈的,因为由于中断处理而不能存在。如果你的编译器假设存在红色区域,你会遇到奇怪的崩溃。 Clang 和 gcc 有相应的标志用于禁用红色区域。 (-mno-red-zone
,如果我没记错的话,会通过内核模式标志自动激活)即使您使用的是非官方编译器,也会链接到使用 clang 的 C++ 编译器构建的目标文件最后阶段应该可以很好地包装任何其他 C++ API。
关于c++ - IOMemoryDescriptor 类的 C 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126075/