Diğer iki cevap (yazma sırasında) kesintiler ve IDT hakkında konuşur. Bu doğrudur, ancak modern bir Intel-esque CPU'da, çekirdeğe çağrı yapmanın üçten az yolu yoktur.
Yöntem # 1: Kesmeler.
Bu yukarıda açıklanmıştır. Kesme tanımlayıcı tablosu / kesinti vektörüne bir giriş ayarladınız ve sonra çekirdeğe girmek için bir yazılım kesintisi gerçekleştirdiniz.
Bu yöntemin ana avantajı, tipik bir çekirdeğin kesmeleri yine de ele alabilmesi ve arkaik donanım üzerinde çalışmasıdır.
Yöntem # 2: Çağrı kapıları.
Bir çağrı kapısı, özel bir tür segment seçicidir. Çağrının hedefinin genel veya yerel segment tanımlayıcı tablosuna yüklenmesi gerekir (sırasıyla GDT ve LDT). Daha sonra, segment olarak çağrı kapısını kullanarak bir uzak çağrı talimatı gerçekleştirirseniz (çağrının ofseti yoksayılır), bu daha ayrıcalıklı kod çağırmanıza izin verir. Çağrı kapıları son derece esnektir; IA-32 mimarisinin dört ayrıcalık seviyesi vardır ve çağrı kapıları herhangi bir seviyeyi aramanızı sağlar.
Linux'un şimdiye kadar çağrı kapıları kullandığına inanmıyorum, ancak Windows 95 kullandı. Win95 çekirdek hizmetleri ( krnl386.exe
ve kernel.dll
) aslında kullanıcı modunda (halka 3) koştu. En yüksek ayrıcalık düzeyi (halka 0) yalnızca sürücüler ve yalnızca işlem anahtarlaması gerçekleştiren bir mikro çekirdek için kullanıldı. Şoförlere çağrı, çağrı kapıları kullanılarak yapıldı. Bu, her zamanki gibi, standart bir uzak çağrı kullanarak Win95 sürücülerini kullanmak için eski 16 bit koduna (çok fazla şey vardı!) İzin verdi.
Genel tanımlayıcı tablosunun yetersiz korunması, kendi arama kapılarını bellek üzerine yazarak yüklemeyi başaran birkaç Windows 95 istismarının nedeniydi.
Yöntem # 3: SYSCALL / SYSRET ve SYSENTER / SYSEXIT
Bunlar, AMD ve Intel tarafından bağımsız olarak icat edilen iki talimat setidir, ancak aslında aynı şeyi yaparlar. SYSCALL / SYSRET önce geldi ve sadece AMD'ydi, SYSENTER / SYSEXIT Intel'di, ancak AMD şimdi uyguladı. Bu yüzden SYSENTER / SYSEXIT'i anlatacağım.
Çağrı kapılarının aksine, SYSENTER yalnızca 0 halkasına aktarmak için kullanılabilir ve yalnızca bir konuma aktarılabilir. Bununla birlikte, son derece düşük gecikme olma avantajına sahiptir, çünkü bir çağrı veya kesmenin aksine yığına değmez.
Aktarma konumu, modele özgü üç kayıt kullanılarak ayarlanır: biri segment bilgisi için ve her biri çekirdek kodunun yönerge işaretçisi ve yığın işaretçisi için. Yığına "hiçbir şey" itilmediğinden, kullanıcı modu kodu, kayıtlara iade talimatı işaretçisini ve yığın işaretçisini ileterek çekirdeğe nereye dönüleceğini bildirmekten sorumludur. Çekirdek, yığın işaretçisini geri yüklemekten sorumludur ve SYSEXIT komutu, talimat işaretçisini geri yükler.
SYSENTER ve SYSEXIT talimatları hakkında daha fazla bilgi.