다음을 통해 공유


/kernel (Create Kernel Mode Binary)

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 옵션.인라이닝 된 거의 받지 여 /kernel, 적용은 컴파일러에 의해 동일한 의미 체계를.있는지 확인 하려는 경우를 __forceinline 는 인라인 한정자를 적용 하 고 해당 경고가 있는지 확인 해야 C4714 특정 한 때를 알 수 있도록 가능 __forceinline 함수를 인라인 하지 않습니다.

컴파일러에 전달 되는 /kernel 미리 스위치는 정의 라는 전처리기 매크로 _KERNEL_MODE 및 값이 1.이 코드는 실행 환경이 사용자 모드 또는 커널 모드 인지 여부에 따라 조건부로 컴파일할 수 있습니다.예를 들어, 다음 코드 커널 모드 실행에 대 한 컴파일할 때 클래스 페이징할 수 없는 메모리 세그먼트에 되도록 지정 합니다.

#ifdef _KERNEL_MODE
#define NONPAGESECTION __declspec(code_seg("$kerneltext$"))
#else
#define NONPAGESECTION
#endif

class NONPAGESECTION MyNonPagedClass
{

};

일부 대상 아키텍처의 조합은 다음 및 /arch 옵션을 사용 하는 경우 오류가 생성 /kernel.

  • **/arch:{SSE|SSE2|AVX}**x 86에서 지원 되지 않습니다.만 /arch:IA32 지원 됩니다 /kernel x86.

  • /arch:AVX지원 되지 않는 /kernel x 64에서.

만들기 위한 /kernel 전달 또한 /kernel 링커에 있습니다.그녀는이 링커 동작에 미치는 영향입니다.

  • 증분 링크 하는 것이 불가능 합니다.추가 하는 경우 /incremental 명령줄에 링커에서이 심각한 오류를 표시 합니다.

    LINK : fatal error LNK1295: '/INCREMENTAL' not compatible with '/KERNEL' specification; link without '/INCREMENTAL'

  • 링커를 사용 하 여 컴파일 되었는지 수 여부를 확인할 수는 각 개체 파일 (또는 정적 라이브러리에서 포함 된 아카이브 멤버) 검사는 /kernel 옵션을 있지만 되었습니다.모든 인스턴스는이 조건을 만족 하는 경우 링커는 성공적으로 링크 되지만 경고는 다음 표에서 같이 발생할 수 있습니다.

    /kernelobj

    /kernel-obj, MASM obj 또는 cvtresed

    Mix of /kernel and /kernel- objs

    /kernel 링크

    예 경고 LNK4257

    link

    LNK4257 linking object not compiled with /KERNEL ; image may not run

/kernel 옵션 및 /driver 옵션 작동 독립적으로 하 고 모두 다른 영향을 미칩니다.

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

  1. 프로젝트의 속성 페이지 대화 상자를 엽니다.자세한 내용은 방법: 프로젝트 속성 페이지 열기을 참조하십시오.

  2. 선택 된 C/c + + 폴더입니다.

  3. 선택 된 명령줄 속성 페이지입니다.

  4. 추가 옵션 상자에서 추가 /kernel 또는 /kernel-.

참고 항목

참조

컴파일러 옵션

컴파일러 옵션 설정