apa perbedaan antara mode pengguna dan mode kernel? mengapa perlu saklar konteks saat beralih antara 2?
Jawaban saya berkaitan dengan Linux karena itulah yang saya tahu, tetapi harus sama benarnya untuk sebagian besar, jika tidak semua, versi Unix.
Mode pengguna adalah tempat semua proses yang bukan bagian dari kernel (alias "proses non-kernel") dijalankan. Dalam mode pengguna, suatu proses hanya dapat secara langsung mengakses memorinya sendiri, secara default. Ini untuk melindungi proses dari satu sama lain dan untuk mencoba mencegah bug dalam satu proses yang menyebabkan proses lain macet. Ini juga membantu menegakkan keamanan, karena proses dengan privilege rendah tidak dapat secara langsung mengakses memori dari suatu proses yang berjalan sebagai pengguna lain, yang mungkin berisi data rahasia seperti rincian kartu kredit.
Namun, ada beberapa operasi di kernel yang harus mengakses seluruh memori sistem - misalnya, membuat proses baru. Untuk ini, mode kernel diperlukan, karena itu dapat mengakses alamat virtual atau fisik yang dapat diakses secara fisik. (Untuk keperluan jawaban ini saya mengabaikan hypervisor, yang sedikit memperumit gambar ini.)
Beralih antara mode pengguna dan mode kernel mungkin memerlukan sakelar konteks, tetapi hanya karena konvensi lama, bukan karena itu mutlak diperlukan. Sumber: http://en.wikipedia.org/wiki/Context_switch#User_and_kernel_mode_switching
Dengan asumsi arsitektur x86:
Mode pengguna:
Skema memori virtual berlaku. Dalam mode pengguna, alamat memori dipetakan ke alamat fisik melalui tabel halaman. Jadi, ketika program mode pengguna mengakses memori di lokasi memori 0x0001000 misalnya, kemungkinan dialihkan melalui mekanisme memori virtual ke alamat yang sama sekali berbeda. Ini juga mengontrol akses ke perangkat keras yang diakses melalui lokasi memori seperti RAM, seperti register APIC, RAM video, dll. Itulah sebabnya proses mode pengguna tidak dapat "keluar dari cangkangnya" dan mengubah lokasi memori di mana program lain hidup.
Mekanisme hak istimewa I / O berlaku. Ini memengaruhi perangkat keras tertentu yang menggunakan "port I / O" (tidak ada kaitannya dengan port TCP / IP), seperti perangkat keras PIC dan PIT lama, memori CMOS, dll. Mode pengguna hanya dapat mengakses port I / O yang diizinkan oleh "IOPL bitmap ", tidak dapat menonaktifkan interupsi, dan tidak dapat mengubah IOPL.
Instruksi Privileged CPU akan menyebabkan pengecualian jika dijalankan. Ini termasuk instruksi untuk mengatur tabel halaman dan hal-hal lain.
Mode kernel:
Ya, sangat mungkin bagi suatu proses dalam mode kernel untuk menimpa proses atau kode lain dalam memori, seperti struktur kernel kritis atau driver perangkat.
Mekanisme hak istimewa I / O tidak berpengaruh. CPU dapat mengakses port I / O apa pun tanpa batasan, dan mengatur IOPL untuk mode pengguna.
Semua instruksi istimewa dapat dieksekusi tanpa menyebabkan pengecualian.
"Switch konteks" diperlukan karena setiap kali x86 CPU menjalankan suatu program, banyak keadaan saat itu dari program itu pada saat tertentu ada di registernya, selain lokasi RAM yang mungkin digunakan untuk variabel dan penyimpanan sementara.
Jadi, jika kita ingin CPU tiba-tiba melompat ke tempat lain, dan kemudian kembali ke apa yang sebelumnya dilakukan, kita perlu menyimpan semua register CPU sehingga dapat dipulihkan sebelum melompat kembali.
Kernel bertanggung jawab untuk mengelola sumber daya sistem (penjadwalan, manajemen memori, jaringan dll). Kernel berjalan dalam konteks yang dilindungi yang disebut ring 0 untuk mencegahnya dari modifikasi oleh pengguna yang tidak memiliki hak.
Aplikasi berjalan dalam mode pengguna (dering 3), dan beralih konteks ketika menjalankan panggilan sistem untuk meminta layanan dari kernel.