Rumah > Artikel > Tutorial sistem > Apakah ruang kernel Linux dan ruang pengguna?
Untuk sistem pengendalian 32-bit, ruang alamatnya (juga dipanggil ruang alamat maya atau ruang alamat linear) ialah 4G (iaitu, 2 hingga kuasa ke-32). Ini bermakna proses boleh mempunyai ruang alamat maksimum 4G.
Inti sistem pengendalian ialah kernel, yang diasingkan daripada aplikasi biasa dan mempunyai kebenaran untuk mengakses ruang memori yang dilindungi dan peranti perkakasan asas. Untuk memastikan keselamatan kernel, sistem pengendalian moden biasanya menyekat proses pengguna daripada mengendalikan kernel secara langsung.
Biasanya ini dicapai dengan membahagikan ruang alamat maya kepada dua bahagian, ruang kernel dan ruang pengguna. Setakat sistem pengendalian Linux, bait 1G tertinggi (dari alamat maya 0xC0000000 hingga 0xFFFFFFFF) digunakan oleh kernel dan dipanggil ruang kernel. Bait 3G yang lebih rendah (dari alamat maya 0x00000000 hingga 0xBFFFFFFF) digunakan oleh proses individu dan dipanggil ruang pengguna.
Dalam erti kata lain, daripada ruang alamat 4G setiap proses, 1G tertinggi adalah sama, iaitu ruang kernel. Hanya baki 3G adalah ruang yang tersedia untuk proses itu sendiri.
Ia boleh difahami seperti ini: "Ruang kernel 1G maksimum dikongsi antara semua proses Angka berikut menunjukkan peruntukan ruang alamat 4G untuk setiap proses (gambar datang dari Internet):
Di antara semua arahan CPU, ada yang sangat berbahaya dan akan menyebabkan sistem ranap jika digunakan secara tidak betul, seperti membersihkan memori, menetapkan jam, dll. Jika semua program dibenarkan menggunakan arahan ini, kebarangkalian ranap sistem akan meningkat dengan ketara.
Jadi, CPU membahagikan arahan kepada arahan istimewa dan arahan tidak istimewa Untuk arahan berbahaya tersebut, hanya sistem pengendalian dan modul berkaitannya dibenarkan menggunakannya, dan aplikasi biasa hanya boleh menggunakan arahan tersebut yang tidak akan menyebabkan bencana.
Sebagai contoh, CPU Intel membahagikan tahap keistimewaan kepada 4 tahap: Ring0~Ring3. Sebenarnya, sistem Linux hanya menggunakan dua peringkat larian, Ring0 dan Ring3 (sama juga berlaku untuk sistem Windows).
Apabila proses berjalan pada tahap Ring3, ia dikatakan berjalan dalam mod pengguna, manakala apabila ia berjalan pada tahap Ring0, ia dikatakan berjalan dalam mod kernel.
Baiklah, sekarang kita perlu menerangkan apakah mod kernel dan mod pengguna: "Apabila proses berjalan dalam ruang kernel, ia berada dalam mod kernel, dan apabila proses berjalan dalam ruang pengguna, ia berada dalam mod pengguna." Dalam mod kernel, proses berjalan dalam ruang alamat kernel, dan CPU boleh melaksanakan sebarang arahan pada masa ini. Kod berjalan tidak tertakluk kepada sebarang sekatan dan boleh mengakses mana-mana alamat yang sah secara bebas atau terus mengakses pelabuhan.
Dalam mod pengguna, proses berjalan dalam ruang alamat pengguna, dan kod yang dilaksanakan tertakluk kepada banyak semakan oleh CPU Mereka hanya boleh mengakses alamat maya halaman yang boleh diakses dalam mod pengguna yang dinyatakan dalam entri jadual halaman yang memetakan alamatnya space. , dan hanya boleh terus mengakses port boleh diakses yang dinyatakan dalam Peta Bit Kebenaran I/O dalam Segmen Status Tugas (TSS).
Untuk sistem pengendalian DOS sebelum ini, tiada konsep ruang kernel, ruang pengguna, keadaan kernel dan keadaan pengguna. Ia boleh dianggap bahawa semua kod berjalan dalam mod kernel, jadi kod aplikasi yang ditulis pengguna boleh merosakkan sistem pengendalian dengan mudah.
Untuk Linux, reka bentuk membezakan ruang kernel dan ruang pengguna mengasingkan kod sistem pengendalian (kod sistem pengendalian jauh lebih mantap daripada kod aplikasi) dan kod aplikasi.
Walaupun ralat berlaku dalam satu aplikasi, ia tidak akan menjejaskan kestabilan sistem pengendalian, supaya program lain masih boleh berjalan seperti biasa (Linux ialah sistem multi-tasking!).
"Jadi, membezakan antara ruang kernel dan ruang pengguna pada asasnya adalah untuk meningkatkan kestabilan dan kebolehgunaan sistem pengendalian."Malah, semua pengurusan sumber sistem selesai dalam ruang kernel. Contohnya, membaca dan menulis fail cakera, memperuntukkan dan mengitar semula memori, membaca dan menulis data daripada antara muka rangkaian, dsb.
Aplikasi kami tidak boleh melakukan operasi sedemikian secara langsung. Tetapi kita boleh mencapai tugas tersebut melalui antara muka yang disediakan oleh kernel.
Sebagai contoh, jika aplikasi ingin membaca fail pada cakera, ia boleh memulakan "panggilan sistem" ke kernel dan memberitahu kernel: "Saya mahu membaca fail tertentu pada cakera."
Malah, arahan khas digunakan untuk membolehkan proses memasuki keadaan kernel (ke ruang kernel) dari keadaan pengguna Dalam ruang kernel, CPU boleh melaksanakan sebarang arahan, termasuk membaca data dari cakera. Proses khusus ialah membaca data terlebih dahulu ke dalam ruang kernel, kemudian menyalin data ke ruang pengguna dan beralih daripada mod kernel kepada mod pengguna.
Pada ketika ini, aplikasi telah kembali dari panggilan sistem dan telah memperoleh data yang dikehendaki, dan dengan senang hati boleh meneruskan pelaksanaan. Ringkasnya, aplikasi menyumber luar perkara berteknologi tinggi (membaca fail dari cakera) ke kernel sistem, dan kernel sistem melakukan perkara ini secara profesional dan cekap.
Untuk sesuatu proses, proses memasuki ruang kernel dari ruang pengguna dan akhirnya kembali ke ruang pengguna adalah sangat rumit. Sebagai contoh, konsep "timbunan" yang sering kita temui sebenarnya mempunyai timbunan dalam mod kernel dan mod pengguna.
Apabila berjalan dalam ruang pengguna, proses menggunakan tindanan dalam ruang pengguna, dan apabila berjalan dalam ruang kernel, proses menggunakan tindanan dalam ruang kernel. Oleh itu, setiap proses dalam Linux mempunyai dua tindanan, satu untuk mod pengguna dan satu untuk mod kernel.
Angka berikut menerangkan secara ringkas penukaran antara mod pengguna dan mod kernel:
Memandangkan proses mod pengguna mesti bertukar kepada mod kernel untuk menggunakan sumber sistem, mari kita lihat berapa banyak cara proses boleh masuk dari mod pengguna ke mod kernel.
Ringkasnya, terdapat tiga cara: 系统调用、软中断和硬件中断
. Setiap daripada tiga kaedah ini melibatkan banyak pengetahuan sistem pengendalian, jadi saya tidak akan mengembangkannya di sini.
Seterusnya, mari kita lihat struktur keseluruhan sistem Linux dari perspektif ruang kernel dan ruang pengguna. Ia boleh dibahagikan secara kasar kepada tiga bahagian, dari bawah ke atas: perkakasan -> ruang kernel -> ruang pengguna. Seperti yang ditunjukkan dalam gambar di bawah (gambar ini datang dari Internet):
Di atas perkakasan, kod dalam ruang kernel mengawal penggunaan sumber perkakasan Kod dalam ruang pengguna hanya boleh menggunakan sumber perkakasan dalam sistem melalui antara muka panggilan sistem (System Call Interface) yang didedahkan oleh kernel. . Malah, bukan sahaja Linux, tetapi juga reka bentuk sistem pengendalian Windows adalah serupa.
Malah kita boleh meringkaskan aktiviti setiap pemproses pada bila-bila masa tertentu sebagai salah satu daripada tiga berikut:
Tiga perkara di atas merangkumi hampir semua situasi Contohnya, apabila CPU melahu, kernel menjalankan proses kosong, yang berada dalam konteks proses tetapi berjalan dalam ruang kernel.
Nota: Rutin perkhidmatan gangguan sistem Linux tidak dilaksanakan dalam konteks proses Ia dilaksanakan dalam konteks gangguan khusus yang bebas daripada semua proses.
Sebab mengapa terdapat persekitaran pelaksanaan khas adalah untuk memastikan program perkhidmatan gangguan dapat bertindak balas dan mengendalikan permintaan gangguan secepat mungkin, dan kemudian keluar dengan cepat.
Kebanyakan sistem pengendalian moden melindungi keselamatan dan kestabilan sistem pengendalian itu sendiri melalui reka bentuk ruang kernel dan ruang pengguna. Oleh itu, apabila kita membaca maklumat tentang sistem pengendalian, kita sering menghadapi konsep seperti ruang kernel, ruang pengguna, mod kernel, dan mod pengguna saya harap artikel ini dapat membantu anda memahami konsep asas ini.
Atas ialah kandungan terperinci Apakah ruang kernel Linux dan ruang pengguna?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!