Çekirdek alanı ile kullanıcı alanı arasındaki fark nedir? Çekirdek alanı, çekirdek konuları, çekirdek işlemleri ve çekirdek yığını aynı anlama mı geliyor? Ayrıca, neden bu farklılaşmaya ihtiyacımız var?
Çekirdek alanı ile kullanıcı alanı arasındaki fark nedir? Çekirdek alanı, çekirdek konuları, çekirdek işlemleri ve çekirdek yığını aynı anlama mı geliyor? Ayrıca, neden bu farklılaşmaya ihtiyacımız var?
Yanıtlar:
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.
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
, write
vb Ayrıca, C
gibi kütüphane fonksiyonları printf
çağrı sistem çağrısı write
sı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.
Ç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.
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:
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.
in
ve gibi GÇ talimatlarını uygulayamaz out
ve 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 0x80
yasyscall
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
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 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 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:
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
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 .
hvc
Talimat 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.
smc
Talimatla 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 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, MRS
talimatla 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.
Ç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.
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.
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_SIZE
bö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_SIZE
2'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.
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 ...
Ç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)
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.
IN in kısa çekirdek alanı, linux çekirdeğinin çalıştığı bellek bölümüdür (linux durumunda en iyi 1 GB sanal alan) ve kullanıcı alanı, kullanıcı uygulamasının çalıştığı bellek kısmıdır (Linux durumunda sanal belleğin alt 3 GB'ı. daha fazla bilmek istiyorum aşağıda verilen bağlantıya bakın :)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
Ç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.
Ç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.
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.
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).
Bellek iki farklı alana ayrılmıştır:
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ı.
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.