Kullanıcı Modu ile Çekirdek Modu arasındaki farklar nelerdir, ikisini neden ve nasıl etkinleştirirsiniz ve kullanım durumları nelerdir?
Kullanıcı Modu ile Çekirdek Modu arasındaki farklar nelerdir, ikisini neden ve nasıl etkinleştirirsiniz ve kullanım durumları nelerdir?
Yanıtlar:
Çekirdek Modu
Çekirdek modunda, yürütme kodunun temel donanıma tam ve sınırsız erişimi vardır. Herhangi bir CPU komutunu çalıştırabilir ve herhangi bir bellek adresine başvurabilir. Çekirdek modu, genellikle işletim sisteminin en düşük seviyeli, en güvenilir işlevleri için ayrılmıştır. Çekirdek kipindeki çökmeler felakettir; tüm bilgisayarı durdururlar.
Kullanıcı modu
Kullanıcı modunda, yürütme kodunun donanıma veya referans belleğe doğrudan erişme yeteneği yoktur. Kullanıcı modunda çalışan kod, donanıma veya belleğe erişmek için sistem API'lerine yetki vermelidir. Bu tür bir izolasyonun sağladığı koruma nedeniyle, kullanıcı modundaki çökmeler her zaman kurtarılabilir. Bilgisayarınızda çalışan kodun çoğu kullanıcı modunda çalışacaktır.
Daha fazla oku
Bunlar, bilgisayarınızın çalışabileceği iki farklı moddur. Bundan önce, bilgisayarlar büyük bir oda gibiyken, bir şey çökerse - tüm bilgisayarı durdurur. Yani bilgisayar mimarları bunu değiştirmeye karar veriyor. Modern mikroişlemciler, donanımda en az 2 farklı durum uygular.
Kullanıcı modu:
Çekirdek modu:
Geçiş nasıl gerçekleşir.
Kullanıcı modundan çekirdek moduna geçiş, CPU tarafından otomatik olarak yapılmaz. CPU, kesintilerle (zamanlayıcılar, klavye, G / Ç) kesintiye uğradı. Kesinti oluştuğunda, CPU mevcut çalışan programı yürütmeyi durdurur, çekirdek moduna geçer, kesme işleyicisini yürütür. Bu işleyici CPU'nun durumunu kaydeder, işlemlerini gerçekleştirir, durumu geri yükler ve kullanıcı moduna döner.
http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode
http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html
Windows çalıştıran bir bilgisayardaki işlemcinin iki farklı modu vardır: kullanıcı modu ve çekirdek modu. İşlemci, işlemcide hangi tür kodun çalıştığına bağlı olarak iki mod arasında geçiş yapar. Uygulamalar kullanıcı modunda çalışır ve çekirdek işletim sistemi bileşenleri çekirdek modunda çalışır. Çoğu sürücü çekirdek modunda çalışırken, bazı sürücüler kullanıcı modunda çalışabilir.
Bir kullanıcı modu uygulamasını başlattığınızda, Windows uygulama için bir işlem oluşturur. İşlem, uygulamaya özel bir sanal adres alanı ve özel bir tutamaç tablosu sağlar. Bir uygulamanın sanal adres alanı özel olduğundan, bir uygulama başka bir uygulamaya ait olan verileri değiştiremez. Her uygulama ayrı ayrı çalışır ve bir uygulama çökerse, çökme o uygulamayla sınırlıdır. Diğer uygulamalar ve işletim sistemi çökmeden etkilenmez.
Özel olmanın yanı sıra, bir kullanıcı modu uygulamasının sanal adres alanı sınırlıdır. Kullanıcı modunda çalışan bir işlemci, işletim sistemi için ayrılmış sanal adreslere erişemez. Bir kullanıcı modu uygulamasının sanal adres alanını sınırlamak, uygulamanın kritik işletim sistemi verilerini değiştirmesini ve muhtemelen zarar vermesini önler.
Çekirdek modunda çalışan tüm kodlar, tek bir sanal adres alanını paylaşır. Bu, çekirdek modu sürücüsünün diğer sürücülerden ve işletim sisteminin kendisinden izole edilmediği anlamına gelir. Çekirdek modu sürücüsü yanlışlıkla yanlış sanal adrese yazarsa, işletim sistemine veya başka bir sürücüye ait veriler tehlikeye atılabilir. Çekirdek modu sürücüsü çökerse, tüm işletim sistemi çöker.
Bir Windows kullanıcısıysanız, bu bağlantıya bir kez gidin, daha fazlasını alacaksınız.
CPU halkaları en belirgin ayrımdır
X86 korumalı modda, CPU her zaman 4 halkadan birindedir. Linux çekirdeği yalnızca 0 ve 3'ü kullanır:
Bu, çekirdeğin kullanıcı alanına karşı en zor ve hızlı tanımıdır.
Neden Linux 1. ve 2. halkaları kullanmaz: CPU Ayrıcalık Halkaları: Neden 1. ve 2. halkalar kullanılmıyor?
Mevcut yüzük nasıl belirlenir?
Geçerli zil aşağıdakilerin bir kombinasyonu ile seçilir:
genel tanımlayıcı tablo: GDT girişlerinin bellek içi tablosu ve her girişin Privl
halkayı kodlayan bir alanı vardır.
LGDT komutu, adresi mevcut tanımlayıcı tabloya ayarlar.
Ayrıca bkz .: http://wiki.osdev.org/Global_Descriptor_Table
segment, GDT'deki bir girişin dizinine işaret eden CS, DS, vb. kaydeder.
Örneğin CS = 0
, GDT'nin ilk girişinin şu anda yürütme kodu için aktif olduğu anlamına gelir.
Her bir yüzük ne yapabilir?
CPU yongası fiziksel olarak oluşturulmuştur, böylece:
yüzük 0 her şeyi yapabilir
3. halka birkaç talimat çalıştıramaz ve birkaç kayda yazamaz, en önemlisi:
kendi yüzüğünü değiştiremez! Aksi takdirde, kendisini 0 çalacak şekilde ayarlayabilir ve halkalar işe yaramaz.
Başka bir deyişle, mevcut halkayı belirleyen geçerli segment tanımlayıcısını değiştiremezsiniz .
sayfa tablolarını değiştiremez: x86 disk belleği nasıl çalışır?
Başka bir deyişle, CR3 kaydını değiştiremez ve sayfalamanın kendisi sayfa tablolarının değiştirilmesini engeller.
Bu, güvenlik / programlama kolaylığı nedeniyle bir işlemin diğer işlemlerin belleğini görmesini engeller.
kesme işleyicileri kaydedilemiyor. Bunlar, hafıza konumlarına yazarak yapılandırılır, bu da sayfalandırma ile engellenir.
İşleyiciler 0 halkasında çalışır ve güvenlik modelini bozabilir.
Başka bir deyişle, LGDT ve LIDT talimatlarını kullanamaz.
in
ve gibi IO komutlarını yapamaz out
ve bu nedenle isteğe bağlı donanım erişimine sahip olamaz .
Aksi takdirde, örneğin, herhangi bir program doğrudan diskten okuyabiliyorsa dosya izinleri işe yaramaz.
Daha kesin olarak Michael Petch sayesinde : İşletim sisteminin 3. halka üzerinde IO komutlarına izin vermesi aslında mümkündür, bu aslında Görev durumu segmenti tarafından kontrol edilir .
3. Zil için mümkün olmayan şey, eğer ilk başta sahip değilse, kendisine izin vermesidir.
Linux her zaman buna izin vermez. Ayrıca bkz: Linux, donanım bağlam anahtarını TSS aracılığıyla neden kullanmıyor?
Programlar ve işletim sistemleri halkalar arasında nasıl geçiş yapar?
CPU açıldığında, 0 halkasındaki ilk programı çalıştırmaya başlar (iyi bir tür, ancak bu iyi bir yaklaşımdır). Bu ilk programın çekirdek olduğunu düşünebilirsiniz (ancak normalde çekirdeği hala 0 halkasında çağıran bir önyükleyicidir ).
Bir userland süreci çekirdek bir dosyaya yazma gibi bunun için bir şey yapmak istediğinde, bu gibi kesmesi bir üretir bir talimat kullanan int 0x80
veyasyscall
çekirdek sinyal. x86-64 Linux syscall merhaba dünya örneği:
.data
hello_world:
.ascii "hello world\n"
hello_world_len = . - hello_world
.text
.global _start
_start:
/* write */
mov $1, %rax
mov $1, %rdi
mov $hello_world, %rsi
mov $hello_world_len, %rdx
syscall
/* exit */
mov $60, %rax
mov $0, %rdi
syscall
derleyin ve çalıştırın:
as -o hello_world.o hello_world.S
ld -o hello_world.out hello_world.o
./hello_world.out
Bu olduğunda, CPU, çekirdeğin önyükleme sırasında kaydettiği bir kesme geri arama işleyicisini çağırır. İşte bir işleyiciyi kaydeden ve onu kullanan somut bir baremetal örnek .
Bu işleyici, çekirdeğin bu eyleme izin verip vermeyeceğine karar veren, eylemi gerçekleştiren ve ring 3'teki userland programını yeniden başlatan 0 halkasında çalışır. X86_64
zaman exec
sistem çağrısı kullanılır (ya da çekirdek başlar/init
), çekirdek kaydeder ve hafıza hazırlar , yeni kullanım alanı işleminin o zaman giriş noktası atlar ve halka 3'e CPU anahtarları
Program yasak bir kayıt veya bellek adresine yazmak gibi yaramaz bir şey yapmaya çalışırsa (sayfalama nedeniyle), CPU ayrıca 0 halkasında bazı çekirdek geri arama işleyicisini çağırır.
Ancak kullanıcı alanı yaramaz olduğundan, çekirdek bu sefer işlemi öldürebilir veya bir sinyalle onu uyarabilir.
Çekirdek önyüklendiğinde, belirli aralıklarla kesintiler oluşturan bazı sabit frekanslı bir donanım saati ayarlar.
Bu donanım saati, 0 halkasını çalıştıran kesmeler üretir ve hangi kullanıcı alanındaki işlemlerin uyanacağını programlamasına izin verir.
Bu şekilde, süreçler herhangi bir sistem çağrısı yapmasa bile programlama gerçekleşebilir.
Birden çok yüzüğe sahip olmanın anlamı nedir?
Çekirdek ve kullanıcı alanını ayırmanın iki önemli avantajı vardır:
Onunla nasıl oynanır?
Halkaları doğrudan manipüle etmenin iyi bir yolu olması gereken çıplak metal bir kurulum oluşturdum: https://github.com/cirosantilli/x86-bare-metal-examples
Maalesef bir kullanıcı alanı örneği oluşturacak sabrım yoktu, ancak sayfalama kurulumuna kadar gittim, bu nedenle kullanıcı alanı uygun olmalı. Bir çekme talebi görmeyi çok isterim.
Alternatif olarak, Linux çekirdek modülleri 0 halkasında çalışır, böylece onları ayrıcalıklı işlemleri denemek için kullanabilirsiniz, örneğin kontrol kayıtlarını okuyun: Bir programdan cr0, cr2, cr3 kontrol kayıtlarına nasıl erişilir? Segmentasyon hatası alınıyor
İşte olan uygun QEMU + Buildroot kurulum Barındırıcınıza öldürmeden de denemek.
Çekirdek modüllerinin dezavantajı, diğer kthread'lerin çalışıyor olması ve deneylerinize müdahale edebilmesidir. Ancak teoride, çekirdek modülünüzle tüm kesme işleyicilerini devralabilir ve sistemin sahibi olabilirsiniz, bu aslında ilginç bir proje olurdu.
Negatif halkalar
Negatif halkalara aslında Intel kılavuzunda atıfta bulunulmasa da, aslında 0 halkasının kendisinden daha fazla yeteneklere sahip CPU modları vardır ve bu nedenle "negatif halka" adı için çok uygundur.
Bir örnek, sanallaştırmada kullanılan hiper yönetici modudur.
Daha fazla ayrıntı için bkz .:
KOL
ARM'de halkalar bunun yerine İstisna Düzeyleri olarak adlandırılır, ancak ana fikirler aynı kalır.
ARMv8'de genellikle şu şekilde kullanılan 4 istisna seviyesi vardır:
EL0: kullanıcı alanı
EL1: çekirdek (ARM terminolojisinde "süpervizör").
İle Girilen svc
talimat (Süpervizör Çağrısı), daha önceden bilinen swi
montaj birleşik önce Linux sistem çağrıları yapmak için kullanılan talimat olan. Merhaba dünya ARMv8 örneği:
merhaba.
.text
.global _start
_start:
/* write */
mov x0, 1
ldr x1, =msg
ldr x2, =len
mov x8, 64
svc 0
/* exit */
mov x0, 0
mov x8, 93
svc 0
msg:
.ascii "hello syscall v8\n"
len = . - msg
Ubuntu 16.04'te QEMU ile test edin:
sudo apt-get install qemu-user gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-as -o hello.o hello.S
arm-linux-gnueabihf-ld -o hello hello.o
qemu-arm hello
İşte bir SVC işleyicisini kaydeden ve bir SVC çağrısı yapan somut bir baremetal örnek .
EL2: hipervizörler , örneğin Xen .
hvc
Talimatla girildi (HyperVisor Çağrısı).
Bir işletim sistemi için bir hiper yönetici, kullanıcı alanı için bir işletim sistemi ne demektir.
Örneğin, Xen, Linux veya Windows gibi birden çok işletim sistemini aynı anda aynı sistem üzerinde çalıştırmanıza izin verir ve Linux'un kullanıcı programlarında yaptığı gibi güvenlik ve hata ayıklama kolaylığı için işletim sistemlerini birbirinden izole eder.
Hipervizörler günümüzün bulut altyapısının önemli bir parçasıdır: birden çok sunucunun tek bir donanım üzerinde çalışmasına izin vererek donanım kullanımını her zaman% 100'e yakın tutar ve çok para tasarrufu sağlar.
Örneğin AWS, 2017'de KVM'ye geçişin haber yapılmasına kadar Xen'i kullandı .
EL3: yine başka bir seviye. YAPILACAKLAR örneği.
smc
Talimat ile girildi (Güvenli Mod Çağrısı)
ARMv8 Mimarlık Referans Modeli DDI 0487C.a - Bölüm D1 - AArch64 Sistemi Seviye Programcı Modeli - Şekil D1-1 güzelce bunu göstermektedir:
ARMv8.1 Sanallaştırma Ana Bilgisayar Uzantılarının (VHE) ortaya çıkmasıyla ARM durumu biraz değişti . Bu uzantı, çekirdeğin EL2'de verimli bir şekilde çalışmasını sağlar:
VHE, KVM gibi Linux kernel sanallaştırma çözümlerinin Xen'e göre zemin kazandığı için yaratıldı (bkz. Ör. AWS'nin KVM'ye geçişi), çünkü çoğu istemci yalnızca Linux VM'lere ihtiyaç duyar ve tahmin edebileceğiniz gibi hepsi tek bir KVM, Xen'den daha basit ve potansiyel olarak daha verimli. Yani şimdi ana bilgisayar Linux çekirdeği bu durumlarda hipervizör görevi görüyor.
ARM'ın, belki de geçmişe bakmanın yararından dolayı, ayrıcalık seviyeleri için x86'dan daha iyi bir adlandırma kuralına sahip olduğuna dikkat edin, negatif seviyelere ihtiyaç olmadan: 0 en düşük ve 3 en yüksek. Daha yüksek seviyeler, daha düşük seviyelerden daha sık yaratılma eğilimindedir.
Mevcut EL şu MRS
talimatla sorgulanabilir : mevcut yürütme modu / istisna seviyesi vb. Nedir?
ARM, çip alanını kaydetmek için özelliğe ihtiyaç duymayan uygulamalara izin vermek için tüm istisna seviyelerinin mevcut olmasını gerektirmez. ARMv8 "İstisna seviyeleri" diyor ki:
Bir uygulama tüm İstisna düzeylerini içermeyebilir. Tüm uygulamalar EL0 ve EL1 içermelidir. EL2 ve EL3 isteğe bağlıdır.
Örneğin QEMU, EL1 varsayılanıdır, ancak EL2 ve EL3, komut satırı seçenekleriyle etkinleştirilebilir: qemu-system-aarch64, a53 açılışını taklit ederken el1'e girer
Ubuntu 18.10'da test edilen kod parçacıkları.
in
ve out
3'ü çalmak için mevcut olduğundan TSS, tüm veya belirli bağlantı noktalarına okuma / yazma erişimi veren mevcut görevdeki bir GÇ izin tablosuna işaret edebilir.
Karanlıkta bir bıçak alacağım ve sanırım Windows hakkında konuşuyorsunuz. Özetle, çekirdek modu donanıma tam erişime sahiptir, ancak kullanıcı modu yoktur. Örneğin, çoğu aygıt sürücüsü olmasa da çoğu, donanımlarının daha ince ayrıntılarını kontrol etmeleri gerektiğinden çekirdek modunda yazılır.
Ayrıca bu wiki kitabına bakın .
Diğer cevaplar, kullanıcı ve çekirdek modu arasındaki farkı zaten açıkladı. Gerçekten ayrıntılara girmek istiyorsanız , Mark Russinovich ve David Solomon tarafından çeşitli Windows işletim sistemlerinin mimarisini ve iç detaylarını açıklayan mükemmel bir kitap olan Windows Internals'ın bir kopyasını almalısınız .
Ne
Temelde çekirdek ve kullanıcı modları arasındaki fark işletim sistemine bağlı değildir ve yalnızca bazı komutların donanım tasarımı yoluyla yalnızca çekirdek modunda çalıştırılması kısıtlanarak elde edilir. Bellek koruması gibi diğer tüm amaçlar yalnızca bu kısıtlama ile yapılabilir.
Nasıl
Bu, işlemcinin çekirdek modunda veya kullanıcı modunda yaşadığı anlamına gelir. Bazı mekanizmaları kullanarak mimari, çekirdek moduna her geçtiğinde işletim sistemi kodunun çalıştırılmak üzere getirildiğini garanti edebilir.
Neden
Bu donanım altyapısına sahip olarak, bunlar genel işletim sistemlerinde sağlanabilir: