/kernel(커널 모드 이진 만들기)
Windows 커널에서 실행할 수 있는 이진 파일을 만듭니다. 현재 프로젝트의 코드는 커널 모드에서 실행되는 코드와 관련된 간소화된 C++ 언어 기능 집합을 사용하여 컴파일되고 연결됩니다.
구문
/kernel
설명
옵션을 지정하면 /kernel
컴파일러와 링커가 커널 모드에서 허용되는 언어 기능을 중재하고 커널 모드 C++에 고유한 런타임 불안정을 방지하기에 충분한 표현 능력을 갖도록 합니다. 커널 모드에서 중단되는 C++ 언어 기능의 사용을 금지하여 수행됩니다. 컴파일러는 잠재적으로 중단될 수 있지만 사용하지 않도록 설정할 수 없는 C++ 언어 기능에 대한 경고를 생성합니다.
이 /kernel
옵션은 빌드의 컴파일러 및 링커 단계 모두에 적용되며 프로젝트 수준에서 설정됩니다. /kernel
연결 후 결과 이진 파일을 Windows 커널에 로드해야 함을 컴파일러에 나타내려면 스위치를 전달합니다. 컴파일러는 C++ 언어 기능의 스펙트럼을 커널과 호환되는 하위 집합으로 좁혀집니다.
다음 표에서는 지정된 경우 /kernel
컴파일러 동작의 변경 내용을 나열합니다.
동작 유형 | /kernel 동작 |
---|---|
C++ 예외 처리 | Disabled. 및 try 키워드의 throw 모든 인스턴스는 컴파일러 오류를 내보낸다(예외 사양 throw() 제외). 을 제외하고 /EH- 호환/kernel 되는 옵션은 없습니다/EH . |
RTTI | Disabled. 정적으로 사용되지 않는 한 dynamic_cast 모든 인스턴스 dynamic_cast 및 typeid 키워드는 컴파일러 오류를 내보낸다. |
new 및 delete |
또는 delete() 연산자를 new() 명시적으로 정의해야 합니다. 컴파일러와 런타임은 기본 정의를 제공하지 않습니다. |
사용자 지정 호출 규칙, /GS
빌드 옵션 및 모든 최적화는 옵션을 사용할 /kernel
때 허용됩니다. 인라인 처리는 컴파일러에서 /kernel
적용하는 것과 동일한 의미 체계를 사용하여 크게 영향을 받지 않습니다. 인라인 한정자를 적용하려면 __forceinline
특정 __forceinline
함수가 인라인되지 않는 시기를 알 수 있도록 경고 C4714가 사용하도록 설정되어 있는지 확인해야 합니다.
이 옵션을 제어하는 것과 동일한 항목은 없습니다 #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에서 지원되지 않습니다. x86에서만/arch:IA32
지원됩니다/kernel
./arch:AVX
x64/arch:AVX2
/arch:AVX512
에서는 지원/kernel
되지 않습니다.
링커에 /kernel
전달하여 빌드합니다 /kernel
. 이 옵션이 링커 동작에 미치는 영향은 다음과 같습니다.
증분 연결을 사용할 수 없습니다. 명령줄에 추가
/incremental
하면 링커가 이 치명적인 오류를 내보낸다.심각한 오류 LNK1295: '/INCREMENTAL'이 '/KERNEL' 사양과 호환되지 않습니다. '/INCREMENTAL'이 없는 링크
링커는 각 개체 파일(또는 정적 라이브러리의 포함된 보관 멤버)을 검사하여 옵션을 사용하여
/kernel
컴파일되었을 수 있지만 그렇지 않은지 확인합니다. 인스턴스가 이 조건을 충족하는 경우 링커는 여전히 성공적으로 연결되지만 다음 표와 같이 경고를 발생시킬 수 있습니다.명령 /kernel
objnon- /kernel
obj, MASM obj 또는 cvtres obj혼합 및 /kernel
비-/kernel
objslink /kernel
예 예 예, 경고 LNK4257 link
예 예 예 /KERNEL을 사용하여 컴파일되지 않은 연결 개체를 LNK4257. 이미지가 실행되지 않을 수 있음
/kernel
옵션과 /driver
옵션은 독립적으로 작동합니다. 그들은 서로에 영향을 미치지 않습니다.
Visual Studio에서 /kernel 컴파일러 옵션을 설정하려면
프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 컴파일러 및 빌드 속성 설정을 참조합니다.
구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.
추가 옵션 상자에서 .를 추가
/kernel
합니다. 확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.