/kernel (создание двоичного режима ядра)
Создает бинарный, могут быть выполнены в ядре Windows.
/kernel[-]
Аргументы
/kernel
Код в текущем проекте компилироваться и связан с помощью набора правил языка C++, относящиеся к коду, который выполняется в режиме ядра./kernel-
Код в текущем проекте компилироваться и связан без использования правил языка C++, относящиеся к коду, который выполняется в режиме ядра.
Заметки
Значение #pragma эквивалентно элементу управления этот параметр.
Указание параметра /kernel дает компилятору и компоновщик выносить, функции языка допустимы в режиме ядра и убедиться, что имеется достаточное количество выразительную степень избежать нестабильности среды выполнения, уникальные для C++ в режиме ядра. Это выполняется с помощью запрещать функций языка C++ критическими в режиме ядра и предоставление предупреждения для функций языка C++ потенциально критическими, но не может быть запрещено.
Параметр /kernel применяется и этапами компилятора и компоновщика и построения задается на уровне проекта. Передайте параметр /kernel, чтобы указать компилятору на то, что результирующее бинарный, после связывания, должно быть загружено в ядра Windows. Компилятор сужает спектр функций языка C++ к подмножеству совместимо с ядром.
В следующей таблице перечислены изменения в расширении функциональности компилятора при /kernel определено.
Тип расширения функциональности |
расширение функциональности /kernel |
---|---|
Обработка исключений C++. |
Отключенный. Все экземпляры ключевых слов throw и try выдают ошибку компилятора (за исключением спецификации исключений throw()). Никакие параметры /EH не совместимы с /kernel, за исключением /EH-. |
RTTI |
Отключенный. Все экземпляры ключевых слов dynamic_cast и typeid выдают ошибку компилятора, если dynamic_cast не используется статически. |
new и delete. |
Необходимо явным образом указать оператор new() или delete(); ни компилятор и выполнение поставят определение по умолчанию. |
Допускаются пользовательские соглашения о вызовах, параметр построения /GS и все оптимизации при использовании параметра /kernel. В большинстве inlining не зависеть от на /kernel, с той же семантикой удостоенная компилятором. Если необходимо убедиться, что __forceinline встраивание квалификатор приняты, необходимо убедиться, что предупреждение включено Предупреждение C4714, чтобы узнать, является функция __forceinline частности.
Когда компилятор передается параметром /kernel, он предопределяет с именем _KERNEL_MODE макроса препроцессора и имеет значение 1. С помощью этого условно компилировать код в зависимости от того, среда выполнения в режиме пользователя или в режиме ядра. Например, следующий код определяет, что класс должен находиться в не pageable сегменте памяти после компилирования для выполнения в режиме ядра.
#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif
class NONPAGESECTION MyNonPagedClass
{
};
Некоторые следующую архитектура сочетаний целевого объекта из и параметр /arch возникновения ошибки при использовании с /kernel:
/arch:{SSE|SSE2|AVX} не поддерживается для платформы x86. Только /arch:IA32 поддерживается в /kernel для платформы x86.
/arch:AVX не поддерживается в /kernel на x64.
Построение с /kernel также передает /kernel компоновщику. Her, как это влияет на расширение функциональности компоновщика.
Последовательной компоновки запрещено. При добавлении /инкрементально в командной строке, компоновщик выдает неустранимую эту ошибку:
LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'
Компоновщик проверяет каждый объектный файл (или любой включенный члена архива из статических библиотек), чтобы определить, может ли он компилировать с помощью параметра /kernel, но не был. Если все экземпляры соответствующих этому критерию, компоновщика связи по-прежнему успешно, но может выдать предупреждение, как показано в следующей таблице.
объект /kernel
объект /kernel-, obj MASM, или cvtresed
Набор /kernel и objs /kernel-
ссылка /kernel
Да
Да
Да LNK4257 предупреждением
link
Да
Да
Да
LNK4257 linking object not compiled with /KERNEL ; image may not run
Параметр /kernel и параметр /driver работающих независимо и не влияет на другое.
Задать параметр компилятора /kernel в Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Для получения дополнительной информации см. Открытие свойств страниц проекта.
Выберите папку C/C++.
Выберите страницу свойств Командная строка.
В поле Дополнительные параметры добавьте /kernel или /kernel-.