Apa perbedaan antara ruang kernel dan ruang pengguna? Apakah ruang kernel, utas kernel, proses kernel, dan tumpukan kernel memiliki arti yang sama? Juga, mengapa kita perlu diferensiasi ini?
Apa perbedaan antara ruang kernel dan ruang pengguna? Apakah ruang kernel, utas kernel, proses kernel, dan tumpukan kernel memiliki arti yang sama? Juga, mengapa kita perlu diferensiasi ini?
Jawaban:
Jawaban yang benar - benar disederhanakan adalah bahwa kernel berjalan di ruang kernel, dan program normal berjalan di ruang pengguna. Ruang pengguna pada dasarnya adalah bentuk kotak pasir - ruang ini membatasi program pengguna sehingga mereka tidak dapat mengacaukan memori (dan sumber daya lainnya) yang dimiliki oleh program lain atau oleh kernel OS. Ini membatasi (tetapi biasanya tidak sepenuhnya menghilangkan) kemampuan mereka untuk melakukan hal-hal buruk seperti menabrak mesin.
Kernel adalah inti dari sistem operasi. Biasanya memiliki akses penuh ke semua memori dan perangkat keras mesin (dan segala sesuatu yang lain pada mesin). Untuk menjaga agar mesin tetap stabil, Anda biasanya hanya menginginkan kode yang paling tepercaya dan teruji untuk dijalankan dalam mode kernel / ruang kernel.
Tumpukan hanyalah bagian lain dari memori, jadi tentu saja itu terpisah tepat bersama dengan sisa memori.
The Random Access Memory (RAM) dapat secara logis dibagi menjadi dua wilayah yang berbeda yaitu -. Ruang kernel dan ruang pengguna ( The Alamat Fisik RAM tidak benar-benar dibagi hanya Alamat Virtual , semua ini dilaksanakan oleh MMU )
Kernel berjalan di bagian memori yang berhak atasnya. Bagian memori ini tidak dapat diakses secara langsung oleh proses pengguna normal, sementara karena kernel dapat mengakses semua bagian memori. Untuk mengakses beberapa bagian dari kernel, proses pengguna harus menggunakan sistem yang telah ditetapkan panggilan yaitu open
, read
, write
dll Juga, C
fungsi perpustakaan seperti printf
panggilan system call write
pada gilirannya.
Panggilan sistem bertindak sebagai antarmuka antara proses pengguna dan proses kernel. Hak akses ditempatkan pada ruang kernel untuk menghentikan pengguna dari mengacaukan kernel, tanpa sadar.
Jadi, ketika panggilan sistem terjadi, interupsi perangkat lunak dikirim ke kernel. CPU dapat menyerahkan kontrol sementara untuk rutin interrupt handler yang terkait. Proses kernel yang dihentikan oleh interrupt dilanjutkan setelah rutin interrupt handler menyelesaikan tugasnya.
Ruang kernel & ruang virtual adalah konsep memori virtual .... itu tidak berarti Ram (memori Anda yang sebenarnya) dibagi menjadi ruang kernel & Pengguna. Setiap proses diberikan memori virtual yang dibagi menjadi ruang kernel & pengguna.
Jadi mengatakan "Memori akses acak (RAM) dapat dibagi menjadi dua wilayah yang berbeda yaitu - ruang kernel dan ruang pengguna." salah.
& tentang hal "ruang kernel vs ruang pengguna"
Ketika sebuah proses dibuat dan memori virtualnya dibagi menjadi ruang-pengguna dan ruang-kernel, di mana wilayah ruang pengguna berisi data, kode, tumpukan, tumpukan proses & ruang-kernel berisi hal-hal seperti tabel halaman untuk proses , struktur data kernel, dan kode kernel, dll. Untuk menjalankan kode spasi kernel, kontrol harus beralih ke mode kernel (menggunakan interupsi perangkat lunak 0x80 untuk panggilan sistem) & tumpukan kernel pada dasarnya dibagi di antara semua proses yang saat ini dijalankan dalam ruang kernel.
Cincin CPU adalah perbedaan yang paling jelas
Dalam mode terproteksi x86, CPU selalu berada dalam salah satu dari 4 dering. Kernel Linux hanya menggunakan 0 dan 3:
Ini adalah definisi kernel vs userland yang paling keras dan cepat.
Mengapa Linux tidak menggunakan dering 1 dan 2: CPU Privilege Rings: Mengapa cincin 1 dan 2 tidak digunakan?
Bagaimana cincin saat ini ditentukan?
Cincin saat ini dipilih oleh kombinasi dari:
global deskriptor table: tabel in-memory dari entri GDT, dan setiap entri memiliki bidang Privl
yang menyandikan ring.
Instruksi LGDT mengatur alamat ke tabel deskriptor saat ini.
Lihat juga: http://wiki.osdev.org/Global_Descriptor_Table
segmen mendaftar CS, DS, dll., yang mengarah ke indeks entri di GDT.
Misalnya, CS = 0
berarti entri pertama GDT saat ini aktif untuk kode pelaksana.
Apa yang bisa dilakukan oleh setiap dering?
Chip CPU dibangun secara fisik sehingga:
dering 0 dapat melakukan apa saja
dering 3 tidak dapat menjalankan beberapa instruksi dan menulis ke beberapa register, terutama:
tidak dapat mengubah cincinnya sendiri! Kalau tidak, itu bisa mengatur dirinya sendiri untuk berdering 0 dan berdering tidak akan berguna.
Dengan kata lain, tidak dapat memodifikasi deskriptor segmen saat ini , yang menentukan dering saat ini.
tidak dapat memodifikasi tabel halaman: Bagaimana cara kerja paging x86?
Dengan kata lain, tidak dapat memodifikasi register CR3, dan paging itu sendiri mencegah modifikasi tabel halaman.
Ini mencegah satu proses dari melihat memori proses lain untuk keamanan / kemudahan alasan pemrograman.
tidak dapat mendaftarkan penangan interupsi. Itu dikonfigurasikan dengan menulis ke lokasi memori, yang juga dicegah dengan paging.
Handler dijalankan di ring 0, dan akan merusak model keamanan.
Dengan kata lain, tidak dapat menggunakan instruksi LGDT dan LIDT.
tidak dapat melakukan instruksi IO seperti in
dan out
, dan karenanya memiliki akses perangkat keras yang sewenang-wenang.
Kalau tidak, misalnya, izin file tidak akan berguna jika program apa pun dapat langsung membaca dari disk.
Lebih tepatnya berkat Michael Petch : sebenarnya dimungkinkan bagi OS untuk mengizinkan instruksi IO pada cincin 3, ini sebenarnya dikendalikan oleh segmen status Tugas .
Yang tidak mungkin adalah cincin 3 memberi izin pada dirinya sendiri jika tidak memilikinya sejak awal.
Linux selalu melarangnya. Lihat juga: Mengapa Linux tidak menggunakan konteks perangkat keras untuk beralih melalui TSS?
Bagaimana transisi program dan sistem operasi antar cincin?
ketika CPU dihidupkan, itu mulai menjalankan program awal di ring 0 (baik, tapi itu perkiraan yang baik). Anda dapat menganggap program awal ini sebagai kernel (tetapi biasanya bootloader yang kemudian memanggil kernel masih di ring 0 ).
ketika proses userland menginginkan kernel untuk melakukan sesuatu untuknya seperti menulis ke file, ia menggunakan instruksi yang menghasilkan interupsi seperti int 0x80
atausyscall
untuk memberi sinyal kernel. x86-64 Linux syscall hello world contoh:
.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
kompilasi dan jalankan:
as -o hello_world.o hello_world.S
ld -o hello_world.out hello_world.o
./hello_world.out
Ketika ini terjadi, CPU memanggil penangan panggilan interupsi yang didaftarkan kernel saat boot. Berikut ini adalah contoh baremetal konkret yang mendaftarkan pawang dan menggunakannya .
Handler ini berjalan di ring 0, yang memutuskan apakah kernel akan mengizinkan tindakan ini, melakukan tindakan, dan memulai kembali program userland di cincin 3. x86_64
ketika exec
panggilan sistem digunakan (atau ketika kernel akan mulai/init
), kernel menyiapkan register dan memori dari proses userland baru, kemudian melompat ke titik masuk dan mengalihkan CPU ke dering 3
Jika program mencoba melakukan sesuatu yang nakal seperti menulis ke register terlarang atau alamat memori (karena paging), CPU juga memanggil beberapa penangan panggilan balik kernel di ring 0.
Tetapi karena userland nakal, kernel mungkin membunuh proses kali ini, atau memberinya peringatan dengan sinyal.
Ketika kernel melakukan boot, ia akan mengatur jam perangkat keras dengan frekuensi tetap, yang menghasilkan gangguan secara berkala.
Jam perangkat keras ini menghasilkan interupsi yang menjalankan dering 0, dan memungkinkannya untuk menjadwalkan pengguna mana proses untuk bangun.
Dengan cara ini, penjadwalan dapat terjadi bahkan jika proses tidak membuat panggilan sistem apa pun.
Apa gunanya memiliki beberapa dering?
Ada dua keuntungan utama memisahkan kernel dan userland:
Bagaimana cara bermain-main dengannya?
Saya telah membuat pengaturan logam kosong yang seharusnya menjadi cara yang baik untuk memanipulasi cincin secara langsung: https://github.com/cirosantilli/x86-bare-metal-examples
Saya tidak memiliki kesabaran untuk membuat contoh userland sayangnya, tapi saya melakukan pengaturan paging, jadi userland harus layak. Saya ingin melihat permintaan tarik.
Atau, modul kernel Linux berjalan di ring 0, sehingga Anda dapat menggunakannya untuk mencoba operasi istimewa, misalnya membaca register kontrol: Bagaimana cara mengakses register kontrol cr0, cr2, cr3 dari suatu program? Mendapatkan kesalahan segmentasi
Berikut ini adalah pengaturan QEMU + Buildroot yang nyaman untuk mencobanya tanpa membunuh host Anda.
Kelemahan dari modul kernel adalah bahwa kthreads lain sedang berjalan dan dapat mengganggu percobaan Anda. Tetapi secara teori Anda dapat mengambil alih semua penangan interupsi dengan modul kernel Anda dan memiliki sistem, yang sebenarnya merupakan proyek yang menarik.
Dering negatif
Sementara dering negatif tidak benar-benar dirujuk dalam manual Intel, sebenarnya ada mode CPU yang memiliki kemampuan lebih lanjut dari dering 0 itu sendiri, dan begitu juga cocok untuk nama "cincin negatif".
Salah satu contoh adalah mode hypervisor yang digunakan dalam virtualisasi.
Untuk perincian lebih lanjut, lihat:
LENGAN
Di ARM, cincinnya disebut Tingkat Pengecualian, tetapi gagasan utama tetap sama.
Ada 4 level pengecualian di ARMv8, yang biasa digunakan sebagai:
EL0: userland
EL1: kernel ("supervisor" dalam terminologi ARM).
Dimasukkan dengan svc
instruksi (Panggilan SuperVisor), yang sebelumnya dikenal sebagai swi
unified assembly , yang merupakan instruksi yang digunakan untuk melakukan panggilan sistem Linux. Contoh Hello world ARMv8:
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
Uji dengan QEMU di Ubuntu 16.04:
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
Berikut ini adalah contoh nyata beton yang mendaftarkan penangan SVC dan melakukan panggilan SVC .
EL2: hypervisors , misalnya Xen .
Dimasukkan dengan hvc
instruksi (Panggilan HyperVisor).
Hypervisor adalah untuk OS, apa OS untuk userland.
Sebagai contoh, Xen memungkinkan Anda untuk menjalankan beberapa OS seperti Linux atau Windows pada sistem yang sama secara bersamaan, dan itu mengisolasi OS satu sama lain untuk keamanan dan kemudahan debug, seperti halnya Linux untuk program-program userland.
Hypervisor adalah bagian penting dari infrastruktur cloud saat ini: mereka memungkinkan banyak server berjalan pada satu perangkat keras, menjaga penggunaan perangkat keras selalu mendekati 100% dan menghemat banyak uang.
AWS misalnya menggunakan Xen hingga 2017 ketika kepindahannya ke KVM menjadi berita .
EL3: tingkat lain. Contoh TODO.
Dimasukkan dengan smc
instruksi (Panggilan Mode Aman)
The ARMv8 Referensi Arsitektur Model DDI 0487C.a - Bab D1 - The AArch64 Sistem Tingkat Programmer Model - Gambar D1-1 menggambarkan ini indah:
Situasi ARM berubah sedikit dengan munculnya ARMv8.1 Virtualization Host Extensions (VHE) . Ekstensi ini memungkinkan kernel untuk berjalan di EL2 secara efisien:
VHE dibuat karena solusi virtualisasi di-Linux-kernel seperti KVM telah menjadi lebih baik daripada Xen (lihat misalnya perpindahan AWS ke KVM yang disebutkan di atas), karena sebagian besar klien hanya memerlukan VM Linux, dan seperti yang dapat Anda bayangkan, semuanya dalam satu proyek, KVM lebih sederhana dan berpotensi lebih efisien daripada Xen. Jadi sekarang kernel Linux host bertindak sebagai hypervisor dalam kasus-kasus itu.
Perhatikan bagaimana ARM, mungkin karena manfaat dari belakang, memiliki konvensi penamaan yang lebih baik untuk tingkat hak istimewa daripada x86, tanpa perlu tingkat negatif: 0 menjadi yang lebih rendah dan 3 tertinggi. Level yang lebih tinggi cenderung dibuat lebih sering daripada level yang lebih rendah.
EL saat ini dapat ditanyakan dengan MRS
instruksi: apa mode eksekusi / tingkat pengecualian saat ini, dll?
ARM tidak memerlukan semua level pengecualian untuk hadir untuk memungkinkan implementasi yang tidak memerlukan fitur untuk menghemat area chip. ARMv8 "Level pengecualian" mengatakan:
Suatu implementasi mungkin tidak mencakup semua level Pengecualian. Semua implementasi harus menyertakan EL0 dan EL1. EL2 dan EL3 adalah opsional.
QEMU misalnya, default ke EL1, tetapi EL2 dan EL3 dapat diaktifkan dengan opsi baris perintah: qemu-system-aarch64 memasukkan el1 saat mengemulasi a53 power up
Cuplikan kode diuji di Ubuntu 18.10.
Ruang kernel dan ruang pengguna adalah pemisahan fungsi sistem operasi istimewa dan aplikasi pengguna terbatas. Pemisahan ini diperlukan untuk mencegah aplikasi pengguna menggeledah komputer Anda. Ini akan menjadi hal yang buruk jika program pengguna lama dapat mulai menulis data acak ke hard drive Anda atau membaca memori dari ruang memori program pengguna lain.
Program ruang pengguna tidak dapat mengakses sumber daya sistem secara langsung sehingga akses ditangani atas nama program oleh kernel sistem operasi. Program ruang pengguna biasanya membuat permintaan seperti sistem operasi melalui panggilan sistem.
Utas kernel, proses, tumpukan tidak berarti hal yang sama. Mereka adalah konstruksi analog untuk ruang kernel sebagai rekan mereka di ruang pengguna.
Setiap proses memiliki memori virtual 4GB sendiri yang memetakan ke memori fisik melalui tabel halaman. Memori virtual sebagian besar dibagi menjadi dua bagian: 3 GB untuk penggunaan proses dan 1 GB untuk penggunaan Kernel. Sebagian besar variabel yang Anda buat terletak di bagian pertama dari ruang alamat. Bagian itu disebut ruang pengguna. Bagian terakhir adalah tempat kernel berada dan umum untuk semua proses. Ini disebut ruang Kernel dan sebagian besar ruang ini dipetakan ke lokasi awal memori fisik di mana gambar kernel dimuat saat boot.
Ukuran maksimum ruang alamat tergantung pada panjang register alamat pada CPU.
Pada sistem dengan register alamat 32-bit, ukuran ruang alamat maksimum adalah 2 32 byte, atau 4 GiB. Demikian pula, pada sistem 64-bit, 2 64 byte dapat diatasi.
Ruang alamat seperti ini disebut memori virtual atau ruang alamat virtual . Ini sebenarnya tidak terkait dengan ukuran RAM fisik.
Pada platform Linux, ruang alamat virtual dibagi menjadi ruang kernel dan ruang pengguna.
Konstanta khusus ukuran batas tugas yang disebut arsitektur , atau TASK_SIZE
, menandai posisi tempat perpecahan terjadi:
rentang alamat dari 0 hingga TASK_SIZE
-1 dialokasikan untuk ruang pengguna;
sisanya dari TASK_SIZE
hingga 2 32 -1 (atau 2 64 -1) dialokasikan untuk ruang kernel.
Pada sistem 32-bit tertentu misalnya, 3 GiB dapat digunakan untuk ruang pengguna dan 1 GiB untuk ruang kernel.
Setiap aplikasi / program dalam sistem operasi mirip Unix adalah suatu proses; masing-masing memiliki pengenal unik yang disebut Process Identifier (atau hanya Process ID , yaitu PID). Linux menyediakan dua mekanisme untuk menciptakan proses: 1. fork()
panggilan sistem, atau 2. exec()
panggilan.
Utas kernel adalah proses yang ringan dan juga program yang sedang dijalankan. Suatu proses tunggal dapat terdiri dari beberapa utas yang berbagi data dan sumber daya yang sama tetapi mengambil jalur yang berbeda melalui kode program. Linux menyediakan clone()
panggilan sistem untuk menghasilkan utas.
Contoh penggunaan utas kernel adalah: sinkronisasi data RAM, membantu penjadwal untuk mendistribusikan proses di antara CPU, dll.
Secara singkat: Kernel berjalan di Ruang Kernel, ruang kernel memiliki akses penuh ke semua memori dan sumber daya, Anda dapat mengatakan memori dibagi menjadi dua bagian, bagian untuk kernel, dan bagian untuk proses milik pengguna, (ruang pengguna) menjalankan program normal, pengguna ruang tidak dapat mengakses langsung ke ruang kernel sehingga meminta dari kernel untuk menggunakan sumber daya. oleh syscall (panggilan sistem yang telah ditentukan di glibc)
ada pernyataan yang menyederhanakan perbedaan " User Space is Just a load test for the Kernel " ...
Agar sangat jelas: arsitektur prosesor memungkinkan CPU beroperasi dalam dua mode, Mode Kernel dan Mode Pengguna , instruksi Perangkat Keras memungkinkan peralihan dari satu mode ke mode lainnya.
memori dapat ditandai sebagai bagian dari ruang pengguna atau ruang kernel.
Saat CPU berjalan dalam Mode Pengguna, CPU hanya dapat mengakses memori yang berada di ruang pengguna, sementara CPU mencoba mengakses memori di ruang Kernel hasilnya adalah "pengecualian perangkat keras", ketika CPU berjalan dalam mode Kernel, CPU dapat mengakses secara langsung ke ruang kernel dan ruang pengguna ...
Ruang kernel berarti ruang memori hanya dapat disentuh oleh kernel. Pada Linux 32bit, ini adalah 1G (dari 0xC0000000 ke 0xffffffff sebagai alamat memori virtual). Setiap proses yang dibuat oleh kernel juga merupakan utas kernel, Jadi untuk satu proses, ada dua tumpukan: satu tumpukan di ruang pengguna untuk proses ini dan satu lagi di kernel ruang untuk utas kernel.
tumpukan kernel ditempati 2 halaman (8k dalam 32bit linux), termasuk task_struct (sekitar 1k) dan tumpukan nyata (sekitar 7k). Yang terakhir digunakan untuk menyimpan beberapa variabel otomatis atau params panggilan fungsi atau alamat fungsi dalam fungsi kernel. Berikut adalah kode (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)) berarti mengalokasikan memori sebagai 2 ^ 1 = 2 halaman.
Tapi proses stack adalah hal lain, alamatnya hanya di bawah 0xC0000000 (linux 32-bit), ukurannya bisa lebih besar, digunakan untuk panggilan fungsi ruang pengguna.
Jadi di sini ada pertanyaan untuk panggilan sistem, itu berjalan di ruang kernel tetapi dipanggil oleh proses di ruang pengguna, bagaimana cara kerjanya? Apakah linux akan meletakkan params dan alamat fungsinya di tumpukan kernel atau proses tumpukan? Solusi Linux: semua panggilan sistem dipicu oleh gangguan perangkat lunak INT 0x80. Didefinisikan dalam entri.S (linux \ arch \ i386 \ kernel), berikut adalah beberapa baris misalnya:
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)
Kernel Linux mengacu pada semua yang berjalan dalam mode Kernel dan terdiri dari beberapa lapisan berbeda. Pada lapisan terendah, Kernel berinteraksi dengan perangkat keras melalui HAL. Di tingkat menengah, Kernel UNIX dibagi menjadi 4 area berbeda. Yang pertama dari empat area menangani perangkat karakter, TTY mentah dan matang dan penanganan terminal. Area kedua menangani driver perangkat jaringan, protokol routing, dan soket. Area ketiga menangani driver perangkat disk, cache halaman dan buffer, sistem file, memori virtual, penamaan dan pemetaan file. Area keempat dan terakhir menangani proses pengiriman, penjadwalan, pembuatan dan pemutusan serta penanganan sinyal. Di atas semua ini kita memiliki lapisan atas Kernel yang mencakup panggilan sistem, interupsi dan jebakan. Level ini berfungsi sebagai antarmuka untuk masing-masing fungsi level bawah. Seorang programmer menggunakan berbagai panggilan sistem dan interupsi untuk berinteraksi dengan fitur-fitur sistem operasi.
DALAM ruang kernel pendek adalah bagian dari memori tempat menjalankan kernel Linux (ruang virtual 1 GB atas kasus linux) dan ruang pengguna adalah porsi memori tempat aplikasi pengguna berjalan (memori virtual bawah 3 GB dalam kasus Linux. Jika Anda ingin tahu lebih banyak lihat tautan yang diberikan di bawah ini :)
http://learnlinuxconcepts.blogspot.in/2014/02/kernel-space-and-user-space.html
Mencoba memberikan penjelasan yang sangat sederhana
Memori Virtual dibagi menjadi ruang kernel dan ruang pengguna. Ruang kernel adalah area memori virtual tempat proses kernel akan berjalan dan ruang pengguna adalah area memori virtual tempat proses pengguna akan berjalan.
Divisi ini diperlukan untuk perlindungan akses memori.
Setiap kali bootloader memulai kernel setelah memuatnya ke lokasi di RAM, (pada pengontrol berbasis ARM) ia perlu memastikan bahwa pengontrol dalam mode pengawas dengan FIQ dan IRQ dinonaktifkan.
Ruang Kernel dan Ruang Pengguna adalah ruang logis.
Sebagian besar prosesor modern dirancang untuk berjalan dalam mode istimewa yang berbeda. mesin x86 dapat berjalan dalam 4 mode istimewa yang berbeda.
Dan instruksi mesin tertentu dapat dieksekusi ketika dalam / di atas mode istimewa tertentu.
Karena desain ini Anda memberikan perlindungan sistem atau kotak pasir lingkungan eksekusi.
Kernel adalah bagian dari kode, yang mengelola perangkat keras Anda dan menyediakan abstraksi sistem. Jadi itu perlu memiliki akses untuk semua instruksi mesin. Dan itu adalah perangkat lunak yang paling tepercaya. Jadi saya harus dieksekusi dengan hak istimewa tertinggi. Dan Dering level 0 adalah mode yang paling istimewa. Jadi Ring Level 0 juga disebut sebagai Mode Kernel .
Aplikasi Pengguna adalah perangkat lunak yang berasal dari vendor pihak ketiga mana pun, dan Anda tidak dapat sepenuhnya mempercayai mereka. Seseorang dengan niat jahat dapat menulis kode untuk merusak sistem Anda jika ia memiliki akses penuh ke semua instruksi mesin. Jadi aplikasi harus diberikan akses ke set instruksi terbatas. Dan Ring Level 3 adalah mode yang paling istimewa. Jadi semua aplikasi Anda berjalan dalam mode itu. Karenanya Ring Level 3 juga disebut Mode Pengguna .
Catatan: Saya tidak mendapatkan Ring Level 1 dan 2. Mereka pada dasarnya adalah mode dengan hak menengah. Jadi, mungkin kode driver perangkat dijalankan dengan hak istimewa ini. AFAIK, linux hanya menggunakan Ring Level 0 dan 3 masing-masing untuk eksekusi kode kernel dan aplikasi pengguna.
Jadi setiap operasi yang terjadi dalam mode kernel dapat dianggap sebagai ruang kernel. Dan setiap operasi yang terjadi dalam mode pengguna dapat dianggap sebagai ruang pengguna.
Jawaban yang benar adalah: Tidak ada ruang kernel dan ruang pengguna. Set instruksi prosesor memiliki izin khusus untuk mengatur hal-hal yang merusak seperti akar peta tabel halaman, atau mengakses memori perangkat keras, dll.
Kode kernel memiliki hak istimewa level tertinggi, dan kode pengguna terendah. Ini mencegah kode pengguna menabrak sistem, memodifikasi program lain, dll.
Umumnya kode kernel disimpan di bawah peta memori yang berbeda dari kode pengguna (sama seperti ruang pengguna disimpan dalam peta memori yang berbeda satu sama lain). Di sinilah istilah "ruang kernel" dan "ruang pengguna" berasal. Tapi itu bukan aturan yang keras dan cepat. Sebagai contoh, karena x86 secara tidak langsung mengharuskan interrupt / trap handlernya dipetakan setiap saat, sebagian (atau sebagian OS semua) dari kernel harus dipetakan ke dalam ruang pengguna. Sekali lagi, ini tidak berarti bahwa kode tersebut memiliki hak pengguna.
Mengapa pembagian kernel / pengguna diperlukan? Beberapa desainer tidak setuju bahwa itu memang perlu. Arsitektur mikrokernel didasarkan pada gagasan bahwa bagian kode istimewa tertinggi harus sekecil mungkin, dengan semua operasi signifikan dilakukan dalam kode istimewa pengguna. Anda perlu mempelajari mengapa ini mungkin ide yang bagus, ini bukan konsep yang sederhana (dan terkenal karena memiliki kelebihan dan kekurangan).
Memori dapat dibagi menjadi dua area berbeda:
Proses yang berjalan di bawah ruang pengguna hanya memiliki akses ke bagian terbatas memori, sedangkan kernel memiliki akses ke semua memori. Proses yang berjalan di ruang pengguna juga tidak memiliki akses ke ruang kernel. Proses ruang pengguna hanya dapat mengakses sebagian kecil dari kernel melalui antarmuka yang terpapar oleh kernel - panggilan sistem. Jika suatu proses melakukan panggilan sistem, interupsi perangkat lunak dikirim ke kernel, yang kemudian mengirimkan interrupt handler yang sesuai dan melanjutkan ini berfungsi setelah pawang selesai.
Di Linux ada dua ruang 1 adalah ruang pengguna dan satu lagi ruang kernal. ruang pengguna hanya terdiri dari aplikasi pengguna yang ingin Anda jalankan. sebagai layanan kernal ada manajemen proses, manajemen file, penanganan sinyal, manajemen memori, manajemen utas, dan begitu banyak layanan hadir di sana. jika Anda menjalankan aplikasi dari ruang pengguna yang aplikasi berinteraksi dengan layanan kernal saja. dan layanan itu berinteraksi dengan driver perangkat yang hadir antara perangkat keras dan kernal. manfaat utama dari ruang kernal dan pemisahan ruang pengguna adalah kita dapat menerima keamanan oleh virus.bcaz dari semua aplikasi pengguna yang hadir di ruang pengguna, dan layanan hadir di ruang kernal. Itulah sebabnya linux tidak terpengaruh oleh virus.