Apa perbedaan antara ruang kernel dan ruang pengguna?

Jawaban:

117

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.

Jerry Coffin
sumber
4
JADI katakan jika saya memiliki 10 proses dalam sistem saya. Apakah setiap proses memiliki tumpukan sendiri yang dibagi menjadi tumpukan pengguna dan tumpukan kernel ATAU semua proses berbagi tumpukan kernel tunggal?
kc3
10
@ kc3: itu setidaknya sebagian tergantung pada OS, tapi saya percaya sebagian besar memiliki tumpukan mode-kernel untuk setiap proses yang digunakan ketika kernel melakukan sesuatu atas nama suatu proses (misalnya, I / O) dan setidaknya satu lagi tumpukan kernel yang khusus untuk penggunaan internal oleh kernel (misalnya, untuk penjadwalan).
Jerry Coffin
2
Apakah ada proses kernel dan apa hubungan atau perbedaannya dengan proses userspace seperti yang ditanyakan?
Victor Choy
Jadi, untuk menjalankan proses ruang pengguna , harus dipetakan ke ruang kernel ?
roottraveller
@roottraveller: Saya tidak yakin apa yang memberi Anda ide itu, tetapi tidak, tidak sama sekali. Pada saat yang sama, proses ruang-pengguna biasanya akan memiliki sebagian (lebih atau kurang tersembunyi) memori ruang-kernel, jadi (misalnya) proses Anda akan memiliki tumpukan ruang-pengguna, dan tumpukan ruang-kernel yang digunakan saat Anda melakukan panggilan OS yang perlu dijalankan dalam mode kernel.
Jerry Coffin
64

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, writedll Juga, Cfungsi perpustakaan seperti printfpanggilan system call writepada 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.

Aquarius_Girl
sumber
2
Bagian pertama dari jawaban ini salah. RAM tidak dipecah menjadi kernel dan ruang pengguna. Memori virtual adalah. Saya mencoba mengedit jawabannya tetapi edit que sudah penuh selama berhari-hari. Tolong perbaiki. Lihatlah jawaban Varun di bawah ini untuk informasi lebih lanjut.
MeLikeyCode
1
@MeLikeyCode Bukankah itu penyederhanaan yang dapat dibenarkan dalam konteks mencoba memberikan jawaban yang dapat dimengerti secara luas?
problemofficer
2
@problemofficer, saya pikir, bahwa penyederhanaan besar dapat memberikan pemahaman dasar yang salah. Masing-masing harus mengetahui bahwa memori fisik tidak dibagi menjadi ruang pengguna dan ruang kernel, tetapi kernel menyediakan abstraksi dari memori virtual, yang dibagi menjadi ruang kernel dan pengguna dan kemudian dipetakan pada memori fisik.
dshil
22

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.

Varun Sharma
sumber
1
Proses umum memiliki ruang kernel dan ruang pengguna sendiri?
Victor Choy
@VictorChoy, sebuah proses dijalankan dalam dua mode: user dan kernel. Memori, yang dilihat proses itu unik untuknya. Tetapi untuk setiap proses yang berjalan dalam mode kernel (menjalankan kode kernel) hanya ada satu ruang - ruang kernel.
dshil
Perhatikan juga, bahwa ketika suatu proses dibuat, itu memori virtual dibagi menjadi 2 bagian (pengguna dan kernel), di mana beberapa bagian dari alamat virtual dicadangkan untuk mode pengguna dan yang lain untuk mode kernel.
dshil
19

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:

  • 0 untuk kernel
  • 3 untuk pengguna

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

    GitHub hulu .

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

  • lebih mudah membuat program karena Anda lebih yakin tidak akan mengganggu yang lain. 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.
  • ini lebih aman. Misalnya, izin file dan pemisahan memori dapat mencegah aplikasi peretasan membaca data bank Anda. Tentu saja ini mengandaikan bahwa Anda mempercayai kernel.

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

    GitHub hulu .

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

masukkan deskripsi gambar di sini

Situasi ARM berubah sedikit 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 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 MRSinstruksi: 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.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
sumber
11

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.

Dave Rager
sumber
8

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.

pflz
sumber
1
jawaban Anda khusus untuk Windows; Anda harus mengklarifikasi itu.
Matius
1
Anda mengatakan bahwa untuk setiap proses dari memori virtual 4GB, 1 GB adalah ruang Kernel yang sama untuk setiap proses dan hanya menyimpan pemetaan .. Saya tidak mengerti mengapa !!, mengapa 1GB diperlukan hanya untuk pemetaan ke lokasi awal?
VISHAL DAGA
5

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

RajKumar Rampelli
sumber
4

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

Yassine Abdul-Rahman
sumber
2

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)
pengguna991800
sumber
Pertanyaan terakhir sangat bagus yang Anda ajukan. Tapi hanya gangguan perangkat lunak INT 0x80 , lalu? Itu bukan penjelasan yang baik untuk saya. Bisakah Anda menjelaskan secara rinci bagaimana solusi bekerja untuk pertanyaan yang Anda ajukan sendiri?
Victor Choy
2

Oleh Sunil Yadav, di Quora:

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.

Vijay Ram
sumber
1

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.

Nanobrains
sumber
1

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. masukkan deskripsi gambar di sini

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.

Darshan L
sumber
0

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

Scott Franco
sumber
0

Memori dapat dibagi menjadi dua area berbeda:

  • Ruang pengguna, yang merupakan sekumpulan lokasi tempat proses pengguna normal berjalan (yaitu segala sesuatu selain kernel). Peran kernel adalah untuk mengelola aplikasi yang berjalan di ruang ini dari saling mengotak, dan mesin.
  • Ruang kernel, yang merupakan lokasi di mana kode kernel disimpan, dan dijalankan di bawah.

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.

Gopika BG
sumber
-7

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.

Praveen Kumar
sumber
5
Selain fakta bahwa itu "kernel" bukan "kernal" jawaban Anda tidak sepenuhnya benar. Virus modern (dan dengan modern maksud saya segalanya setelah Windows 98) sama sekali tidak berinteraksi dengan "layanan kernel", semuanya dilakukan dalam ruang pengguna. Fakta bahwa Linux tidak memiliki banyak virus (tentu saja ada virus untuk Linux) adalah bahwa ia memiliki manajemen izin yang cukup bagus dan - fakta yang paling penting - kebanyakan pengguna Linux bukanlah mereka: "omaigosh JustinBieber.NewSong.exe! Saya HARUS mendengarnya NAO !!! 1111 "pengguna yang mengklik dan menginstal semuanya tanpa petunjuk.
alexclooze
3
Juga, Linux tidak banyak digunakan sebagai Windows - menulis virus untuk itu tidak akan menyebabkan kerusakan sebanyak yang ingin dicapai oleh penulis virus. Aplikasi ruang pengguna tidak berkomunikasi dengan layanan kernel, mereka memanggil fungsi khusus yang disediakan oleh kernel yang disebut syscalls.
alexclooze