c++ - IOMemoryDe​​scriptor 类的 C 等效项

标签 c++ c macos iokit mach

我正在使用 IOKit 编写一些 C 代码,并且需要使用 IOMemoryDe​​scriptor 方法。不幸的是,我只能编译纯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 中声明,并且它们的作用与您使用 IOMemoryDe​​scriptor 的作用几乎相同,但仅此而已。

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

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

关于c++ - IOMemoryDe​​scriptor 类的 C 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31126075/

相关文章:

swift - macOS NSTabViewController 居中选项卡图标

python - 如何为opencv安装gstreamer 1.0 badplugin?

c++ - Win32 选项卡控件中的右对齐选项卡项

char数组到uint8类型指针的转换

c - 在节点中传递 ')' token 之前预期为 '*'

xcode - Interface Builder 中带有自动 NSNumberFormatter 的 NSTextField

c++ - 什么是 undefined reference /未解析的外部符号错误,我该如何解决?

c++ - 模板类与模板成员类

使用 execvp 进行 c 编程

swift - NSProgressIndicator 无法将背景颜色设置为白色