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

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

Синтаксис

/kernel

Замечания

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

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

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

Тип поведения Поведение /kernel
Обработка исключений C++ Disabled. Все экземпляры throw ключевое слово try выдает ошибку компилятора (за исключением спецификации throw()исключения). Никакие /EH параметры не совместимы с /kernel, за исключением /EH-.
RTTI Disabled. Все экземпляры 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:AVX2/arch:AVXи /arch:AVX512 не поддерживаются в x86. Поддерживается только /arch:IA32 в /kernel x86.

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

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

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

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

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

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

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

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

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

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

  2. Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.

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

См. также

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