Yapışkan bit, dosyalara uygulandığında ilk başta ne yaptı?


65

İşlevselliği gibi çeşitli yerlerde bir, günümüzde tam bir yanlış isim olmakla suçlanan "yapışkan bit" görebilirsiniz bugünlerde bir şekilde dizinleri ve hareket üzerine yazma izinlerini etkileyecek olan kısıtlı silme bayrağı.

Bir AskUbuntu cevabında cevaplayıcı, "yapışkan bir bit genellikle dizinlere uygulanır" yazdığını yazdı . Gerçekten modern sistemlerin pratikte hiçbir zaman dosyalara uygulanmadığını, ancak uzun zaman önce olağan durumun dizinlerden ziyade (çalıştırılabilir program görüntüsü) dosyalara başvurması olduğunu gözlemledim . (Dosyalarda modern kullanımın yetersizliği söz konusu olduğunda, mevcut dosya sistemlerinde kullanılmayan yapışkan bit mi? İle ilgili bir soru var .)

Bu soru sordu:

Bir çalıştırılabilir dosyaya uygulanan yapışkan bir bit ne yaptı ? O zaman setuid gibi miydi?

Geçmiş zamana dikkat edin. Bu yapışkan bit nasıl çalışır? şimdi. O zamanlar böyle çalışırdı.


3
"Gerçekten modern sistemlerin pratikte dosyalara uygulamaz gibi göründüğünü gördüm" sadece bazı sistemler için geçerli olduğunu belirtmek isterim. Vikipedi sayfasındaki yapışkan bit notları, "Şu anda, bu davranış yalnızca HP-UX ve UnixWare'de etkindir." Çeşitli uygulamaları gösteren bir çizelgesi var: ortak iş parçacığı, onu görmezden gelen işletim sistemleridir ya da belleği / takas / vb'yi tanımlamak için onu tedavi eder. ele alınmalı. Nasıl kullanıldığının detayları işletim sistemleri arasında farklılık gösterir. Örneğin, hiçbir Linux sistemi hiçbir zaman JdeBP'nin yanıtı gibi yapışkan kısmı kullanmamıştır.
TOOGAM

Yanıtlar:


91

Hayır, yapışkan bit, set-UID veya set-GID flagları gibi değildi. Kimlik bilgilerinde herhangi bir değişiklik yapılmamıştır.

Yapışkan bit program metnini “yapışkan” yapmaktı. Başlangıçta bir yanlış isim değildi.

arka plan: program görüntüsü bölümleri ve paylaşılan metin

Temel olarak, çalıştırılabilir dosya formatlarının ayrıntılarına fazla girmeden (kitapları doldurabilen ve dolduranlar): Programları çalıştırmak için doğrudan belleğe yüklenen program görüntüsü dosyalarının parçaları, makine kodunu, sabitleri, başlangıcı içerir. sıfır sıfırlanmamış ve başlatılmamış değişkenler için (sıfır olmayan başlatılmış) değişkenlerin değerleri (ve bir biçimde veya başka şekilde) boşluklar.

Bunlar "bölümler" olarak bilinen koleksiyonlar halinde gruplandırılmıştır ve geleneksel adlara sahiptirler. Makine kodu ve (bazen) sabitler, genellikle program görüntüsünün "metin" bölümü olarak bilinen şeyi oluşturur. Sıfırlanmamış sıfır değişkenler, benzer şekilde "veri" bölümüdür; ve sıfır başlatılmış ve başlatılmamış değişkenler "bss" dir (arkasında arkasındaki tüm folklorik geçmişe sahip bir isim).

Bir işlemin içine programlanabilir bir görüntü dosyası yüklendiğinde, çeşitli parçalar - metin, veri ve bss - görüntü dosyasının içeriğinden başlatılır.

"Metin" bölümünün özel özelliği, makine kodunun (ve sabitlerin) neredeyse her zaman yazılmamasıdır. Çalıştırılabilir görüntü dosyasına yüklenmiş tüm yürütme işlemlerinin sanal bellek görüntüleri arasında paylaşılma potansiyeli vardır . Program metninin paylaşılabildiği tam senaryo bu cevap için kapsam dışındadır ve yükleyici onarımı belirsizlik ve adres alanı düzeni kimliği gibi şeyleri içerir. İnsanlar da bu konuda da kitaplar yazmış ve yazmışlardır. ☺

Paylaşılan metin, çekirdek tarafından kullanılan bir optimizasyondur. Tek bir çalışan program görüntüsünün her bir örneğinin kendi bireysel bellek görüntüsüne sahip olma gereksinimini ortadan kaldırır, aynı makine kodunun (ve sabitlerinin) birden fazla kopyasıyla birlikte değerli fiziksel bellek kullanır.

yapışkan metin

Ancak bir kişi hala paylaşılan metinden daha iyisini yapabilir. Açıkçası, belirli bir paylaşılan metin programı görüntüsünü kullanan en az bir işlem yürütülürse, çekirdek programın yeni bir örneği çalıştırıldığında, yeni işlemlerin sanal bellek alanını varolan paylaşılan metin bölümüne eklemek için kullanılır. Bir örneği (diyelim) hemen hemen her zaman var /bin/loginya /bin/shçalıştıran bir yere orta ölçekli bir sistemde, giriş programı ya da sadece çekirdek zaten belleğe yüklendikten onların metin bölümlerinin yüklü kopyalarına ekleyebileceğiniz varsayılan kabuk çok yeni örneklerini.

Yapışkan metin, bu fikri , şu anda hiçbir işlemin çalışmadığı görüntüleri programlamak için genişletir . Yürütülebilir bir görüntü dosyası yapışkan metin olarak işaretlenmişse, çekirdek son kullanımdan sonra metin bölümünü etrafında tutar; umarım programın bir başka örneği de yakında çalıştırılacak ve tekrar segmente eklenebilir.

Unices'in ilklerinde, yüklü yapışkan metin bölümleri, hiçbir işlem eklenmemişse depolamayı değiştirmek için değiştirilirdi. (Daha sonra Unices bunun için takas kullanmayı bıraktı.) Bunu, kaydedilmiş olan addan da duymuş olabilirsiniz .

Elbette, yapışkan metin bitini bir program görüntüsüne ayarlamak, dikkatle yapılması gereken bir şeydir. Hangi programlardan faydalanacağı, makinenin genel olarak ne için kullanıldığına bağlıdır. Ve şu anda eklenmemiş metin bölümleri çekirdek kaynaklarını alır, bu da herhangi bir sistemde kaç kişinin sahip olabileceğine dair pratik bir sınır olduğu anlamına gelir. Bu yüzden genellikle süper kullanıcı ayrıcalıkları gerektiren bir işlemdir.

kullanmama

Yapışkan metnin çalışmasının altında yatan ve artık doğru olmayan bir sürü varsayım var. Önceden yapılmış bir segmentin takas deposundan okunması, gerçek yürütülebilir görüntü dosyasındaki basit talep sayısından daha hızlı olmak zorunda değildir. Dosya sistemi formatları rastgele (sıralı olarak) okuma düzenleri için daha iyi hale geldi. Talep çağrı uygulamasının ortaya çıkışı, birleştirilmiş önbellek, ortak kütüphane araştırmasındaki farklılıklardan kaynaklanan belirsiz dış düzeltmeler ve adres düzenleme düzeni rastgele seçim gibi şeyleri değiştirir.

Yürütülebilir program görüntüleri için yapışkan metin bitlerinin günleri geride kaldı. Örneğin, 1980'lerin ortalarında, 4.3BSD yazarları tarafından çalıştırılabilir program görüntüleri için açık bir yapışkan metin işaretleyici bayrağı kullanılmıyordu.

daha fazla okuma

  • Maurice J. Bach (1986). UNIX İşletim Sisteminin Tasarımı . Prentice-Hall. ISBN 9780132017992.

1
Çok güzel cevap! Bugün bir şey öğrendim. :)
Andreas Wiese

Ben de :) Bu TSR, DOS günlerinde eskiden bildiğim gibi geliyor - "sonlandır ve ikamet et". Ancak, bu genellikle daha sonra çalıştırılan diğer işlemlerin çağırması gereken aygıt sürücüleri gibi şeyler içindi ve dünya çok iş parçacıklı / çok işlemcili işletim sistemlerine geçtiğinde muhtemelen eskidi.
Steve

1
Bu harika bir cevap. Oluşumunu nereden okuyabilirim bss?
kedi

1
TSR'ler gerçekten benzer değildir. IBM + Microsoft dünyasındaki analoglar için, Standart Modda DOS + Windows 3.x ve 16 bit OS / 2 sürüm 1.x'e bakın. CODESegmentler (ve OS / 2 salt okunur üzerinde DATAEXE'ler ve dll kesimleri) (genellikle) çalışan tüm programlar arasında paylaşılır. Kısmen 32-bit işletim sistemi / 2 sürüm 2.x ve 386 Geliştirilmiş Mod'un değiştirilmiş segmenti değiştirmesi nedeniyle, gerçek bir "yapışkanlık" eşdeğeri yoktur, çünkü Unix dünyasının birkaç yıl önce olduğu gibi, her iki alanda da etkilenen her iki alanda aynı şekilde segmentasyon yapışkanlığına ihtiyaç vardır.
JdeBP

3
@JdeBP: "Yapışkan bit setuid gibi miydi?" oldukça geniş ve kesin değildir. Cevabın "Peki, biraz; karmaşık." Olduğunu iddia ediyorum, çünkü düşük dereceli dokuz bit ve benzerdi: belirli kullanıcıların bir dosya üzerinde belirli işlemleri yapıp yapamayacağını etkilerler . Ve ayar UID set-GID ve yapışkan bit bunlar ilgili yoktu benzerdi olup , bir işleme izin, bunun yerine bir yönünü yönetilir kadar gerçekleştirilmiştir o (spesifik olarak, operasyon yürütme).
G-Man
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.