Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Создает двоичный файл, который можно выполнить в ядре 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в/kernelx86./arch:AVX,/arch:AVX2и/arch:AVX512не поддерживаются в/kernelx64.
Сборка с /kernel также передается /kernel компоновщику. Вот как параметр влияет на поведение компоновщика:
Добавочное связывание отключено. При добавлении
/incrementalв командную строку компоновщик выдает эту неустранимая ошибку:неустранимая ошибка LNK1295: "/INCREMENTAL" несовместима со спецификацией "/KERNEL"; ссылка без "/INCREMENTAL"
Компоновщик проверяет каждый файл объекта (или любой включенный элемент архива из статических библиотек), чтобы узнать, может ли он быть скомпилирован с помощью
/kernelпараметра, но не был. Если какие-либо экземпляры соответствуют этому критерию, компоновщик по-прежнему успешно связывается, но может выдавать предупреждение, как показано в следующей таблице.Команда /kernelobjnon-obj /kernel, MASM obj или cvtres obj/kernelСочетание и не-objs/kernellink /kernelДа Да Да с предупреждением LNK4257 linkДа Да Да LNK4257 связывание объекта, не скомпилированного с помощью /KERNEL; Образ может не запускаться
Параметр /kernel и /driver параметр работают независимо. Они не влияют друг на друга.
Установка параметра компилятора /ядра в Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойств сборки в Visual Studio.
Перейдите на страницу свойств Свойства конфигурации>C/C++>Командная строка.
В поле "Дополнительные параметры" добавьте
/kernel. Нажмите кнопку "ОК" или "Применить", чтобы сохранить изменения.
См. также
Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC