Я пишу код на C, используя IOKit
и нужно использовать 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();
}
Будучи основанным на BSD, xnu унаследовал некоторые из API-интерфейсов ядра BSD, включая copyin
а также copyout
функции. Они объявлены в libkern.h, и они делают в значительной степени то, что вы используете IOMemoryDescriptor
для, но ничего больше.
Вы упоминаете, что используете IOKit — если вам нужно что-то помимо функциональности IOKit, вам придется использовать компилятор C ++ или использовать C для непосредственного вызова искаженных имен.
Если вы новичок в использовании странного компилятора для сборки kexts, я просто предупреждаю вас, что код ядра для x86_64 не должен использовать Красная зона стека, так как он не может существовать из-за обработки прерываний. Если ваш компилятор предполагает наличие красной зоны, вы получите странные сбои. Clang и gcc имеют соответствующие флаги для отключения красной зоны. (-mno-red-zone
(если я правильно помню, автоматически активируется с помощью флага режима ядра). Даже если вы используете неофициальный компилятор, ссылки на объектный файл, созданный с помощью компилятора C ++ clang на последнем этапе, должны нормально работать для переноса любых других API C ++.