다음을 통해 공유


/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_casttypeid 키워드는 컴파일러 오류를 내보낸다.
newdelete 또는 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:AVXx64 /arch:AVX2/arch:AVX512 에서는 지원 /kernel 되지 않습니다.

링커에 /kernel 전달하여 빌드합니다 /kernel . 이 옵션이 링커 동작에 미치는 영향은 다음과 같습니다.

  • 증분 연결을 사용할 수 없습니다. 명령줄에 추가 /incremental 하면 링커가 이 치명적인 오류를 내보낸다.

    심각한 오류 LNK1295: '/INCREMENTAL'이 '/KERNEL' 사양과 호환되지 않습니다. '/INCREMENTAL'이 없는 링크

  • 링커는 각 개체 파일(또는 정적 라이브러리의 포함된 보관 멤버)을 검사하여 옵션을 사용하여 /kernel 컴파일되었을 수 있지만 그렇지 않은지 확인합니다. 인스턴스가 이 조건을 충족하는 경우 링커는 여전히 성공적으로 연결되지만 다음 표와 같이 경고를 발생시킬 수 있습니다.

    명령 /kernel obj non-/kernel obj, MASM obj 또는 cvtres obj 혼합 및 /kernel 비-/kernel objs
    link /kernel 예, 경고 LNK4257
    link

    /KERNEL을 사용하여 컴파일되지 않은 연결 개체를 LNK4257. 이미지가 실행되지 않을 수 있음

/kernel 옵션과 /driver 옵션은 독립적으로 작동합니다. 그들은 서로에 영향을 미치지 않습니다.

Visual Studio에서 /kernel 컴파일러 옵션을 설정하려면

  1. 프로젝트에 대한 속성 페이지 대화 상자를 엽니다. 자세한 내용은 Visual Studio에서 컴파일러 및 빌드 속성 설정을 참조합니다.

  2. 구성 속성>C/C++>명령줄 속성 페이지를 선택합니다.

  3. 추가 옵션 상자에서 .를 추가/kernel합니다. 확인을 선택하거나 적용을 선택하여 변경 내용을 저장합니다.

참고 항목

MSVC 컴파일러 옵션
MSVC 컴파일러 명령줄 구문