/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
Objnon-obj /kernel
, MASM obj или cvtres obj/kernel
Сочетание и не-/kernel
objslink /kernel
Да Да Да с предупреждением LNK4257 link
Да Да Да Объект компоновки LNK4257 не скомпилирован с помощью /KERNEL; образ может не выполняться
Параметр /kernel
и /driver
параметр работают независимо друг от друга. Они не влияют друг на друга.
Установка параметра компилятора /kernel в Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.
Выберите страницу свойствC/C++>Command Lineсвойства> конфигурации.
В поле Дополнительные параметры добавьте
/kernel
. Нажмите кнопку ОК или Применить , чтобы сохранить изменения.
См. также раздел
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC