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