GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara memetakan tumpukan untuk panggilan sistem clone () di linux?

Anda ingin flag MAP_ANONYMOUS untuk mmap. Dan MAP_GROWSDOWN karena Anda ingin menggunakannya sebagai tumpukan.

Sesuatu seperti:

void *stack = mmap(NULL,initial_stacksize,PROT_WRITE|PROT_READ,MAP_PRIVATE|MAP_GROWSDOWN|MAP_ANONYMOUS,-1,0);

Lihat halaman manual mmap untuk info lebih lanjut. Dan ingat, klon adalah konsep tingkat rendah, yang tidak boleh Anda gunakan kecuali Anda benar-benar membutuhkan apa yang ditawarkannya. Dan ia menawarkan banyak kontrol - seperti mengatur tumpukannya sendiri - kalau-kalau Anda ingin melakukan tipuan (seperti membuat tumpukan dapat diakses di semua proses terkait). Kecuali jika Anda memiliki alasan yang sangat bagus untuk menggunakan clone, tetap gunakan fork atau pthreads.


Tumpukan tidak, dan tidak akan pernah bisa, tidak terbatas dalam ruang pertumbuhannya. Seperti yang lainnya, mereka tinggal di ruang alamat virtual proses, dan jumlah pertumbuhannya selalu dibatasi oleh jarak ke wilayah memori yang dipetakan yang berdekatan.

Ketika orang berbicara tentang tumpukan yang tumbuh secara dinamis, yang mereka maksud mungkin adalah salah satu dari dua hal:

  • Halaman tumpukan mungkin merupakan halaman kosong copy-on-write, yang tidak mendapatkan salinan pribadi hingga penulisan pertama dilakukan.
  • Bagian bawah dari wilayah tumpukan mungkin belum dicadangkan (dan dengan demikian tidak diperhitungkan dalam biaya komit proses, yaitu jumlah memori fisik/swap yang telah diperhitungkan oleh kernel sebagai yang dicadangkan untuk proses) hingga halaman penjaga dipukul , dalam hal ini kernel melakukan lebih banyak dan memindahkan halaman penjaga, atau mematikan proses jika tidak ada memori yang tersisa untuk dilakukan.

Mencoba mengandalkan MAP_GROWSDOWN bendera tidak dapat diandalkan dan berbahaya karena itu tidak dapat melindungi Anda dari mmap membuat pemetaan baru yang berdekatan dengan tumpukan Anda, yang kemudian akan dihancurkan. (Lihat http://lwn.net/Articles/294001/) Untuk utas utama, kernel secara otomatis mencadangkan ulimit ukuran tumpukan senilai ruang alamat (bukan memori ) di bawah tumpukan dan mencegah mmap dari mengalokasikannya. (Namun berhati-hatilah! Beberapa kernel yang ditambal vendor rusak menonaktifkan perilaku ini yang menyebabkan kerusakan memori acak!) Untuk utas lainnya, Anda hanya harus mmap seluruh rentang ruang alamat yang mungkin dibutuhkan thread untuk ditumpuk saat membuatnya. Tidak ada jalan lain. Anda bisa buat sebagian besar awalnya tidak dapat ditulis/tidak dapat dibaca, dan ubah itu jika ada kesalahan, tetapi kemudian Anda memerlukan penangan sinyal dan solusi ini tidak dapat diterima dalam implementasi utas POSIX karena akan mengganggu penangan sinyal aplikasi. (Perhatikan bahwa, sebagai ekstensi, kernel bisa menawarkan MAP_ khusus flag untuk mengirimkan sinyal yang berbeda, bukan SIGSEGV pada akses ilegal ke pemetaan, dan kemudian implementasi utas dapat menangkap dan menindaklanjuti sinyal ini. Tetapi Linux saat ini tidak memiliki fitur seperti itu.)

Akhirnya, perhatikan bahwa clone syscall tidak mengambil argumen stack pointer karena tidak membutuhkannya. Syscall harus dijalankan dari kode rakitan, karena pembungkus ruang pengguna diperlukan untuk mengubah penunjuk tumpukan di utas "anak" agar mengarah ke tumpukan yang diinginkan, dan menghindari penulisan apa pun ke tumpukan induk.

Sebenarnya, clone tidak mengambil argumen penunjuk tumpukan, karena tidak aman menunggu untuk mengubah penunjuk tumpukan di "anak" setelah kembali ke ruang pengguna. Kecuali jika semua sinyal diblokir, penangan sinyal dapat langsung berjalan di tumpukan yang salah, dan pada beberapa arsitektur, penunjuk tumpukan harus valid dan mengarah ke area yang aman untuk menulis setiap saat.

Tidak hanya memodifikasi penunjuk tumpukan tidak mungkin dilakukan dari C, tetapi Anda juga tidak dapat menghindari kemungkinan bahwa kompiler akan menghancurkan tumpukan induk setelah syscall tetapi sebelum penunjuk tumpukan diubah.


Linux
  1. Cara menggunakan systemd-nspawn untuk pemulihan sistem Linux

  2. Cara memeriksa Versi OS dan Linux

  3. Bagaimana mengubah identitas sistem Linux

  1. Linux:Bagaimana Menemukan Driver Perangkat yang Digunakan Untuk Perangkat?

  2. Linux – Bagaimana Cara Menonaktifkan Bip Sistem Untuk Pengguna yang Tidak Memiliki Hak Istimewa?

  3. Bagaimana Cara Menemukan Aplikasi Untuk Tipe Mime Di Linux?

  1. Tabel panggilan sistem Linux atau lembar contekan untuk Majelis

  2. Bagaimana cara meneruskan parameter ke panggilan sistem Linux?

  3. Bagaimana cara mengatur ukuran penunjuk mouse X di Subsistem Windows untuk Linux