Bagikan melalui


/kernel (Membuat biner mode kernel)

Membuat biner yang dapat dijalankan di kernel Windows. Kode dalam proyek saat ini dikompilasi dan ditautkan dengan menggunakan serangkaian fitur bahasa C++ yang disederhanakan yang khusus untuk kode yang berjalan dalam mode kernel.

Sintaks

/kernel

Keterangan

Menentukan /kernel opsi memberi tahu pengompilasi dan linker untuk membuat arbitrase fitur bahasa mana yang diizinkan dalam mode kernel dan untuk memastikan bahwa Anda memiliki daya ekspresif yang cukup untuk menghindari ketidakstabilan runtime yang unik untuk mode kernel C++. Ini dilakukan dengan melarang penggunaan fitur bahasa C++ yang mengganggu dalam mode kernel. Pengkompilasi menghasilkan peringatan untuk fitur bahasa C++ yang berpotensi mengganggu tetapi tidak dapat dinonaktifkan.

Opsi /kernel ini berlaku untuk fase kompilator dan linker build dan diatur pada tingkat proyek. Teruskan /kernel sakelar untuk menunjukkan ke pengkompilasi bahwa biner yang dihasilkan, setelah penautan, harus dimuat ke kernel Windows. Pengompilasi akan mempersempit spektrum fitur bahasa C++ ke subset yang kompatibel dengan kernel.

Tabel berikut ini mencantumkan perubahan perilaku pengkompilasi saat /kernel ditentukan.

Jenis perilaku /kernel Perilaku
Penanganan pengecualian C++ Dinonaktifkan. Semua instans kata kunci dan try memancarkan throw kesalahan pengkompilasi (kecuali untuk spesifikasi throw()pengecualian ). Tidak ada /EH opsi yang kompatibel dengan /kernel, kecuali untuk /EH-.
RTTI Dinonaktifkan. Semua instans kata kunci dan typeid memancarkan dynamic_cast kesalahan pengkompilasi, kecuali dynamic_cast digunakan secara statis.
new dan delete Anda harus secara eksplisit menentukan new() operator atau delete() . Pengkompilasi dan runtime tidak memberikan definisi default.

Konvensi panggilan kustom, /GS opsi build, dan semua pengoptimalan diizinkan saat Anda menggunakan opsi ./kernel Inlining sebagian besar tidak dipengaruhi oleh /kernel, dengan semantik yang sama yang dihormati oleh pengkompilasi. Jika Anda ingin memastikan bahwa __forceinline kualifikasi inlining dihormati, Anda harus memastikan bahwa peringatan C4714 diaktifkan sehingga Anda tahu kapan fungsi tertentu __forceinline tidak sebaris.

Tidak ada #pragma yang setara untuk mengontrol opsi ini.

Ketika compiler diteruskan sakelar /kernel , itu telah menentukan makro praprosesor yang diberi nama _KERNEL_MODE dan memiliki nilai 1. Anda dapat menggunakan makro ini untuk mengkompilasi kode secara kondisional berdasarkan apakah lingkungan eksekusi dalam mode pengguna atau mode kernel. Misalnya, kode berikut menentukan bahwa MyNonPagedClass kelas harus berada di segmen memori yang tidak dapat di-halaman saat dikompilasi untuk eksekusi mode kernel.

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

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Beberapa kombinasi arsitektur target berikut dan /arch opsi menghasilkan kesalahan saat digunakan dengan /kernel:

  • /arch:SSE, , /arch:SSE2/arch:AVX, /arch:AVX2, dan /arch:AVX512 tidak didukung pada x86. Hanya /arch:IA32 didukung dengan /kernel pada x86.

  • /arch:AVX, /arch:AVX2, dan /arch:AVX512 tidak didukung dengan /kernel pada x64.

Membangun dengan /kernel juga diteruskan /kernel ke linker. Berikut adalah bagaimana opsi memengaruhi perilaku linker:

  • Penautan inkremental dinonaktifkan. Jika Anda menambahkan /incremental ke baris perintah, linker akan memancarkan kesalahan fatal ini:

    kesalahan fatal LNK1295: '/INCREMENTAL' tidak kompatibel dengan spesifikasi '/KERNEL'; tautan tanpa '/INCREMENTAL'

  • Linker memeriksa setiap file objek (atau anggota arsip yang disertakan dari pustaka statis) untuk melihat apakah file tersebut dapat dikompilasi dengan menggunakan /kernel opsi tetapi tidak. Jika ada instans yang memenuhi kriteria ini, linker masih berhasil menautkan tetapi mungkin mengeluarkan peringatan, seperti yang ditunjukkan dalam tabel berikut.

    Perintah /kernel Obj non-/kernel obj, MASM obj, atau cvtres obj /kernel Campuran dan non-objs/kernel
    link /kernel Ya Ya Ya dengan LNK4257 peringatan
    link Ya Ya Ya

    LNK4257 menautkan objek yang tidak dikompilasi dengan /KERNEL; gambar mungkin tidak berjalan

Opsi /kernel dan /driver opsi beroperasi secara independen. Mereka tidak berpengaruh satu sama lain.

Untuk mengatur opsi pengkompilasi /kernel di Visual Studio

  1. Buka kotak dialog Halaman Properti untuk proyek. Untuk informasi selengkapnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Dalam kotak Opsi tambahan, tambahkan /kernel. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.

Baca juga

Opsi Pengkompilasi MSVC
Sintaks Baris Perintah Pengkompilasi MSVC