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

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

Синтаксис

/kernel

Remarks

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

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

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

Тип поведения Поведение /kernel
Обработка исключений С++ Отключено. Все экземпляры throw ключевых слов и try выдают ошибку компилятора (за исключением спецификации throw()исключения ). Никакие /EH параметры не совместимы с /kernel, за исключением /EH-.
RTTI Отключено. Все экземпляры dynamic_cast ключевых слов и typeid выдают ошибку компилятора, если dynamic_cast не используется статически.
new и delete Необходимо явно определить new() оператор или delete() . Компилятор и среда выполнения не предоставляют определение по умолчанию.

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

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

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

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

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

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

  • /arch:SSE, /arch:SSE2, /arch:AVX, /arch:AVX2и /arch:AVX512 не поддерживаются в x86. Поддерживается только /arch:IA32 с в /kernel x86.

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

Сборка с /kernel также передается /kernel компоновщику. Вот как этот параметр влияет на поведение компоновщика:

  • Добавочное связывание отключено. При добавлении /incremental в командную строку компоновщик выдает следующую неустранимую ошибку:

    Неустранимая ошибка LNK1295: "/INCREMENTAL" несовместим со спецификацией /KERNEL; ссылка без "/INCREMENTAL"

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

    Get-Help /kernel Obj non-obj/kernel , MASM obj или cvtres obj /kernel Сочетание и не-/kernel objs
    link /kernel Да Да Да с предупреждением LNK4257
    link Да Да Да

    Объект компоновки LNK4257 не скомпилирован с помощью /KERNEL; образ может не выполняться

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

Установка параметра компилятора /kernel в Visual Studio

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.

  2. Выберите страницу свойствC/C++>Command Lineсвойства> конфигурации.

  3. В поле Дополнительные параметры добавьте /kernel. Нажмите кнопку ОК или Применить , чтобы сохранить изменения.

См. также раздел

Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC