Aracılığıyla paylaş


/kernel (Çekirdek modu ikilisi oluştur)

Windows çekirdeğinde yürütülebilecek bir ikili oluşturur. Geçerli projedeki kod derlenir ve çekirdek modunda çalışan koda özgü basitleştirilmiş bir C++ dil özellikleri kümesi kullanılarak bağlanır.

Sözdizimi

/kernel

Açıklamalar

seçeneğinin /kernel belirtilmesi, derleyiciye ve bağlayıcıya çekirdek modunda izin verilen dil özelliklerini rastgele belirlemesini ve C++ çekirdek modu için benzersiz çalışma zamanı kararsızlığını önlemek için yeterli ifade gücüne sahip olduğunuzdan emin olmasını bildirir. Çekirdek modunda kesintiye neden olan C++ dil özelliklerinin kullanımını yasaklayarak yapılır. Derleyici, kesintiye neden olabilecek ancak devre dışı bırakılabilen C++ dil özellikleri için uyarılar üretir.

seçeneği, /kernel derlemenin hem derleyici hem de bağlayıcı aşamaları için geçerlidir ve proje düzeyinde ayarlanır. /kernel Derleyiciye bağlantıdan sonra elde edilen ikili dosyanın Windows çekirdeğine yüklenmesi gerektiğini belirtmek için anahtarını geçirin. Derleyici, C++ dil özelliklerinin spektrumunu çekirdekle uyumlu bir alt kümeye daraltır.

Aşağıdaki tabloda, belirtildiğinde /kernel derleyici davranışındaki değişiklikler listeleniyor.

Davranış türü /kernel Davranış
C++ özel durum işleme Devre dışı. ve try anahtar sözcüklerinin throw tüm örnekleri bir derleyici hatası (özel durum belirtimi throw()dışında) yayar. dışında /EH-hiçbir seçenek ile /kerneluyumlu değildir/EH.
RTTI Devre dışı. ve typeid anahtar sözcüklerinin dynamic_cast tüm örnekleri, statik olarak kullanılmadığı sürece dynamic_cast bir derleyici hatası gösterir.
new ve delete veya delete() işlecini new() açıkça tanımlamanız gerekir. Derleyici ve çalışma zamanı varsayılan bir tanım sağlamaz.

Özel çağrı kuralları, /GS derleme seçeneği ve seçeneği kullandığınızda /kernel tüm iyileştirmelere izin verilir. Inlining, derleyici tarafından aynı semantikle büyük ölçüde etkilenmez /kernel. Çizili niteleyicinin yerine getirildiğinden __forceinline emin olmak istiyorsanız, belirli __forceinline bir işlevin ne zaman çizili olmadığını bilmeniz için C4714 uyarısının etkinleştirildiğinden emin olmanız gerekir.

Bu seçeneği denetlemenin eşdeğeri yoktur #pragma .

Derleyiciye anahtar geçirildiğinde/kernel, adlı _KERNEL_MODE ve 1 değerine sahip bir önişlemci makroyu önceden tanımlar. Yürütme ortamının kullanıcı modunda mı yoksa çekirdek modunda mı olduğuna bağlı olarak kodu koşullu olarak derlemek için bu makroyu kullanabilirsiniz. Örneğin aşağıdaki kod, çekirdek modu yürütmesi için derlendiğinde sınıfın MyNonPagedClass disk belleğine alınamayan bir bellek kesiminde olması gerektiğini belirtir.

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

class NONPAGESECTION MyNonPagedClass
{
   // ...
};

Aşağıdaki hedef mimari birleşimlerinden bazıları ve /arch seçeneği ile /kernelkullanıldığında bir hata oluşturur:

  • /arch:SSE, /arch:SSE2, /arch:AVX, /arch:AVX2ve /arch:AVX512 x86'da desteklenmez. Yalnızca /arch:IA32 x86 üzerinde ile /kernel desteklenir.

  • /arch:AVX, /arch:AVX2ve /arch:AVX512 x64 üzerinde ile /kernel desteklenmez.

ile derleme /kernel , bağlayıcıya da geçer /kernel . Bu seçenek bağlayıcı davranışını şu şekilde etkiler:

  • Artımlı bağlama devre dışı bırakıldı. Komut satırına eklerseniz /incremental bağlayıcı şu önemli hatayı gösterir:

    önemli hata LNK1295: '/INCREMENTAL' '/KERNEL' belirtimi ile uyumlu değil; '/INCREMENTAL' olmadan bağlantı

  • Bağlayıcı, her nesne dosyasını (veya statik kitaplıklardan dahil edilen arşiv üyelerini) inceleyerek seçeneği kullanılarak /kernel derlenip derlenmediğini ancak derlenmediğini denetler. Herhangi bir örnek bu ölçüte uyuyorsa, bağlayıcı yine de başarıyla bağlanır ancak aşağıdaki tabloda gösterildiği gibi bir uyarı verebilir.

    Command /kernel Obj non-/kernel obj, MASM obj veya cvtres obj /kernel Ve olmayan/kernel obj'lerin karışımı
    link /kernel Evet Evet Evet uyarı LNK4257
    link Evet Evet Evet

    /KERNEL ile derlenmemiş nesne bağlama LNK4257; görüntü çalışmayabilir

/kernel seçeneği ve /driver seçeneği bağımsız olarak çalışır. Birbirleri üzerinde hiçbir etkisi yoktur.

Visual Studio'da /kernel derleyicisi seçeneğini ayarlamak için

  1. Proje için Özellik Sayfaları iletişim kutusunu açın. Daha fazla bilgi için bkz . Visual Studio'da C++ derleyicisi ve derleme özelliklerini ayarlama.

  2. Yapılandırma Özellikleri>C/C++>Komut Satırı özellik sayfasını seçin.

  3. Ek seçenekler kutusuna ekleyin/kernel. Değişikliklerinizi kaydetmek için Tamam'ı veya Uygula'yı seçin.

Ayrıca bkz.

MSVC Derleyicisi Seçenekleri
MSVC Derleyicisi Komut Satırı Söz Dizimi