tumpukan kernel dan tumpukan ruang pengguna


110

Apa perbedaan antara tumpukan kernel dan tumpukan pengguna? Mengapa tumpukan kernel digunakan? Jika variabel lokal dideklarasikan dalam ISR, di mana ia akan disimpan? Apakah setiap proses memiliki tumpukan kernelnya sendiri? Lalu bagaimana proses koordinat antara kedua stack tersebut?

Jawaban:


188
  1. Apa perbedaan antara tumpukan kernel dan tumpukan pengguna?

Singkatnya, tidak ada - selain menggunakan lokasi yang berbeda di memori (dan karenanya nilai yang berbeda untuk register stackpointer), dan biasanya perlindungan akses memori yang berbeda. Yaitu ketika mengeksekusi dalam mode pengguna, memori kernel (sebagian di antaranya adalah tumpukan kernel) tidak akan dapat diakses meskipun dipetakan. Sebaliknya, tanpa diminta secara eksplisit oleh kode kernel (di Linux, melalui fungsi seperti copy_from_user()), memori pengguna (termasuk tumpukan pengguna) biasanya tidak dapat diakses secara langsung.

  1. Mengapa tumpukan kernel [terpisah] digunakan?

Pemisahan hak istimewa dan keamanan. Pertama, program userspace dapat membuat tumpukan (penunjuk) mereka apa pun yang mereka inginkan, dan biasanya tidak ada persyaratan arsitektur untuk memiliki yang valid. Oleh karena itu, kernel tidak dapat mempercayai stackpointer sebagai valid atau dapat digunakan, dan oleh karena itu akan memerlukan satu set di bawah kendalinya sendiri. Arsitektur CPU yang berbeda menerapkannya dengan cara yang berbeda; x86 CPU secara otomatis mengganti penunjuk tumpukan ketika peralihan mode hak istimewa terjadi, dan nilai yang akan digunakan untuk tingkat hak istimewa yang berbeda dapat dikonfigurasi - dengan kode hak istimewa (yaitu hanya kernel).

  1. Jika variabel lokal dideklarasikan dalam ISR, di mana akan disimpan?

Di tumpukan kernel. Kernel (kernel Linux, yaitu) tidak mengaitkan ISR secara langsung ke gerbang interupsi arsitektur x86 tetapi mendelegasikan pengiriman interupsi ke mekanisme masuk / keluar interupsi kernel umum yang menyimpan status register pra-interupsi sebelum memanggil penangan terdaftar . CPU itu sendiri saat mengirimkan sebuah interupsi mungkin menjalankan sebuah privilege dan / atau stack switch, dan ini digunakan / diatur oleh kernel sehingga kode entri interupsi umum sudah dapat mengandalkan tumpukan kernel yang ada.
Meskipun demikian, interupsi yang terjadi saat menjalankan kode kernel akan (terus) menggunakan tumpukan kernel yang ada pada saat itu. Hal ini dapat, jika penangan interupsi memiliki jalur panggilan yang sangat bertingkat, menyebabkan luapan tumpukan (jika jalur panggilan kernel yang dalam terputus dan penangan menyebabkan jalur dalam lain; di Linux, kode RAID sistem file / perangkat lunak sedang diinterupsi oleh kode jaringan dengan iptables aktif diketahui memicu seperti itu pada kernel lama yang tidak disetel ... solusinya adalah meningkatkan ukuran tumpukan kernel untuk beban kerja semacam itu).

  1. Apakah setiap proses memiliki tumpukan kernelnya sendiri?

Tidak hanya setiap proses - setiap utas memiliki tumpukan kernelnya sendiri (dan, pada kenyataannya, tumpukan penggunanya sendiri juga). Ingat satu-satunya perbedaan antara proses dan utas (ke Linux) adalah kenyataan bahwa beberapa utas dapat berbagi ruang alamat (membentuk proses).

  1. Bagaimana prosesnya berkoordinasi antara kedua tumpukan ini?

Tidak sama sekali - tidak perlu. Penjadwalan (bagaimana / kapan utas yang berbeda dijalankan, bagaimana status mereka disimpan dan dipulihkan) adalah tugas dan proses sistem operasi tidak perlu mengkhawatirkan hal ini sendiri. Saat utas dibuat (dan setiap proses harus memiliki setidaknya satu utas), kernel membuat tumpukan kernel untuk mereka, sementara tumpukan ruang pengguna dibuat / disediakan secara eksplisit oleh mekanisme mana pun yang digunakan untuk membuat utas (berfungsi seperti makecontext()atau pthread_create()memungkinkan pemanggil untuk tentukan wilayah memori yang akan digunakan untuk tumpukan utas "anak"), atau diwariskan (dengan kloning memori saat akses, biasanya disebut "salin saat menulis" / KK, saat membuat proses baru).
Yang mengatakan,(status, di antaranya adalah stackpointer utas). Ada beberapa cara untuk ini: sinyal UNIX setcontext(),, pthread_yield()/ pthread_cancel(), ... - tetapi ini sedikit mengganggu dari pertanyaan aslinya.


Jawaban luar biasa FrankH. Terima kasih.
kumar

1
@FrankH Jawaban yang sangat baik .. tetapi saya memiliki pertanyaan kecil terkait dengannya, tetapi dalam arsitektur ARM .. Bagaimana tumpukan kernel ini terkait dengan mode prosesor yang berbeda?
Rahul

2
@Rahul: "margin dari komentar SO terlalu kecil untuk memuat jawaban seperti itu". Bagaimana register stack / stackpointer bekerja dalam mode CPU ARM yang berbeda (yang menerapkan SP yang dibelokkan) adalah pertanyaan yang bagus, tetapi membutuhkan lebih banyak ruang untuk menjawab daripada yang dapat diberikan oleh komentar. Hal yang sama berlaku untuk hal-hal seperti gerbang tugas x86 atau IST - tidak ada yang namanya penunjuk tumpukan kernel "tunggal" (sama seperti tidak ada penunjuk tumpukan pengguna "tunggal"), dan dukungan / mandat perangkat keras apa yang ada untuk penunjuk tumpukan terpisah dalam mode operasi berbeda ... sangat bergantung pada perangkat keras.
FrankH.

@Tokopedia Saya membuat pertanyaan baru untuk pertanyaan yang sama ... stackoverflow.com/q/22601165/769260 Saya harap sekarang Anda dapat membantu saya tanpa mempedulikan ruang :)
Rahul

1
@Tokopedia Dapatkah Anda memberikan diagram yang menunjukkan di mana tumpukan kernel berada dalam tata letak memori suatu proses?
Jithin Pavithran

19

Jawaban saya dikumpulkan dari pertanyaan SO lainnya dengan barang-barang saya.

What's the difference between kernel stack and user stack?

Sebagai programmer kernel, Anda tahu bahwa kernel harus dibatasi dari program pengguna yang salah. Misalkan Anda menyimpan tumpukan yang sama untuk kedua kernel & ruang pengguna, maka segfault sederhana di aplikasi pengguna membuat kernel crash dan perlu dimulai ulang.

Ada satu "tumpukan kernel" per CPU seperti ISR ​​Stack dan satu "tumpukan kernel" per Proses. Ada satu "tumpukan pengguna" untuk setiap proses, meskipun setiap utas memiliki tumpukannya sendiri, termasuk utas pengguna dan kernel.

http://linux.derkeiler.com/Mailing-Lists/Kernel/2004-10/3194.html

Why kernel stack is used?

Jadi ketika kita berada dalam mode kernel, mekanisme jenis tumpukan diperlukan untuk menangani pemanggilan fungsi, variabel lokal mirip dengan ruang pengguna.

http://www.kernel.org/doc/Documentation/x86/kernel-stacks

If a local variable is declared in an ISR, where it will be stored?

Ini akan disimpan dalam tumpukan ISR (IRQSTACKSIZE). ISR berjalan pada tumpukan interupsi terpisah hanya jika perangkat keras mendukungnya. Jika tidak, bingkai tumpukan ISR didorong ke tumpukan utas yang terputus.

Ruang pengguna tidak tahu dan terus terang tidak peduli tentang apakah interupsi disajikan dalam tumpukan kernel proses saat ini atau tumpukan ISR terpisah. Karena interupsi datang per cpu, oleh karena itu tumpukan ISR harus per cpu.

 Does each process has its own kernel stack ?

Iya. Setiap proses memiliki tumpukan kernelnya sendiri.

 Then how the process coordinates between both these stacks?

@ Jawaban FrankH tampak bagus bagi saya.


4
  1. Apa perbedaan antara tumpukan kernel dan tumpukan pengguna

Mengambil referensi dari Pengembangan Kernel Linux Robert Love, perbedaan utamanya adalah ukurannya:

Ruang pengguna dapat lolos dengan mengalokasikan banyak variabel secara statis pada stack, termasuk struktur besar dan array ribuan elemen.
Perilaku ini legal karena ruang pengguna memiliki tumpukan besar yang dapat berkembang secara dinamis.
Tumpukan kernel tidak besar atau dinamis; itu kecil dan ukurannya tetap.
Ukuran pasti dari tumpukan kernel bervariasi menurut arsitektur.
Pada x86, ukuran tumpukan dapat dikonfigurasi pada waktu kompilasi dan dapat berupa 4KB atau 8KB.
Secara historis, tumpukan kernel terdiri dari dua halaman, yang secara umum berarti 8 KB pada arsitektur 32-bit dan 16 KB pada arsitektur 64-bit — ukuran ini tetap dan absolut.
Setiap proses menerima tumpukannya sendiri.

Juga tumpukan kernel berisi penunjuk ke struct thread_info yang menyimpan informasi tentang utas.

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.