Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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:AVX512tidak didukung pada x86. Hanya/arch:IA32didukung dengan/kernelpada x86./arch:AVX,/arch:AVX2, dan/arch:AVX512tidak didukung dengan/kernelpada x64.
Membangun dengan /kernel juga diteruskan /kernel ke linker. Berikut adalah bagaimana opsi memengaruhi perilaku linker:
Penautan inkremental dinonaktifkan. Jika Anda menambahkan
/incrementalke 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
/kernelopsi tetapi tidak. Jika ada instans yang memenuhi kriteria ini, linker masih berhasil menautkan tetapi mungkin mengeluarkan peringatan, seperti yang ditunjukkan dalam tabel berikut.Perintah /kernelObjnon- /kernelobj, MASM obj, atau cvtres obj/kernelCampuran dan non-objs/kernellink /kernelYa Ya Ya dengan LNK4257 peringatan linkYa 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
Buka kotak dialog Halaman Properti untuk proyek. Untuk informasi selengkapnya, lihat Mengatur pengkompilasi C++ dan membuat properti di Visual Studio.
Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.
Dalam kotak Opsi tambahan, tambahkan
/kernel. Pilih OK atau Terapkan untuk menyimpan perubahan Anda.
Lihat juga
Opsi Pengkompilasi MSVC
Sintaks Baris Perintah Pengkompilasi MSVC