Çekirdek alanı ile kullanıcı alanı arasındaki fark nedir?


Yanıtlar:


117

Gerçekten basitleştirilmiş cevap çekirdek çekirdek alanında çalışır olduğunu ise ve normal programlar kullanıcı alanında çalıştırın. Kullanıcı alanı temel olarak bir kum boks şeklidir - kullanıcı programlarını kısıtlar, böylece diğer programların veya işletim sisteminin çekirdeğinin sahip olduğu bellekle (ve diğer kaynaklarla) karışamazlar. Bu, makinenin çökmesi gibi kötü şeyler yapma yeteneklerini sınırlar (ancak genellikle tamamen ortadan kaldırmaz).

Çekirdek, işletim sisteminin çekirdeğidir. Normalde tüm bellek ve makine donanımına (ve makinedeki diğer her şeye) tam erişime sahiptir. Makineyi olabildiğince sabit tutmak için normalde çekirdek modunda / çekirdek alanında yalnızca en güvenilir, iyi test edilmiş kodun çalışmasını istersiniz.

Yığın hafızanın sadece bir parçasıdır, bu yüzden doğal olarak hafızanın geri kalanıyla birlikte ayrılır.


4
Yani benim sistemimde 10 süreç varsa söyle. Her işlemin bir kullanıcı yığını ve bir çekirdek yığınına bölünmüş kendi yığını var mı VEYA tüm işlemler tek bir çekirdek yığınını paylaşıyor mu?
kc3

10
@ kc3: bu en azından kısmen işletim sistemine bağlı, ancak çoğu, çekirdek bir işlem (örneğin, G / Ç) ve en az bir tane daha bir şey yapıldığında kullanılan her işlem için bir çekirdek modu yığını olduğuna inanıyorum. Yalnızca çekirdeğin dahili kullanımı için olan çekirdek yığını (ör. çizelgeleme için).
Jerry Coffin

2
Çekirdek işlemlerin varlığı var mı ve söz konusu sorudaki kullanıcı alanı işlemleriyle ilişkisi veya farklılıkları neler?
Victor Choy

Bu nedenle, bir kullanıcı alanı işlemini çalıştırmak için , çekirdek alanına eşlenmelidir ?
roottraveller

@ roottraveller: Sana bu fikri ne verdiğinden emin değilim, ama hayır, hiç değil. Aynı zamanda, bir kullanıcı uzay süreci olacak normalde, bazıları (az ya da çok gizli) çekirdek uzay hafızaya sahip bu yüzden (örneğin) işlemi, bir kullanıcı uzay yığını ve kullanılan bir çekirdek uzay yığını olacak olduğunda size çekirdek modunda çalışması gereken işletim sistemi çağrıları yapın.
Jerry Coffin

64

Random Access Memory (RAM) mantıksal olarak adlandırılan iki ayrı bölgeye ayrılabilir -. Çekirdek alanı ve kullanıcı alanı ( Fiziksel adresler RAM aslında bölünmüş verilmeyen tek sanal adresler , tüm bu tarafından uygulanan MMU )

Çekirdek, belleğin kendisine hakkı olan kısmında çalışır. Çekirdeğin belleğin tüm bölümlerine erişebilmesi nedeniyle, belleğin bu bölümüne doğrudan normal kullanıcıların işlemleri erişemez. Çekirdeğin bir kısmını erişmek için kullanıcı süreçleri aramalar yani önceden tanımlanmış sistemi kullanmak zorunda open, read, writevb Ayrıca, Cgibi kütüphane fonksiyonları printfçağrı sistem çağrısı writesırayla.

Sistem çağrıları, kullanıcı işlemleri ile çekirdek işlemleri arasında bir arayüz görevi görür. Erişim hakları, kullanıcıların bilerek çekirdeğe karışmasını önlemek için çekirdek alanına yerleştirilir.

Böylece, bir sistem çağrısı meydana geldiğinde, çekirdeğe bir yazılım kesmesi gönderilir. CPU, kontrolü geçici olarak ilgili kesme işleyici rutinine verebilir. Kesme işleyicisi tarafından durdurulan çekirdek işlemi, kesme işleyici yordamı işini tamamladıktan sonra devam eder.


2
Bu cevabın ilk kısmı yanlış. RAM çekirdeğe ve kullanıcı alanına bölünmez. Sanal bellek . Cevabı düzenlemeyi denedim ama düzenleme que günlerce dolu. Lütfen düzelt. Daha fazla bilgi için Varun'un cevabına bakınız.
MeLikeyCode

1
@MeLikeyCode Bu, geniş ölçüde anlaşılabilir bir cevap sağlamaya çalışma bağlamında haklı bir basitleştirme değil mi?
sorunlu memur

2
@problemofficer, bence, büyük bir basitleştirme yanlış bir temel anlayış sağlayabilir. Her biri fiziksel belleğin kullanıcı alanına ve çekirdek alanına bölünmediğini, ancak çekirdeğin sanal belleğin bir çekirdeğini, çekirdek ve kullanıcı alanına bölünüp daha sonra fiziksel bir bellekte eşlendiğini anlamalıdır.
dshil

22

Çekirdek alanı ve sanal alan sanal bellek kavramlarıdır .... Ram (gerçek hafızanız) çekirdeğe ve Kullanıcı alanına ayrılmıştır. Her işleme çekirdek ve kullanıcı alanına bölünmüş sanal bellek verilir.

Yani "Rasgele erişim belleği (RAM) iki ayrı bölgeye ayrılabilir: çekirdek alanı ve kullanıcı alanı." Hata.

& "çekirdek alanı vs kullanıcı alanı" ile ilgili

Bir işlem oluşturulduğunda ve sanal belleği kullanıcı boşluğuna ve kullanıcı boşluğu bölgesinin veri, kod, yığın, yığın yığını ve çekirdek boşluğunun işlem için sayfa tablosu gibi şeyler içerdiği bir çekirdek boşluğuna ayrıldığında Çekirdek alanı kodunu çalıştırmak için, kontrolün çekirdek moduna geçmesi gerekir (sistem çağrıları için 0x80 yazılım kesmesini kullanarak) ve çekirdek yığını temel olarak çekirdek alanında yürütülmekte olan tüm işlemler arasında paylaşılır.


1
Ortak bir işlemin kendi çekirdek alanı ve kullanıcı alanı var mı?
Victor Choy

@VictorChoy, bir işlem iki modda yürütülür: kullanıcı ve çekirdek. Sürecin gördüğü bellek kendisine özgüdür. Ancak çekirdek modunda çalışan (çekirdek kodunu yürüten) her işlem için yalnızca bir boşluk vardır - çekirdek alanı.
dshil

Ayrıca, bir işlem oluşturulduğunda sanal belleğinin 2 bölüme (kullanıcı ve çekirdek) ayrıldığına dikkat edin; burada sanal adreslerin bir kısmı kullanıcı modu için, diğeri çekirdek modu için ayrılmıştır.
dshil

19

CPU halkaları en net ayrımdır

X86 korumalı modda, CPU her zaman 4 halkadan birindedir. Linux çekirdeği yalnızca 0 ve 3 kullanır:

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

Bu, çekirdeğin kullanıcı alanına karşı en zor ve hızlı tanımıdır.

Linux neden 1 ve 2 halkalarını kullanmıyor: CPU Ayrıcalık Halkaları: Neden 1 ve 2 halkaları kullanılmıyor?

Mevcut halka nasıl belirlenir?

Geçerli zil, aşağıdakilerin bir kombinasyonu ile seçilir:

  • genel tanımlayıcı tablosu: GDT girişlerinin bellek içi tablosu ve her girişin bir alanı var Privl zil sesini kodlayan vardır.

    LGDT komutu, adresi geçerli tanımlayıcı tablosuna 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 etkin olduğu anlamına gelir.

Her bir halka ne yapabilir?

CPU çipi fiziksel olarak inşa edilmiştir, böylece:

  • 0 halka her şeyi yapabilir

  • ring 3 birkaç talimat çalıştıramaz ve en fazla özellikle birden fazla kayıt defterine yazamaz:

    • kendi yüzüğünü değiştiremez! Aksi takdirde, kendisini 0 ringe ayarlayabilir ve ringler işe yaramaz.

      Başka bir deyişle, geçerli halkayı belirleyen geçerli segment tanımlayıcısını değiştiremezsiniz .

    • tabloları değiştirilemiyor: x86 disk belleği nasıl çalışır?

      Başka bir deyişle, CR3 yazmacını değiştiremez ve sayfalamanın kendisi sayfa tablolarının değiştirilmesini önler.

      Bu, bir işlemin güvenlik / programlama nedenleriyle diğer işlemlerin belleğini görmesini engeller.

    • kesme işleyicilerini kaydedemiyor. Bunlar, disk belleği ile de engellenen bellek konumlarına yazılarak yapılandırılır.

      İşleyiciler 0 halkasında çalışır ve güvenlik modelini bozar.

      Başka bir deyişle, LGDT ve LIDT talimatlarını kullanamazsınız.

    • inve gibi GÇ talimatlarını uygulayamaz outve bu nedenle isteğe bağlı donanım erişimine sahip olur.

      Aksi takdirde, örneğin, herhangi bir program doğrudan diskten okuyabiliyorsa, dosya izinleri işe yaramaz.

      Daha doğrusu Michael Petch sayesinde : işletim sisteminin aslında halka 3'teki IO talimatlarına izin vermesi mümkündür, bu aslında Görev durumu segmenti tarafından kontrol edilir .

      Mümkün olmayan şey, halka 3'ün, ilk başta olmasaydı, bunu yapmasına izin vermesidir.

      Linux her zaman buna izin vermez. Ayrıca bkz: Linux donanım bağlam anahtarını neden TSS aracılığıyla kullanmıyor?

Programlar ve işletim sistemleri halkalar arasında nasıl geçiş yapar?

  • CPU açıldığında, ilk programı 0 halkasında çalıştırmaya başlar (iyi, ama iyi bir yaklaşımdır). Bu ilk programı çekirdek olarak düşünebilirsiniz (ancak normalde çekirdek hala 0 halkasında çağıran bir önyükleyicidir ).

  • bir kullanıcı alanı işlemi çekirdeğin bir dosyaya yazmak gibi bir şey yapmasını istediğinde, çekirdeği işaret etmek int 0x80yasyscall da işaretlemek için bir kesme oluşturan bir komut kullanır . 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
    

    Yukarı Git .

    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 kullanan somut bir baremetal örneği .

    Bu işleyici, çekirdeğin bu eyleme izin verip vermeyeceğine, işlemi yapıp 3 numaralı halkada kullanıcı programı programını yeniden başlatacağına karar veren 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 defterine veya bellek adresine (sayfalama nedeniyle) yazmak gibi yaramaz bir şey yapmaya çalışırsa, 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 süreci öldürebilir veya bir sinyalle uyarı verebilir.

  • Çekirdek önyükleme yaptığında, belirli aralıklarla kesintiler oluşturan sabit frekanslı bir donanım saati ayarlar.

    Bu donanım saati, 0 halkasını çalıştıran kesintiler üretir ve hangi kullanıcı alanı işlemlerinin uyanacağını zamanlamasına izin verir.

    Bu şekilde, süreçler herhangi bir sistem çağrısı yapmasa bile programlama yapılabilir.

Birden fazla zile sahip olmanın anlamı nedir?

Çekirdeği ve kullanıcı alanını ayırmanın iki büyük avantajı vardır:

  • birinin diğerine müdahale etmeyeceğinden daha emin olduğunuzdan program yapmak daha kolaydır. Örneğin, bir kullanıcı ülkesi işleminin disk belleği nedeniyle başka bir programın belleğinin üzerine yazması veya başka bir işlem için donanımı geçersiz duruma getirmesi konusunda endişelenmesi gerekmez.
  • daha güvenlidir. Örneğin, dosya izinleri ve bellek ayırma, bir saldırı uygulamasının banka verilerinizi okumasını engelleyebilir. Bu tabii ki çekirdeğe güvendiğinizi varsayar.

Bununla nasıl oynanır?

Halkaları doğrudan manipüle etmenin iyi bir yolu olması gereken çıplak bir metal kurulumu oluşturdum: https://github.com/cirosantilli/x86-bare-metal-examples

Ne yazık ki bir kullanıcı örneği yapmak için sabrım yoktu, ama sayfalama kurulumuna kadar gittim, bu yüzden kullanıcı alanı mümkün olmalı. Çekme isteği görmek isterim.

Alternatif olarak, Linux çekirdek modülleri 0 halkasında çalışır, böylece ayrıcalıklı işlemleri denemek için kullanabilirsiniz, örneğin kontrol kayıtlarını okuyun: cr0, cr2, cr3 kontrol kayıtlarına bir programdan nasıl erişilir? Segmentasyon hatası alma

İşte kullanışlı bir QEMU + Buildroot kurulumu ana makinenizi öldürmeden denemek için .

Çekirdek modüllerin dezavantajı, diğer kthreads'nin çalışmakta olması ve denemelerinize müdahale edebilmesidir. Ancak teoride, çekirdek modülünüzle tüm kesme işleyicilerini devralabilir ve sisteme sahip olabilirsiniz, bu aslında ilginç bir proje olacaktır.

Negatif halkalar

Negatif halkalar aslında Intel kılavuzunda referans edilmese de, aslında ring 0'ın kendisinden daha fazla özelliğe sahip CPU modları vardır ve bu nedenle "negatif halka" adı için iyi bir uyum sağlar.

Bir örnek, sanallaştırmada kullanılan hipervizör modudur.

Daha fazla ayrıntı için bakınız:

KOL

ARM'de halkaların yerine İstisna Seviyeleri denir, ancak ana fikirler aynı kalır.

ARMv8'de yaygın olarak kullanılan 4 istisna seviyesi vardır:

  • EL0: kullanıcı alanı

  • EL1: çekirdek (ARM terminolojisinde "süpervizör").

    Linux sistem çağrıları yapmak için kullanılan talimat olan svc, daha swi önce birleşik montajdan önce bilinen talimatla (SuperVisor Call) girildi . Merhaba dünya ARMv8 örneği:

    hello.S

    .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 akış yukarı .

    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 örneği .

  • EL2: hipervizörler , örneğin Xen .

    hvcTalimat ile girilir (HyperVisor Çağrısı).

    Bir hipervizör bir işletim sistemine, işletim sisteminin kullanıcı arazisine ne olduğunu.

    Örneğin, Xen, aynı sistem üzerinde Linux veya Windows gibi birden fazla işletim sistemini aynı anda çalıştırmanıza izin verir ve işletim sistemlerini Linux'un kullanıcı programları için yaptığı gibi güvenlik ve hata ayıklama kolaylığı için birbirinden yalıtır.

    Hipervizörler günümüz bulut altyapısının önemli bir parçasıdır: birden fazla sunucunun tek bir donanımda ç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, KVM'ye taşınmasının haberi verdiği 2017 yılına kadar Xen'i kullandı .

  • EL3: başka bir seviye. YAPILACAKLAR örneği.

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

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

resim açıklamasını buraya girin

VHE, KVM gibi Linux içi çekirdek sanallaştırma çözümlerinin Xen üzerinde temel kazanması nedeniyle oluşturuldu (bkz. Örneğin AWS'nin yukarıda belirtilen KVM'ye taşınması), çünkü çoğu müşterinin yalnızca Linux VM'lerine ihtiyacı vardır ve tahmin edebileceğiniz gibi hepsi tek bir arada KVM, Xen'den daha basit ve potansiyel olarak daha verimlidir. Şimdi ev sahibi Linux çekirdeği bu durumlarda hipervizör olarak hareket ediyor.

Belki de gezinin faydası nedeniyle ARM'nin, negatif seviyelere ihtiyaç duymadan ayrıcalık düzeyleri için x86'dan daha iyi bir adlandırma kuralına sahip olduğunu unutmayın: 0 en düşük ve en yüksek 3'tür. Yüksek seviyeler, düşük seviyelerden daha sık yaratılma eğilimindedir.

Mevcut EL, MRStalimatla sorgulanabilir : geçerli yürütme modu / istisna seviyesi, vb. Nedir?

ARM, yonga 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:

Bir uygulama, İstisna düzeylerinin tümünü içermeyebilir. Tüm uygulamalar EL0 ve EL1'i içermelidir. EL2 ve EL3 isteğe bağlıdır.

Örneğin QEMU varsayılan olarak EL1'dir, ancak EL2 ve EL3 komut satırı seçenekleriyle etkinleştirilebilir: qemu-system-aarch64 a53 açılışını taklit ederken el1 girme

Kod parçacıkları Ubuntu 18.10'da test edildi.


11

Çekirdek alanı ve kullanıcı alanı, ayrıcalıklı işletim sistemi işlevleriyle kısıtlı kullanıcı uygulamalarının ayrılmasıdır. Ayırma, kullanıcı uygulamalarının bilgisayarınızı aramasını önlemek için gereklidir. Herhangi bir eski kullanıcı programı, sabit sürücünüze rasgele veri yazmaya başlayabilir veya başka bir kullanıcı programının bellek alanından bellek okuyabilirse kötü bir şey olurdu.

Kullanıcı alanı programları sistem kaynaklarına doğrudan erişemez, bu nedenle erişim işletim sistemi çekirdeği tarafından program adına işlenir. Kullanıcı alanı programları, genellikle sistem çağrıları aracılığıyla işletim sisteminden bu tür isteklerde bulunur.

Çekirdek iş parçacıkları, süreçler, yığınlar aynı anlama gelmez. Bunlar, kullanıcı alanındaki benzerleri olarak çekirdek alanı için benzer yapılardır.


8

Her işlem, sayfa tabloları aracılığıyla fiziksel belleğe eşlenen kendi 4 GB'lık sanal belleğe sahiptir. Sanal bellek çoğunlukla iki bölüme ayrılır: işlemin kullanımı için 3 GB ve Çekirdek kullanımı için 1 GB. Oluşturduğunuz değişkenlerin çoğu adres alanının ilk bölümünde yer alır. Bu kısma kullanıcı alanı denir. Son bölüm, çekirdeğin bulunduğu ve tüm süreçler için ortak olduğu yerdir. Buna Çekirdek alanı denir ve bu alanın çoğu, çekirdek görüntünün önyükleme zamanında yüklendiği fiziksel belleğin başlangıç ​​konumlarıyla eşlenir.


1
cevabınız Windows'a özgü; bunu açıklığa kavuşturmalısınız.
Matthew

1
4 GB'lık sanal bellekteki her işlem için 1 GB'ın her işlem için aynı olan ve yalnızca haritalama tutan Çekirdek alanı olduğunu söylüyorsunuz .. Nedenini anlayamıyorum !!, neden yalnızca başlangıç ​​konumuna eşleme için 1GB gereklidir?
VISHAL DAGA

5

Maksimum adres alanı boyutu, CPU'daki adres kaydının uzunluğuna bağlıdır.

32 bit adres kayıtlarına sahip sistemlerde, maksimum adres alanı boyutu 32 32 bayt veya 4 GiB'dir. Benzer şekilde, 64 bit sistemlerde, 2 64 bayt adreslenebilir.

Bu adres alanına sanal bellek veya sanal adres alanı denir . Aslında fiziksel RAM boyutu ile ilgili değildir.

Linux platformlarında, sanal adres alanı çekirdek alanına ve kullanıcı alanına bölünür.

Görev boyutu sınırı olarak adlandırılan mimariye özgü bir sabit veya TASK_SIZEbölünmenin gerçekleştiği konumu işaretler:

  • 0 ile TASK_SIZE-1 arasındaki adres aralığı kullanıcı alanına ayrılır;

  • kalan kısım TASK_SIZE2'ye kadar , 32 1 (ya da 2 64 -1) çekirdek alanı tahsis edilmektedir.

Örneğin belirli bir 32 bit sistemde, kullanıcı alanı için 3 GiB ve çekirdek alanı için 1 GiB kullanılabilir.

Unix benzeri bir işletim sistemindeki her uygulama / program bir süreçtir; bunların her birinin İşlem Tanımlayıcı (veya yalnızca İşlem Kimliği , yani PID) adı verilen benzersiz bir tanımlayıcısı vardır . Linux bir süreç oluşturmak için iki mekanizma sağlar: 1. fork()sistem çağrısı veya 2.exec() çağrı.

Bir çekirdek iş parçacığı, hafif bir işlemdir ve aynı zamanda yürütülen bir programdır. Tek bir işlem, aynı veri ve kaynakları paylaşan ancak program kodu üzerinden farklı yollar izleyen birkaç iş parçacığından oluşabilir. Linux clone()iş parçacıkları oluşturmak için bir sistem çağrısı sağlar .

Çekirdek iş parçacıklarının örnek kullanımları şunlardır: RAM'in veri senkronizasyonu, zamanlayıcının işlemleri CPU'lar arasında dağıtmasına vb.


4

Kısaca: Çekirdek Çekirdek Alanı'nda çalışır, çekirdek alanı tüm belleğe ve kaynaklara tam erişime sahiptir, belleğin iki parçaya bölündüğünü söyleyebilirsiniz, çekirdek için bir kısım ve kullanıcının kendi süreci için bir kısım, (kullanıcı alanı) normal programları çalıştırır, kullanıcı alan doğrudan çekirdek alanına erişemez, bu nedenle çekirdekten kaynakları kullanmasını ister. by syscall (glibc'de önceden tanımlanmış sistem çağrısı)

" Kullanıcı Alanı Sadece Çekirdek için bir test yüküdür " ifadesini basitleştiren bir açıklama var ...

Çok açık olmak gerekirse: işlemci mimarisi CPU'nun Çekirdek Modu ve Kullanıcı Modu olmak üzere iki modda çalışmasına izin verir, Donanım talimatı bir moddan diğerine geçişe izin verir.

bellek, kullanıcı alanının veya çekirdek alanının parçası olarak işaretlenebilir.

CPU Kullanıcı Modunda çalışırken, CPU yalnızca kullanıcı alanında bulunan belleğe erişebilirken, cpu Çekirdek alanındaki belleğe erişmeye çalışırken sonuç "donanım istisnası" dır, CPU Çekirdek modunda çalışırken CPU doğrudan erişebilir hem çekirdek alanına hem de kullanıcı alanına ...


2

Çekirdek alanı, bir bellek alanına yalnızca çekirdek tarafından dokunılabileceği anlamına gelir. 32bit linux'da 1G'dir (sanal bellek adresi olarak 0xC0000000'den 0xffffffff'ye kadar). Çekirdek tarafından oluşturulan her işlem aynı zamanda bir çekirdek iş parçacığıdır, Yani bir işlem için iki yığın vardır: bu işlem için kullanıcı alanında bir yığın ve çekirdekte bir yığın çekirdek iş parçacığı için boşluk.

çekirdek yığını 2 sayfayı (32 bit linux'da 8k) işgal etti, bir task_struct (yaklaşık 1k) ve gerçek yığını (yaklaşık 7k) içerir. İkincisi, bazı otomatik değişkenleri veya işlev çağrısı parametrelerini veya işlev adresini çekirdek işlevlerinde saklamak için kullanılır. İşte kod (Processor.h (linux \ include \ asm-i386)):

#define THREAD_SIZE (2*PAGE_SIZE)
#define alloc_task_struct() ((struct task_struct *) __get_free_pages(GFP_KERNEL,1))
#define free_task_struct(p) free_pages((unsigned long) (p), 1)

__get_free_pages (GFP_KERNEL, 1)), 2 ^ 1 = 2 sayfa olarak ayrılan bellek anlamına gelir.

Ancak işlem yığını başka bir şey, adresi sadece 0xC0000000 (32bit linux), boyutu oldukça daha büyük olabilir, kullanıcı alanı işlev çağrıları için kullanılır.

İşte sistem çağrısı için gelen bir soru, çekirdek alanında çalışıyor ancak kullanıcı alanındaki süreç tarafından çağrıldı, nasıl çalışır? Linux parametrelerini ve işlev adresini çekirdek yığınına veya işlem yığınına koyacak mı? Linux'un çözümü: tüm sistem çağrısı INT 0x80 yazılım kesintisi ile tetiklenir. Girişte tanımlanmıştır. S (linux \ arch \ i386 \ kernel), örneğin bazı satırlar:

ENTRY(sys_call_table)
.long SYMBOL_NAME(sys_ni_syscall)   /* 0  -  old "setup()" system call*/
.long SYMBOL_NAME(sys_exit)
.long SYMBOL_NAME(sys_fork)
.long SYMBOL_NAME(sys_read)
.long SYMBOL_NAME(sys_write)
.long SYMBOL_NAME(sys_open)     /* 5 */
.long SYMBOL_NAME(sys_close)

Son soru ortaya koyduğunuz çok iyi. Ama sadece yazılım kesintisi INT 0x80 , ve sonra? Benim için iyi bir açıklama değil. Kendi kendinize ortaya koyduğunuz soru için çözümün nasıl çalıştığını ayrıntılı olarak açıklayabilir misiniz?
Victor Choy

2

By Sunil Yadav, Quora'daki:

Linux Çekirdeği, Çekirdek modunda çalışan ve birkaç farklı katmandan oluşan her şeyi ifade eder. En alt katmanda, çekirdek HAL ile donanım ile etkileşime girer. Orta düzeyde, UNIX Çekirdeği 4 ayrı alana ayrılmıştır. Dört alandan ilki, çiğ ve pişmiş TTY ve terminal elleçleme gibi karakter cihazlarını ele alıyor. İkinci alan ağ aygıt sürücülerini, yönlendirme protokollerini ve soketleri ele alır. Üçüncü alan disk aygıt sürücülerini, sayfa ve arabellek önbelleklerini, dosya sistemini, sanal belleği, dosya adlandırma ve eşlemeyi işler. Dördüncü ve son alan, sinyal dağıtımı kadar proses dağıtımı, çizelgeleme, oluşturma ve sonlandırma işlemlerini de gerçekleştirir. Tüm bunların üzerinde, sistem çağrılarını, kesmeleri ve tuzakları içeren Çekirdeğin üst katmanı var. Bu seviye, daha düşük seviye fonksiyonlarının her birinin arayüzü olarak işlev görür. Bir programcı, işletim sisteminin özellikleriyle etkileşim kurmak için çeşitli sistem çağrılarını ve kesintilerini kullanır.



1

Çok basitleştirilmiş bir açıklama yapmaya çalışmak

Sanal Bellek çekirdek alanına ve kullanıcı alanına ayrılmıştır. Çekirdek alanı, sanal işlemlerin çekirdek işlemlerinin çalışacağı alandır ve kullanıcı alanı, sanal belleklerin kullanıcı işlemlerinin çalışacağı alandır.

Bu bölüm bellek erişimi korumaları için gereklidir.

Bir önyükleyici, bir çekirdeği RAM'deki bir konuma yükledikten sonra başlattığında (tipik olarak ARM tabanlı bir denetleyicide), denetleyicinin FIQ'lar ve IRQ'lar devre dışı bırakıldığında denetleyici modunda olduğundan emin olunması gerekir.


1

Çekirdek Alanı ve Kullanıcı Alanı mantıksal boşluklardır.

Modern işlemcilerin çoğu farklı ayrıcalıklı modda çalışmak üzere tasarlanmıştır. x86 makineleri 4 farklı ayrıcalıklı modda çalışabilir. resim açıklamasını buraya girin

Ayrıca, belirli bir ayrıcalıklı modda / üstünde olduğunda belirli bir makine talimatı yürütülebilir.

Bu tasarım nedeniyle, bir sistem koruması veya yürütme ortamını kumlama olarak kullanıyorsunuz.

Çekirdek, donanımınızı yöneten ve sistem soyutlamasını sağlayan bir kod parçasıdır. Bu nedenle, tüm makine talimatları için erişime sahip olması gerekir. Ve en güvenilir yazılım parçasıdır. Bu yüzden en yüksek ayrıcalıkla idam edilmeliyim. Ve Zil seviyesi 0 en ayrıcalıklı moddur. Bu nedenle Zil Seviyesi 0 , Çekirdek Modu olarak da adlandırılır .

Kullanıcı Uygulaması, herhangi bir üçüncü taraf satıcıdan gelen bir yazılım parçasıdır ve onlara tamamen güvenemezsiniz. Kötü niyetli olan biri, tüm makine yönergelerine tam erişime sahipse sisteminizi çökertmek için bir kod yazabilir. Bu nedenle, uygulamaya sınırlı talimat setine erişim sağlanmalıdır. Ve Zil Seviyesi 3 en az ayrıcalıklı moddur. Böylece tüm uygulamanız bu modda çalışır. Bu nedenle Zil Seviyesi 3'e Kullanıcı Modu da denir .

Not: Zil Seviyesi 1 ve 2 almıyorum. Temelde orta ayrıcalıklara sahip modlardır. Yani aygıt sürücüsü kodu bu ayrıcalık ile yürütülmüş olabilir. AFAIK, linux çekirdek kodu yürütme ve kullanıcı uygulaması için sırasıyla yalnızca Zil Seviyesi 0 ve 3'ü kullanır.

Böylece çekirdek modunda gerçekleşen herhangi bir işlem çekirdek alanı olarak kabul edilebilir. Kullanıcı modunda gerçekleşen herhangi bir işlem kullanıcı alanı olarak kabul edilebilir.


0

Doğru cevap: Çekirdek alanı ve kullanıcı alanı diye bir şey yoktur. İşlemci yönerge kümesinin, sayfa tablosu haritasının kökü gibi yıkıcı şeyleri ayarlamak veya donanım aygıtı belleğine erişmek gibi özel izinleri vardır.

Çekirdek kodu en üst düzey ayrıcalıklara, kullanıcı kodu ise en düşük ayrıcalıklara sahiptir. Bu, kullanıcı kodunun sistemi kilitlemesini, diğer programları değiştirmesini vb. Engeller.

Genel olarak çekirdek kodu, kullanıcı kodundan farklı bir bellek haritası altında tutulur (tıpkı kullanıcı alanları birbirinden farklı bellek haritalarında tutulduğu gibi). "Çekirdek alanı" ve "kullanıcı alanı" terimleri buradan gelir. Ancak bu zor ve hızlı bir kural değildir. Örneğin, x86 dolaylı olarak kesme / tuzak işleyicilerinin her zaman eşlenmesini gerektirdiğinden, çekirdeğin bir kısmı (veya bazı işletim sistemlerinin tümü) kullanıcı alanına eşlenmelidir. Yine, bu böyle bir kodun kullanıcı ayrıcalıklarına sahip olduğu anlamına gelmez.

Çekirdek / kullanıcı bölünmesi neden gereklidir? Bazı tasarımcılar aslında gerekli olduğunu kabul etmiyorlar. Mikro çekirdek mimarisi, kodun en yüksek ayrıcalıklı bölümlerinin olabildiğince küçük olması ve kullanıcı ayrıcalıklı kodunda yapılan tüm önemli işlemlerin yapılması fikrine dayanır. Bunun neden iyi bir fikir olabileceğini araştırmanız gerekir, basit bir kavram değildir (ve hem avantajları hem de dezavantajları ile ünlüdür).


0

Bellek iki farklı alana ayrılmıştır:

  • Kullanıcı alanı, normal kullanıcı işlemlerinin çalıştığı konumlar kümesidir (yani çekirdek dışındaki her şey). Çekirdeğin rolü, bu alanda çalışan uygulamaları birbiriyle ve makineyle uğraşmaktan yönetmektir.
  • Çekirdek kodunun saklandığı ve altında çalıştırıldığı konum olan çekirdek alanı.

Kullanıcı alanı altında çalışan işlemler belleğin sadece sınırlı bir bölümüne erişirken, çekirdek tüm belleğe erişime sahiptir. Kullanıcı alanında çalışan işlemlerin çekirdek alanına da erişimi yoktur. Kullanıcı alanı işlemleri, çekirdeğin açığa çıkardığı bir arabirim aracılığıyla çekirdeğin yalnızca küçük bir bölümüne erişebilir - sistem çağrıları. işleyici bittikten sonra çalışması.


-7

Linux'ta 1. boşluk iki alan, diğeri ise çekirdek boşluk. kullanıcı alanı sadece çalıştırmak istediğiniz kullanıcı uygulamasından oluşur. çekirdek hizmeti olarak süreç yönetimi, dosya yönetimi, sinyal işleme, bellek yönetimi, iş parçacığı yönetimi ve orada birçok hizmet var. u uygulama uygulama sadece çekirdek hizmet ile etkileşim kullanıcı alanından çalıştırın. ve bu hizmet, donanım ve çekirdek arasında bulunan aygıt sürücüsü ile etkileşim halindedir. çekirdek alanı ve kullanıcı alanı ayırmanın temel faydası, kullanıcı alanında bulunan tüm kullanıcı uygulamalarının virus.bcaz tarafından bir güvenlik sağlayabilmemiz ve çekirdek alanında hizmetin mevcut olmasıdır. bu yüzden linux etkilemez, t virüsünden etkilenmez.


5
"Çekirdek" değil "çekirdek" olmasının yanı sıra cevabınız tamamen doğru değil. Modern virüsler (ve modern ile Windows 98'den sonra her şeyi kastediyorum) "çekirdek servisi" ile etkileşime girmez, her şey kullanıcı alanı içinde yapılır. Linux'un çok fazla virüsü olmadığı (tabii ki Linux için virüsler olduğu) oldukça iyi bir izin yönetimine sahip olması ve - en önemlisi - en Linux kullanıcıları bunlar değil: "omaigosh JustinBieber.NewSong.exe! Ben duymak gerekir NAO !!! 1111 "kullanıcıları tıklayın ve herhangi bir ipucu olmadan her şeyi yükleyin.
alexclooze

3
Ayrıca, Linux Windows kadar fazla kullanılmaz - virüs yazmak, virüs yazarlarının ulaşmak istediği kadar zarar vermez. Kullanıcı alanı uygulamaları çekirdek hizmeti ile iletişim kurmaz, çekirdek tarafından sağlanan sistem çağrıları adı verilen özel işlevleri çağırır.
alexclooze
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.