/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
Objnon- /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
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.
Baca juga
Opsi Pengkompilasi MSVC
Sintaks Baris Perintah Pengkompilasi MSVC
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk