İşletim sistemlerinde kullanıcı ve çekirdek modları arasındaki fark nedir?


107

Kullanıcı Modu ile Çekirdek Modu arasındaki farklar nelerdir, ikisini neden ve nasıl etkinleştirirsiniz ve kullanım durumları nelerdir?



1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功 7 yıl önce sorulan bir soru 6 yıl önce sorulan bir soru için mükerrer olarak kapatılamaz. Gerçekten kopyalarsa, kapanış tam tersi olmalıdır.
Salvador Dali

2
@SalvadorDali Merhaba, mevcut fikir birliği "kalite" ile kapatmaktır: meta.stackexchange.com/questions/147643/… "Kalite" ölçülebilir olmadığından, sadece olumlu oylarla gidiyorum. ;-) Muhtemelen, başlıktaki en iyi yeni Google anahtar kelimelerini hangi sorunun bulduğuna bağlıdır. Cevabınızı aşağıda bir sorumluluk reddi beyanı ekleyerek kopyalamanızı ve kapanması durumunda buradan bağlantı kurmanızı tavsiye ederim.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Yanıtlar:


146
  1. Ç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.

  2. 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

Kullanıcı ve Çekirdek Modunu Anlamak


CPU'nun işletim sistemi kodunu ne zaman çalıştırdığını merak ediyorum, işlemci hangi modda?
JackieLam

2
@JackieLam: Kernel modunda olmalı.
kadina

Öyleyse, kendi başına, bir kullanıcı alanı sürecini çalıştırmak için , çekirdek uzayına eşlenmesi gerekir mi?
roottraveller

@rahul Referans belleğin kullanıcı modu ile elde edilebileceğinden veya en basit işleme verilerinin java gibi bir dilde pahalı mod değişikliğine neden olacağından şüpheliyim.
maki XIE

48

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:

  • tüm kullanıcı programlarının yürütüldüğü mod. RAM ve donanıma erişimi yoktur. Bunun nedeni, tüm programların çekirdek modunda çalıştırılması durumunda birbirlerinin belleğinin üzerine yazabilmeleridir. Bu özelliklerden herhangi birine erişmesi gerekiyorsa, temel API'ye bir çağrı yapar. Sistem işlemi dışında Windows tarafından başlatılan her işlem kullanıcı modunda çalışır.

Çekirdek modu:

  • tüm çekirdek programlarının çalıştığı mod (farklı sürücüler). Her kaynağa ve temeldeki donanıma erişimi vardır. Herhangi bir CPU talimatı yürütülebilir ve her bellek adresine erişilebilir. Bu mod, en düşük seviyede çalışan sürücüler için ayrılmıştır.

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

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request


CPU'nun işletim sistemi kodunu ne zaman çalıştırdığını merak ediyorum, işlemci hangi modda?
JackieLam

1
@JackieLam: kernel mode
Apurv Nerlekar

10

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.

Kullanıcı modu ve çekirdek modu arasındaki iletişim


6

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:

  • 0 çekirdek için
  • Kullanıcılar için 3

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 Privlhalkayı 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.

    • inve gibi IO komutlarını yapamaz outve 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 0x80veyasyscall ç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
    

    GitHub yukarı akış .

    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 execsistem ç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:

  • Birinin diğerine müdahale etmeyeceğinden daha emin olduğunuz için program yapmak daha kolaydır. Örneğin, bir kullanıcı alanındaki işlemin, sayfalama nedeniyle başka bir programın belleğinin üzerine yazma konusunda veya donanımı başka bir işlem için geçersiz duruma getirme konusunda endişelenmesi gerekmez.
  • daha güvenlidir. Örneğin, dosya izinleri ve bellek ayırma, bilgisayar korsanlığı uygulamasının banka verilerinizi okumasını engelleyebilir. Bu, tabii ki, çekirdeğe güvendiğinizi varsayar.

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 svctalimat (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
    

    GitHub yukarı akış .

    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 .

    hvcTalimatla 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.

    smcTalimat 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:

görüntü açıklamasını buraya girin

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:

görüntü açıklamasını buraya girin

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 MRStalimatla 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ı.


1
Bu soru herhangi bir işletim sistemine özgü olmadığından inve out3'ü ç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.
Michael Petch

Elbette IOPL bitlerini 3 değerine ayarlarsınız, ardından halka 3 programı tam bağlantı noktası erişimine sahip olur ve TSS IO izinleri uygulanmaz.
Michael Petch

@MichaelPetch teşekkürler, bunu bilmiyordum. Cevabı güncelledim.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

5

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 .


2
Bu, bir programcı olarak sizin için önemlidir, çünkü çekirdek hataları, alışık olabileceğinizden çok daha kötü tahribata yol açma eğilimindedir. Çekirdek / kullanıcı ayrımının bir nedeni, çekirdeğin kritik sistem kaynaklarını izleyebilmesi / kontrol edebilmesi ve her bir kullanıcıyı diğerlerinden koruyabilmesidir. Biraz fazla basitleştirilmiştir, ancak yine de yararlıdır, kendinize kullanıcı hatalarının genellikle can sıkıcı olduğunu, ancak çekirdek hatalarının tüm makineyi çökertme eğiliminde olduğunu hatırlatmak için.
Adam Liss

3

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 .


2

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:

  • Örneğin, programların işletim sisteminin üzerine yazmasına izin vermemek için kullanıcı programlarının belleğin tamamına erişiminin korunması,
  • kullanıcı programlarının, örneğin programların bellek sınırlarını kırmasına izin vermemesi için CPU bellek işaretçi sınırlarını değiştirenler gibi hassas talimatlar gerçekleştirmesini engellemek.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.