Поделиться через


/kernel (создание двоичного режима ядра)

Создает бинарный, могут быть выполнены в ядре Windows.

/kernel[-]

Аргументы

  • /kernel
    Код в текущем проекте компилироваться и связан с помощью набора правил языка C++, относящиеся к коду, который выполняется в режиме ядра.

  • /kernel-
    Код в текущем проекте компилироваться и связан без использования правил языка C++, относящиеся к коду, который выполняется в режиме ядра.

Заметки

Значение #pragma эквивалентно элементу управления этот параметр.

Указание параметра /kernel дает компилятору и компоновщик выносить, функции языка допустимы в режиме ядра и убедиться, что имеется достаточное количество выразительную степень избежать нестабильности среды выполнения, уникальные для C++ в режиме ядра. Это выполняется с помощью запрещать функций языка C++ критическими в режиме ядра и предоставление предупреждения для функций языка C++ потенциально критическими, но не может быть запрещено.

Параметр /kernel применяется и этапами компилятора и компоновщика и построения задается на уровне проекта. Передайте параметр /kernel, чтобы указать компилятору на то, что результирующее бинарный, после связывания, должно быть загружено в ядра Windows. Компилятор сужает спектр функций языка C++ к подмножеству совместимо с ядром.

В следующей таблице перечислены изменения в расширении функциональности компилятора при /kernel определено.

Тип расширения функциональности

расширение функциональности /kernel

Обработка исключений C++.

Отключенный. Все экземпляры ключевых слов throw и try выдают ошибку компилятора (за исключением спецификации исключений throw()). Никакие параметры /EH не совместимы с /kernel, за исключением /EH-.

RTTI

Отключенный. Все экземпляры ключевых слов dynamic_cast и typeid выдают ошибку компилятора, если dynamic_cast не используется статически.

new и delete.

Необходимо явным образом указать оператор new() или delete(); ни компилятор и выполнение поставят определение по умолчанию.

Допускаются пользовательские соглашения о вызовах, параметр построения /GS и все оптимизации при использовании параметра /kernel. В большинстве inlining не зависеть от на /kernel, с той же семантикой удостоенная компилятором. Если необходимо убедиться, что __forceinline встраивание квалификатор приняты, необходимо убедиться, что предупреждение включено Предупреждение C4714, чтобы узнать, является функция __forceinline частности.

Когда компилятор передается параметром /kernel, он предопределяет с именем _KERNEL_MODE макроса препроцессора и имеет значение 1. С помощью этого условно компилировать код в зависимости от того, среда выполнения в режиме пользователя или в режиме ядра. Например, следующий код определяет, что класс должен находиться в не pageable сегменте памяти после компилирования для выполнения в режиме ядра.

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{

};

Некоторые следующую архитектура сочетаний целевого объекта из и параметр /arch возникновения ошибки при использовании с /kernel:

  • /arch:{SSE|SSE2|AVX} не поддерживается для платформы x86. Только /arch:IA32 поддерживается в /kernel для платформы x86.

  • /arch:AVX не поддерживается в /kernel на x64.

Построение с /kernel также передает /kernel компоновщику. Her, как это влияет на расширение функциональности компоновщика.

  • Последовательной компоновки запрещено. При добавлении /инкрементально в командной строке, компоновщик выдает неустранимую эту ошибку:

    LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'

  • Компоновщик проверяет каждый объектный файл (или любой включенный члена архива из статических библиотек), чтобы определить, может ли он компилировать с помощью параметра /kernel, но не был. Если все экземпляры соответствующих этому критерию, компоновщика связи по-прежнему успешно, но может выдать предупреждение, как показано в следующей таблице.

    объект /kernel

    объект /kernel-, obj MASM, или cvtresed

    Набор /kernel и objs /kernel-

    ссылка /kernel

    Да

    Да

    Да LNK4257 предупреждением

    link

    Да

    Да

    Да

    LNK4257 linking object not compiled with /KERNEL ; image may not run

Параметр /kernel и параметр /driver работающих независимо и не влияет на другое.

Задать параметр компилятора /kernel в Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Для получения дополнительной информации см. Открытие свойств страниц проекта.

  2. Выберите папку C/C++.

  3. Выберите страницу свойств Командная строка.

  4. В поле Дополнительные параметры добавьте /kernel или /kernel-.

См. также

Ссылки

Параметры компилятора

Настройка параметров компилятора