- Apa perbedaan antara tumpukan kernel dan tumpukan pengguna ?
Singkatnya, tidak ada - selain menggunakan lokasi yang berbeda dalam memori (dan karenanya nilai yang berbeda untuk register penunjuk tumpukan), dan biasanya perlindungan akses memori yang berbeda. Yaitu. saat mengeksekusi dalam mode pengguna, memori kernel (bagiannya adalah tumpukan kernel) tidak akan dapat diakses bahkan jika 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.
- Mengapa tumpukan kernel [ terpisah ] digunakan ?
Pemisahan hak istimewa dan keamanan. Pertama, program ruang pengguna dapat membuat tumpukan (penunjuk) apa pun yang mereka inginkan, dan biasanya tidak ada persyaratan arsitektural bahkan untuk memiliki yang valid. Oleh karena itu, kernel tidak dapat mempercayai pointer tumpukan ruang pengguna menjadi valid atau tidak dapat digunakan, dan oleh karena itu akan membutuhkan satu set di bawah kendalinya sendiri. Arsitektur CPU yang berbeda mengimplementasikannya dengan cara yang berbeda; x86 CPU secara otomatis mengalihkan 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).
- Jika variabel lokal dideklarasikan dalam ISR, di mana ia akan disimpan ?
Di tumpukan kernel. Kernel (yaitu kernel Linux) tidak kaitkan ISR langsung ke gerbang interupsi arsitektur x86 tetapi alih-alih mendelegasikan pengiriman interupsi ke mekanisme masuk/keluar interupsi kernel umum yang menyimpan status register pra-interupsi sebelum memanggil penangan terdaftar. CPU itu sendiri saat mengirim interupsi mungkin mengeksekusi hak istimewa dan/atau sakelar tumpukan, dan ini digunakan/diatur oleh kernel sehingga kode entri interupsi umum sudah dapat mengandalkan tumpukan kernel yang ada.
Yang mengatakan, interupsi yang terjadi saat mengeksekusi kode kernel hanya akan (terus) menggunakan tumpukan kernel di tempat pada saat itu. Ini dapat, jika penangan interupsi memiliki jalur panggilan yang sangat bersarang, menyebabkan limpahan tumpukan (jika jalur panggilan kernel yang dalam terganggu dan penangan menyebabkan jalur dalam lainnya; di Linux, kode RAID sistem file / perangkat lunak terganggu oleh kode jaringan dengan iptables aktif adalah diketahui memicu seperti itu di kernel lama yang tidak disetel ... solusinya adalah dengan meningkatkan ukuran tumpukan kernel untuk beban kerja tersebut).
- Apakah setiap proses memiliki tumpukan kernelnya sendiri?
Bukan hanya setiap proses - setiap utas memiliki tumpukan kernelnya sendiri (dan, faktanya, tumpukan penggunanya sendiri juga). Ingat satu-satunya perbedaan antara proses dan utas (untuk Linux) adalah kenyataan bahwa banyak utas dapat berbagi ruang alamat (membentuk proses).
- Bagaimana proses berkoordinasi antara kedua tumpukan ini ?
Tidak sama sekali - tidak perlu. Penjadwalan (bagaimana / kapan utas yang berbeda dijalankan, bagaimana statusnya disimpan dan dipulihkan) adalah tugas sistem operasi dan proses tidak perlu menyibukkan diri dengan hal ini. Saat utas dibuat (dan setiap proses harus memiliki setidaknya satu utas), kernel membuat tumpukan kernel untuknya, sementara tumpukan ruang pengguna dibuat/disediakan secara eksplisit oleh mekanisme mana pun yang digunakan untuk membuat utas (fungsi seperti makecontext()
atau pthread_create()
izinkan penelepon untuk menentukan wilayah memori yang akan digunakan untuk tumpukan utas "anak", atau diwariskan (dengan kloning memori on-access, biasanya disebut "copy on write" / COW, saat membuat proses baru).
Konon, prosesnya bisa memengaruhi penjadwalan utasnya dan/atau memengaruhi konteks (nyatakan, di antaranya adalah penunjuk tumpukan utas). Ada beberapa cara untuk ini:sinyal UNIX, setcontext()
, pthread_yield()
/ pthread_cancel()
, ... - tapi ini sedikit menyimpang dari pertanyaan awal.
Jawaban saya dikumpulkan dari pertanyaan SO lainnya dengan barang saya.
What's the difference between kernel stack and user stack?
Sebagai pemrogram kernel, Anda tahu bahwa kernel harus dibatasi dari program pengguna yang salah. Misalkan Anda menyimpan tumpukan yang sama untuk kernel &ruang pengguna, maka segfault sederhana di aplikasi pengguna membuat kernel mogok 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, jenis mekanisme 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 apakah interupsi disajikan dalam tumpukan kernel proses saat ini atau tumpukan ISR terpisah. Karena interupsi datang per cpu, maka tumpukan ISR harus per cpu.
Does each process has its own kernel stack ?
Ya. Setiap proses memiliki tumpukan kernelnya sendiri.
Then how the process coordinates between both these stacks?
Jawaban @FrankH terlihat bagus untuk saya.