- 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.
- 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).
- 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).
- 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).
- 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 saya dikumpulkan dari pertanyaan SO lainnya dengan barang-barang saya.
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
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
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.
Iya. Setiap proses memiliki tumpukan kernelnya sendiri.
@ Jawaban FrankH tampak bagus bagi saya.
sumber
Mengambil referensi dari Pengembangan Kernel Linux Robert Love, perbedaan utamanya adalah ukurannya:
Juga tumpukan kernel berisi penunjuk ke struct thread_info yang menyimpan informasi tentang utas.
sumber