IOMemoryDescriptor class 的 C 等价物
C equivalent of IOMemoryDescriptor class
我正在使用 IOKit
编写一些 C 代码,并且需要使用 IOMemoryDescriptor
方法。不幸的是,我只能编译纯 C 源代码,那是 C++ class。所以,我想问是否有一些 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();
}
xnu基于BSD,继承了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++ API。
我正在使用 IOKit
编写一些 C 代码,并且需要使用 IOMemoryDescriptor
方法。不幸的是,我只能编译纯 C 源代码,那是 C++ class。所以,我想问是否有一些 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();
}
xnu基于BSD,继承了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++ API。