Apa perbedaan antara mode pengguna dan kernel dalam sistem operasi?


104

Apa perbedaan antara Mode Pengguna dan Mode Kernel, mengapa dan bagaimana Anda mengaktifkan salah satunya, dan apa kasus penggunaannya?



1
@ CiroSantilli709 大 抓捕 六四 事件 法轮功 pertanyaan yang diajukan 7 tahun yang lalu tidak bisa ditutup sebagai duplikat untuk pertanyaan yang diajukan 6 tahun yang lalu. Jika mereka benar-benar duplikat, penutupannya harus sebaliknya.
Salvador Dali

2
@SalvadorDali hai, konsensus saat ini adalah menutup dengan "kualitas": meta.stackexchange.com/questions/147643/… Karena "kualitas" tidak dapat diukur, saya hanya menggunakan suara positif. ;-) Mungkin itu tergantung pada pertanyaan mana yang mendapatkan kata kunci Google newb terbaik pada judul. Saya mendorong Anda untuk cukup menyalin jawaban Anda di sana dengan penafian yang ditambahkan di bagian bawah, dan tautan dari yang ini, jika ditutup.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:


143
  1. 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.

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

Memahami Mode Pengguna dan Kernel


Ingin tahu kapan CPU menjalankan kode sistem operasi, di mode mana prosesor berada?
JackieLam

2
@JackieLam: Ini harus dalam mode kernel.
kadina

Jadi, untuk menjalankan proses ruang pengguna , itu harus dipetakan ke ruang kernel ?
roottraveller

@rahul Saya ragu memori referensi dapat diperoleh dengan mode pengguna atau bahwa manipulasi data yang paling sederhana akan mengakibatkan perubahan mode yang mahal dalam bahasa seperti java.
maki XIE

48

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 di mana semua program pengguna dijalankan. Itu tidak memiliki akses ke RAM dan perangkat keras. Alasannya adalah karena jika semua program berjalan dalam mode kernel, mereka akan dapat menimpa memori satu sama lain. Jika perlu mengakses salah satu fitur ini - itu membuat panggilan ke API yang mendasarinya. Setiap proses dimulai oleh windows kecuali proses sistem berjalan dalam mode pengguna.

Mode kernel:

  • mode di mana semua program kernel dijalankan (driver berbeda). Ini memiliki akses ke setiap sumber daya dan perangkat keras yang mendasarinya. Setiap instruksi CPU dapat dijalankan dan setiap alamat memori dapat diakses. Mode ini disediakan untuk pengemudi yang beroperasi pada level terendah

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

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

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


Ingin tahu kapan CPU menjalankan kode sistem operasi, di mode mana prosesor berada?
JackieLam

1
@JackieLam: mode kernel
Apurv Nerlekar

10

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.

Komunikasi antara mode pengguna dan mode kernel


6

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:

  • 0 untuk kernel
  • 3 untuk pengguna

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 Privlyang 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 = 0berarti 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 indan 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 0x80atausyscall 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
    

    GitHub upstream .

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

  • lebih mudah membuat program karena Anda lebih yakin salah satu program tidak akan mengganggu program lainnya. Misalnya, satu proses userland tidak perlu khawatir tentang menimpa memori program lain karena paging, atau tentang meletakkan perangkat keras dalam keadaan tidak valid untuk proses lain.
  • itu lebih aman. Misalnya izin file dan pemisahan memori dapat mencegah aplikasi peretasan membaca data bank Anda. Ini mengandaikan, tentu saja, Anda mempercayai kernel.

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

    GitHub upstream .

    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 hvcinstruksi (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 smcinstruksi (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:

masukkan deskripsi gambar di sini

Situasi ARM sedikit berubah dengan munculnya ARMv8.1 Virtualization Host Extensions (VHE) . Ekstensi ini memungkinkan kernel untuk berjalan di EL2 secara efisien:

masukkan deskripsi gambar di sini

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 MRSinstruksi: 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.


1
Karena pertanyaan ini tidak spesifik untuk OS apa pun, indan outtersedia untuk dering 3. TSS dapat menunjuk ke tabel izin IO dalam tugas saat ini yang memberikan akses baca / tulis ke semua atau port tertentu.
Michael Petch

Tentu saja Anda menetapkan bit IOPL ke nilai 3 maka program ring 3 memiliki akses port penuh dan izin TSS IO tidak berlaku.
Michael Petch

@MichaelPetch terima kasih, saya tidak tahu ini. Saya telah memperbarui jawabannya.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

5

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 .


2
Ini penting bagi Anda sebagai programmer karena bug kernel cenderung menimbulkan malapetaka yang jauh lebih buruk daripada yang mungkin biasa Anda lakukan. Salah satu alasan perbedaan kernel / pengguna adalah agar kernel dapat memantau / mengontrol sumber daya sistem penting dan melindungi setiap pengguna dari yang lain. Agak terlalu disederhanakan, tetapi masih membantu, untuk mengingatkan diri Anda sendiri bahwa bug pengguna sering mengganggu, tetapi bug kernel cenderung membuat seluruh mesin mati.
Adam Liss

3

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.


2

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:

  • Melindungi program pengguna dari mengakses seluruh memori, untuk tidak membiarkan program menimpa OS misalnya,
  • mencegah program pengguna melakukan instruksi sensitif seperti yang mengubah batas penunjuk memori CPU, untuk tidak membiarkan program melanggar batas memori mereka misalnya.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.