Share via


/kernel (建立核心模式二進位檔)

建立可在 Windows 核心中執行的二進位檔。 目前專案中的程式碼會使用一組簡化的 C++ 語言功能來編譯和連結,這些功能是核心模式中執行之程式碼特有的。

語法

/kernel

備註

/kernel指定 選項會告訴編譯器和連結器,以仲裁核心模式中允許的語言功能,並確定您有足夠的表達能力,以避免執行時間不穩定,而核心模式 C++ 是唯一的。 這樣做的方式是禁止使用在核心模式中干擾的 C++ 語言功能。 編譯器會產生 C++ 語言功能的警告,這些功能可能會造成干擾,但無法停用。

此選項 /kernel 同時套用至建置的編譯器和連結器階段,並且設定在專案層級。 /kernel傳遞 參數,以指示編譯器在連結之後產生的二進位檔應該載入到 Windows 核心中。 編譯器會將 C++ 語言功能的範圍縮小到與核心相容的子集。

下表列出指定時 /kernel 編譯器行為的變更。

行為類型 /kernel 行為
C++ 例外狀況處理 Disabled. 和 try 關鍵字的所有實例 throw 都會發出編譯器錯誤(例外狀況規格 throw() 除外)。 除了 之外, /EH- 沒有任何 /EH 選項與 /kernel 相容。
RTTI Disabled. 除非靜態使用 ,否則 dynamic_casttypeid 關鍵字的所有實例 dynamic_cast 都會發出編譯器錯誤。
newdelete 您必須明確定義 new()delete() 運算子。 編譯器和執行時間不提供預設定義。

當您使用 /kernel 選項時,允許自訂呼叫慣例、 /GS 建置選項和所有優化。 內嵌基本上不會受到 /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:SSEx86 不支援 、 /arch:SSE2/arch:AVX/arch:AVX2/arch:AVX512 。 只有在 /arch:IA32 x86 上才支援 /kernel

  • /arch:AVXx64 不支援 、 /arch:AVX2/arch:AVX512/kernel

使用 建置 /kernel 也會傳遞 /kernel 至連結器。 以下是選項如何影響連結器行為:

  • 累加連結已停用。 如果您新增 /incremental 至命令列,連結器就會發出這個嚴重錯誤:

    嚴重錯誤LNK1295:'/INCREMENTAL' 與 '/KERNEL' 規格不相容;沒有 '/INCREMENTAL' 的連結

  • 連結器會檢查每個物件檔案(或靜態程式庫包含的封存成員),以查看它是否可以使用 /kernel 選項進行編譯,但不是。 如果有任何實例符合此準則,連結器仍會成功連結,但可能會發出警告,如下表所示。

    Command /kernel Obj non- /kernel obj、MASM obj 或 cvtres obj 混合 /kernel 與非 /kernel objs
    link /kernel Yes Yes 是,警告LNK4257
    link Yes Yes Yes

    LNK4257連結化物件未使用 /KERNEL 編譯;映射可能無法執行

選項 /kernel/driver 選項會獨立運作。 它們對彼此沒有任何影響。

在 Visual Studio 中設定 /kernel 編譯器選項

  1. 開啟專案的 [ 屬性頁 ] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [組態屬性]>[C/C++]>[命令列] 屬性頁。

  3. 在 [ 其他選項] 方塊中,新增 /kernel 。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法