Apa yang bit lengket awalnya lakukan ketika diterapkan ke file?

65

Di berbagai tempat orang dapat melihat "bit lengket" dituduh saat ini keliru, karena fungsinya saat ini adalah untuk mempengaruhi izin menulis pada direktori dan bertindak sebagai bendera penghapusan terbatas .

Dalam jawaban AskUbuntu, penjawab menulis bahwa "sedikit lengket biasanya berlaku untuk direktori" . Saya mengamati bahwa memang sistem modern dalam praktiknya tampaknya tidak pernah menerapkannya pada file, tetapi sejak dulu kasus yang biasa terjadi adalah menerapkannya pada file (gambar program yang dapat dieksekusi) daripada ke direktori. (Ketika datang ke kurangnya penggunaan modern pada file, ada pertanyaan terkait di Apakah bit lengket tidak digunakan dalam sistem file saat ini .)

Ini memicu pertanyaan:

Apa yang tidak sedikit lengket diterapkan untuk dieksekusi lakukan? Apakah itu seperti setuid?

Perhatikan bentuk lampau. Ini bukan Bagaimana bit lengket bekerja? sekarang. Begitulah cara kerjanya dulu.

JdeBP
sumber
3
Saya ingin menunjukkan bahwa "Saya mengamati bahwa memang sistem modern dalam praktiknya tidak pernah menerapkannya pada file" hanya berlaku untuk beberapa sistem. Halaman Wikipedia tentang catatan tempel , "Saat ini, perilaku ini hanya berlaku di HP-UX dan UnixWare." Ini memiliki bagan yang menunjukkan berbagai implementasi: utas umum adalah sistem operasi yang mengabaikannya, atau memperlakukannya untuk mengidentifikasi bagaimana memori / swap / dll. harus ditangani. Rincian tentang bagaimana yang digunakan bervariasi di antara sistem operasi. misal, tidak ada sistem Linux yang menggunakan bit sticky seperti jawaban JdeBP.
TOOGAM

Jawaban:

91

Tidak, bit yang lengket tidak seperti flag set-UID atau set-GID. Itu tidak mempengaruhi perubahan apa pun untuk memproses kredensial.

Apa yang dilakukan bit lengket adalah membuat teks program "lengket". Awalnya itu bukan istilah yang salah.

background: bagian gambar program dan teks bersama

Intinya, tanpa masuk terlalu dalam ke detail format file yang dapat dieksekusi (yang dapat, dan memiliki, mengisi buku): Bagian-bagian dari file gambar program yang langsung dimuat ke dalam memori untuk menjalankan program terdiri dari kode mesin, konstanta, startup nilai variabel (yang tidak diinisialisasi), dan (dalam satu bentuk atau lainnya) ruang kosong untuk variabel yang diinisialisasi dan tidak diinisialisasi.

Ini dikelompokkan ke dalam koleksi yang dikenal sebagai "bagian" dan mereka memiliki nama konvensional. Kode mesin dan (kadang-kadang) konstanta membentuk apa yang sering dikenal sebagai bagian "teks" dari gambar program. Variabel yang tidak diinisialisasi nol adalah bagian yang sama, bagian "data"; dan variabel nol-diinisialisasi dan tidak diinisialisasi adalah "bss" (nama yang itu sendiri memiliki sejarah folkloric keseluruhan di belakangnya).

Ketika suatu proses memiliki file gambar yang dapat dieksekusi program dimuat ke dalamnya, berbagai bagian - teks, data, dan bss - diinisialisasi dari isi file gambar.

Apa yang istimewa tentang bagian "teks" adalah bahwa kode mesin (dan konstanta) hampir selalu tidak ditulis. Ini memiliki potensi untuk dibagikan di seluruh gambar memori virtual dari semua proses eksekusi yang memuat file gambar yang dapat dieksekusi itu ke dalamnya. Skenario yang tepat di mana teks program dapat dibagikan berada di luar ruang lingkup untuk jawaban ini dan melibatkan hal-hal seperti idempotensi perbaikan loader dan identitas tata letak ruang alamat. Orang-orang dapat dan memiliki buku-buku tentang hal ini juga. ☺

Teks bersama adalah optimisasi yang digunakan oleh kernel. Ini menghilangkan kebutuhan untuk setiap instance dari gambar program yang berjalan tunggal untuk memiliki gambar memori individualnya sendiri, menggunakan memori fisik yang berharga dengan banyak salinan kode mesin yang sama persis (dan konstanta).

teks tempel

Tetapi orang masih bisa melakukan lebih baik daripada teks yang dibagikan. Jelas, jika selalu ada setidaknya satu proses yang berjalan yang menggunakan gambar program teks bersama tertentu, kernel dapat dengan mudah melampirkan ruang memori virtual proses baru 'ke segmen teks bersama yang ada ketika instance baru dari program dijalankan. Hampir selalu ada instance (katakanlah) /bin/loginatau /bin/shberjalan di suatu tempat pada sistem berukuran sedang, jadi contoh baru dari program login atau shell default dapat dengan mudah melampirkan ke salinan yang dimuat dari segmen teks mereka bahwa kernel telah dimuat ke dalam memori.

Teks tempel memperluas ide ini ke program gambar yang saat ini tidak ada proses yang berjalan . Jika file gambar yang dapat dieksekusi ditandai sebagai teks tempel, maka kernel mempertahankan segmen teksnya setelah proses terakhir untuk menggunakannya; dengan harapan bahwa instance lain dari program akan segera dieksekusi, dan dapat langsung dilampirkan kembali ke segmen.

Dalam Unices awal, segmen teks tempel yang dimuat akan ditukar dengan penyimpanan swap ketika tidak ada proses yang dilampirkan padanya. (Nantinya Unices berhenti menggunakan swap untuk ini.) Anda mungkin juga pernah mendengar ini dengan nama teks yang disimpan .

Tentu saja, mengatur bit teks lengket pada gambar program adalah sesuatu yang harus dilakukan dengan hati-hati. Program apa yang diuntungkan darinya tergantung dari apa yang umumnya digunakan mesin. Dan segmen teks yang saat ini tidak terikat mengambil sumber daya kernel, yang berarti bahwa ada batasan praktis untuk berapa banyak yang dapat dimiliki dalam sistem apa pun. Jadi umumnya merupakan operasi yang membutuhkan hak pengguna super.

keadaan menjadi usang

Ada banyak asumsi yang mendasari operasi teks tempel, yang tidak benar lagi. Membaca segmen pra-dibuat dari penyimpanan swap tidak selalu lebih cepat dari permintaan sederhana dari file gambar yang sebenarnya dapat dieksekusi. Format sistem file menjadi lebih baik untuk pola pembacaan acak (bukan berurutan). Munculnya permintaan paging itu sendiri mengubah hal-hal, seperti halnya hal-hal seperti cache terpadu, perbaikan eksternal non-idempoten yang dihasilkan dari perbedaan dalam pencarian perpustakaan bersama, dan pengacakan tata letak ruang alamat.

Hari-hari bit teks lengket untuk gambar program yang dapat dieksekusi sudah lama berlalu. Bendera penanda teks tempel eksplisit untuk gambar program yang dapat dieksekusi dianggap usang oleh penulis 4.3BSD pada pertengahan 1980-an, misalnya.

Bacaan lebih lanjut

  • Maurice J. Bach (1986). Desain Sistem Operasi UNIX . Prentice-Hall. ISBN 9780132017992.
JdeBP
sumber
1
Jawaban yang sangat bagus! Hari ini saya belajar sesuatu. :)
Andreas Wiese
Saya juga :) Ini kedengarannya seperti apa yang saya tahu TSRpada hari-hari DOS - "mengakhiri dan tetap penduduk". Namun, itu biasanya untuk hal-hal seperti pengandar perangkat yang proses lain yang berjalan kemudian perlu menelepon, dan mungkin usang ketika dunia pindah ke OS multi-threaded / multi-proses.
Steve
1
Ini jawaban yang luar biasa. Di mana saya bisa membaca tentang asal-usul bss?
kucing
1
TSR tidak benar-benar analog. Untuk analog di dunia IBM + Microsoft, lihat DOS + Windows 3.x dalam Mode Standar dan versi 16-bit OS / 2 1.x. The CODEsegmen (dan pada OS / 2 read-only DATAsegmen) dari ongkos dan DLL (biasanya) dibagi di antara semua program yang berjalan. Tidak ada padanan nyata dari "stickiness", sebagian karena 32-bit OS / 2 versi 2.x dan 386 Enhanced Mode menggantikan swapping segmen dengan permintaan memori virtual, seperti yang dilakukan dunia Unix beberapa tahun sebelumnya, di kedua arena yang mempengaruhi perlu untuk segmentasi lengket dalam banyak cara yang sama.
JdeBP
3
@ JdeBP: Pertanyaan "Apakah lengket seperti setuid?" agak luas dan tidak tepat. Saya berpendapat bahwa jawabannya adalah "Yah, agak; ini rumit" karena sembilan bit orde rendah adalah dan mirip: mereka mempengaruhi apakah pengguna tertentu dapat melakukan operasi tertentu pada file. Dan bit set-UID, set-GID dan sticky serupa dalam hal mereka tidak berhubungan dengan apakah suatu operasi diizinkan, tetapi sebaliknya memoderasi beberapa aspek bagaimana hal itu (khususnya, operasi eksekusi) dilakukan.
G-Man