Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Создает двоичный файл, который можно выполнить в ядре 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