Apa perbedaan antara Mode Pengguna dan Mode Kernel, mengapa dan bagaimana Anda mengaktifkan salah satunya, dan apa kasus penggunaannya?
Apa perbedaan antara Mode Pengguna dan Mode Kernel, mengapa dan bagaimana Anda mengaktifkan salah satunya, dan apa kasus penggunaannya?
Jawaban:
Mode Kernel
Dalam mode Kernel, kode yang menjalankan memiliki akses lengkap dan tidak terbatas ke perangkat keras yang mendasarinya. Itu dapat menjalankan instruksi CPU apa pun dan merujuk ke alamat memori apa pun. Mode kernel umumnya dicadangkan untuk fungsi sistem operasi tingkat terendah dan paling tepercaya. Gangguan dalam mode kernel merupakan bencana besar; mereka akan menghentikan seluruh PC.
Mode pengguna
Dalam mode Pengguna, kode pelaksana tidak memiliki kemampuan untuk mengakses perangkat keras atau memori referensi secara langsung. Kode yang berjalan dalam mode pengguna harus didelegasikan ke API sistem untuk mengakses perangkat keras atau memori. Karena perlindungan yang diberikan oleh isolasi semacam ini, kerusakan dalam mode pengguna selalu dapat dipulihkan. Sebagian besar kode yang berjalan di komputer Anda akan dijalankan dalam mode pengguna.
Baca lebih lajut
Ini adalah dua mode berbeda di mana komputer Anda dapat beroperasi. Sebelumnya, ketika komputer seperti ruangan besar, jika ada sesuatu yang macet - itu menghentikan seluruh komputer. Jadi arsitek komputer memutuskan untuk mengubahnya. Mikroprosesor modern diimplementasikan dalam perangkat keras setidaknya dalam 2 kondisi berbeda.
Mode pengguna:
Mode kernel:
Bagaimana sakelar itu terjadi.
Peralihan dari mode pengguna ke mode kernel tidak dilakukan secara otomatis oleh CPU. CPU terganggu oleh interupsi (timer, keyboard, I / O). Ketika interupsi terjadi, CPU berhenti mengeksekusi program yang sedang berjalan, beralih ke mode kernel, menjalankan penangan interupsi. Penangan ini menyimpan status CPU, menjalankan operasinya, memulihkan status, dan kembali ke mode pengguna.
http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode
http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html
Prosesor di komputer yang menjalankan Windows memiliki dua mode berbeda: mode pengguna dan mode kernel. Prosesor beralih di antara dua mode tergantung pada jenis kode apa yang dijalankan pada prosesor. Aplikasi berjalan dalam mode pengguna, dan komponen sistem operasi inti dijalankan dalam mode kernel. Sementara banyak driver berjalan dalam mode kernel, beberapa driver dapat berjalan dalam mode pengguna.
Saat Anda memulai aplikasi mode pengguna, Windows membuat proses untuk aplikasi tersebut. Proses tersebut menyediakan aplikasi dengan ruang alamat virtual pribadi dan tabel pegangan pribadi. Karena ruang alamat virtual aplikasi bersifat pribadi, satu aplikasi tidak dapat mengubah data milik aplikasi lain. Setiap aplikasi berjalan secara terpisah, dan jika aplikasi mengalami error, error tersebut terbatas pada satu aplikasi tersebut. Aplikasi lain dan sistem operasi tidak terpengaruh oleh kerusakan tersebut.
Selain bersifat pribadi, ruang alamat virtual aplikasi mode pengguna dibatasi. Prosesor yang berjalan dalam mode pengguna tidak dapat mengakses alamat virtual yang dicadangkan untuk sistem operasi. Membatasi ruang alamat virtual aplikasi mode pengguna mencegah aplikasi mengubah, dan mungkin merusak, data sistem operasi penting.
Semua kode yang berjalan dalam mode kernel berbagi satu ruang alamat virtual. Ini berarti driver mode kernel tidak diisolasi dari driver lain dan sistem operasi itu sendiri. Jika driver mode kernel secara tidak sengaja menulis ke alamat virtual yang salah, data milik sistem operasi atau driver lain dapat disusupi. Jika driver mode kernel lumpuh, seluruh sistem operasi lumpuh.
Jika Anda adalah pengguna Windows setelah melalui tautan ini, Anda akan mendapatkan lebih banyak.
Cincin CPU adalah perbedaan yang paling jelas
Dalam mode terlindung x86, CPU selalu berada dalam salah satu dari 4 deringan. Kernel Linux hanya menggunakan 0 dan 3:
Ini adalah definisi kernel vs userland yang paling keras dan cepat.
Mengapa Linux tidak menggunakan ring 1 dan 2: CPU Privilege Rings: Mengapa ring 1 dan 2 tidak digunakan?
Bagaimana cincin saat ini ditentukan?
Cincin saat ini dipilih dengan kombinasi:
tabel deskriptor global: tabel dalam memori entri GDT, dan setiap entri memiliki bidang Privl
yang mengkodekan cincin.
Instruksi LGDT menyetel alamat ke tabel deskriptor saat ini.
Lihat juga: http://wiki.osdev.org/Global_Descriptor_Table
segmen mendaftarkan CS, DS, dll., yang mengarah ke indeks entri di GDT.
Misalnya, CS = 0
berarti entri pertama GDT saat ini aktif untuk kode eksekusi.
Apa yang bisa dilakukan setiap cincin?
Chip CPU dibuat secara fisik sehingga:
ring 0 bisa melakukan apa saja
ring 3 tidak dapat menjalankan beberapa instruksi dan menulis ke beberapa register, terutama:
tidak bisa mengganti cincinnya sendiri! Jika tidak, itu bisa mengatur dirinya sendiri ke dering 0 dan dering tidak akan berguna.
Dengan kata lain, tidak dapat mengubah deskriptor segmen saat ini , yang menentukan cincin saat ini.
tidak dapat mengubah tabel halaman: Bagaimana cara kerja halaman x86?
Dengan kata lain, tidak dapat mengubah register CR3, dan paging itu sendiri mencegah modifikasi tabel halaman.
Ini mencegah satu proses untuk melihat memori dari proses lain untuk alasan keamanan / kemudahan pemrograman.
tidak dapat mendaftarkan penangan interupsi. Itu dikonfigurasi dengan menulis ke lokasi memori, yang juga dicegah oleh paging.
Penangan berjalan 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 dengan demikian memiliki akses perangkat keras yang sewenang-wenang.
Jika tidak, misalnya, izin file tidak akan berguna jika ada program yang bisa langsung membaca dari disk.
Lebih tepatnya berkat Michael Petch : sebenarnya OS memungkinkan untuk mengizinkan instruksi IO di ring 3, ini sebenarnya dikendalikan oleh segmen status Tugas .
Apa yang tidak mungkin adalah cincin 3 memberikan izin sendiri untuk melakukannya jika tidak memilikinya sejak awal.
Linux selalu melarangnya. Lihat juga: Mengapa Linux tidak menggunakan sakelar konteks perangkat keras melalui TSS?
Bagaimana transisi program dan sistem operasi antar cincin?
ketika CPU dihidupkan, itu mulai menjalankan program awal di ring 0 (baik, tapi ini adalah perkiraan yang baik). Anda dapat menganggap program awal ini sebagai kernel (tetapi biasanya ini adalah bootloader yang kemudian memanggil kernel di ring 0 ).
ketika proses userland ingin kernel melakukan sesuatu untuk itu seperti menulis ke file, ia menggunakan instruksi yang menghasilkan interupsi seperti int 0x80
atausyscall
untuk memberi sinyal pada 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
Jika ini terjadi, CPU memanggil penangan panggilan balik interupsi yang didaftarkan oleh kernel pada saat boot. Berikut adalah contoh baremetal beton yang mendaftarkan pawang dan menggunakannya .
Penangan ini berjalan di ring 0, yang memutuskan apakah kernel akan mengizinkan tindakan ini, lakukan tindakan, dan mulai ulang program userland di ring 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 itu nakal, kernel mungkin menghentikan proses kali ini, atau memberinya peringatan dengan sebuah sinyal.
Ketika kernel boot, ia mengatur jam perangkat keras dengan beberapa frekuensi tetap, yang menghasilkan interupsi secara berkala.
Jam perangkat keras ini menghasilkan interupsi yang menjalankan ring 0, dan memungkinkannya untuk menjadwalkan proses userland mana yang akan diaktifkan.
Dengan cara ini, penjadwalan dapat terjadi meskipun proses tidak melakukan panggilan sistem apa pun.
Apa gunanya memiliki banyak dering?
Ada dua keuntungan utama memisahkan kernel dan userland:
Bagaimana cara bermain-main dengannya?
Saya telah membuat pengaturan bare metal yang seharusnya menjadi cara yang baik untuk memanipulasi cincin secara langsung: https://github.com/cirosantilli/x86-bare-metal-examples
Sayangnya, saya tidak memiliki kesabaran untuk membuat contoh userland, tetapi saya melakukan penyiapan paging, jadi userland seharusnya layak. Saya ingin melihat permintaan tarik.
Sebagai alternatif, modul kernel Linux dijalankan di ring 0, sehingga Anda dapat menggunakannya untuk mencoba operasi yang memiliki hak istimewa, misalnya membaca register kontrol: Bagaimana cara mengakses register kontrol cr0, cr2, cr3 dari suatu program? Mendapatkan kesalahan segmentasi
Berikut adalah pengaturan QEMU + Buildroot yang nyaman untuk mencobanya tanpa membunuh host Anda.
Kelemahan dari modul kernel adalah bahwa kthread 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, itu akan menjadi proyek yang menarik sebenarnya.
Cincin negatif
Meskipun cincin negatif sebenarnya tidak direferensikan dalam manual Intel, sebenarnya ada mode CPU yang memiliki kemampuan lebih jauh daripada dering 0 itu sendiri, dan karena itu cocok untuk nama "dering negatif".
Salah satu contohnya adalah mode hypervisor yang digunakan dalam virtualisasi.
Untuk detail lebih lanjut lihat:
LENGAN
Di ARM, cincin tersebut disebut Tingkat Pengecualian, tetapi ide utamanya tetap sama.
Ada 4 tingkat pengecualian di ARMv8, biasanya digunakan sebagai:
EL0: userland
EL1: kernel ("supervisor" dalam terminologi ARM).
Dimasukkan dengan svc
instruksi (SuperVisor Call), sebelumnya dikenal sebagai swi
before unified assembly , yaitu instruksi yang digunakan untuk melakukan panggilan sistem Linux. Contoh ARMv8 Halo dunia:
halo
.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 adalah contoh baremetal konkret yang mendaftarkan penangan SVC dan melakukan panggilan SVC .
EL2: hypervisor , misalnya Xen .
Dimasukkan dengan hvc
instruksi (HyperVisor Call).
Hypervisor adalah untuk OS, apa OS untuk userland.
Misalnya, Xen memungkinkan Anda menjalankan banyak OS seperti Linux atau Windows pada sistem yang sama pada waktu yang sama, dan mengisolasi OS satu sama lain untuk keamanan dan kemudahan debug, seperti yang dilakukan Linux untuk 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 perpindahannya ke KVM menjadi berita .
EL3: level lain. Contoh TODO.
Dimasukkan dengan smc
instruksi (Secure Mode Call)
The ARMv8 Referensi Arsitektur Model DDI 0487C.a - Bab D1 - The AArch64 Sistem Tingkat Programmer Model - Gambar D1-1 menggambarkan ini indah:
Situasi ARM sedikit berubah dengan munculnya ARMv8.1 Virtualization Host Extensions (VHE) . Ekstensi ini memungkinkan kernel untuk berjalan di EL2 secara efisien:
VHE dibuat karena solusi virtualisasi dalam kernel Linux seperti KVM telah menguasai 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 tersebut.
Perhatikan bagaimana ARM, mungkin karena keuntungan melihat ke belakang, memiliki konvensi penamaan yang lebih baik untuk tingkat hak istimewa daripada x86, tanpa perlu tingkat negatif: 0 sebagai yang lebih rendah dan 3 yang tertinggi. Level yang lebih tinggi cenderung dibuat lebih sering daripada level yang lebih rendah.
EL saat ini dapat ditanyai dengan MRS
instruksi: apa mode eksekusi / tingkat pengecualian saat ini, dll?
ARM tidak memerlukan semua tingkat pengecualian untuk memungkinkan implementasi yang tidak memerlukan fitur untuk menghemat area chip. ARMv8 "Level pengecualian" mengatakan:
Implementasi mungkin tidak menyertakan semua level Exception. 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 memasuki el1 saat mengemulasi a53 power up
Potongan kode diuji di Ubuntu 18.10.
in
dan out
tersedia untuk dering 3. TSS dapat menunjuk ke tabel izin IO dalam tugas saat ini yang memberikan akses baca / tulis ke semua atau port tertentu.
Saya akan mencoba dalam kegelapan dan menebak Anda sedang berbicara tentang Windows. Singkatnya, mode kernel memiliki akses penuh ke perangkat keras, tetapi mode pengguna tidak. Misalnya, banyak jika tidak sebagian besar driver perangkat ditulis dalam mode kernel karena mereka perlu mengontrol detail yang lebih baik dari perangkat keras mereka.
Lihat juga wikibook ini .
Jawaban lain sudah menjelaskan perbedaan antara mode pengguna dan kernel. Jika Anda benar-benar ingin mendapatkan detailnya, Anda harus mendapatkan salinan Internal Windows , sebuah buku bagus yang ditulis oleh Mark Russinovich dan David Solomon yang menjelaskan arsitektur dan detail di dalam berbagai sistem operasi Windows.
Apa
Pada dasarnya perbedaan antara mode kernel dan mode pengguna tidak bergantung pada OS dan dicapai hanya dengan membatasi beberapa instruksi untuk dijalankan hanya dalam mode kernel melalui desain perangkat keras. Semua tujuan lain seperti perlindungan memori hanya dapat dilakukan dengan pembatasan itu.
Bagaimana
Ini berarti prosesor hidup dalam mode kernel atau mode pengguna. Menggunakan beberapa mekanisme, arsitektur dapat menjamin bahwa setiap kali dialihkan ke mode kernel, kode OS diambil untuk dijalankan.
Mengapa
Memiliki infrastruktur perangkat keras ini dapat dicapai di OS umum: