Co pierwotnie robił bit lepki po zastosowaniu do plików?

65

W różnych miejscach można zauważyć, że „lepki bit” oskarżany o to, że jest obecnie całkowitym myleniem, ponieważ jego funkcjonalność ma obecnie wpływać na uprawnienia do zapisu w katalogach i działać jak flaga ograniczonego usuwania .

W odpowiedzi AskUbuntu odpowiadający napisał, że „lepki kawałek zwykle dotyczy katalogów” . Zauważyłem, że rzeczywiście współczesne systemy wydają się nigdy nie stosować go do plików, ale dawno temu zwykle stosowano go raczej do plików (obrazów programów wykonywalnych) niż do katalogów. (Jeśli chodzi o niedostatek współczesnego wykorzystania plików, istnieje podobne pytanie na temat Czy lepki bit nie jest używany w obecnych systemach plików ).

To spowodowało pytanie:

Co zrobił lepki bit zastosowany w pliku wykonywalnym? Czy to było wtedy jak setuid?

Zwróć uwagę na czas przeszły. To nie jest jak działa lepki bit? teraz. Tak to wtedy działało.

JdeBP
źródło
3
Chciałbym zauważyć, że „zauważyłem, że w rzeczywistości współczesne systemy wydają się nigdy nie stosować go do plików” dotyczy tylko niektórych systemów. Strona Wikipedii na temat lepkich notatek: „Obecnie takie zachowanie działa tylko w systemach HP-UX i UnixWare”. Ma wykres pokazujący różne implementacje: wspólny wątek to systemy operacyjne ignorujące go lub przetwarzające go w celu zidentyfikowania sposobu, w jaki pamięć / zamiana / itp. powinno być obsługiwane. Szczegółowe informacje na temat tego, jak został wykorzystany, różnią się w zależności od systemu operacyjnego. np. żaden system Linux nigdy nie użył lepkiego bitu, jak odpowiedź JdeBP.
TOOGAM

Odpowiedzi:

91

Nie, lepki bit nie był podobny do flag set-UID lub set-GID. Nie wpłynęło to na żadne zmiany poświadczeń procesu.

To, co zrobiło lepkie, sprawiło, że tekst programu stał się „lepki”. Pierwotnie nie był to błąd.

tło: sekcje obrazu programu i wspólny tekst

Zasadniczo, bez zagłębiania się w szczegóły formatów plików wykonywalnych (które mogą i mają wypełnione książki): Części plików obrazów programów, które są ładowane bezpośrednio do pamięci w celu uruchomienia programów, obejmują kod maszynowy, stałe, uruchomienie wartości (inicjowane niezerowo) zmiennych oraz (w takiej czy innej formie) puste spacje dla zmiennych inicjowanych zerowo i niezainicjowanych.

Są one pogrupowane w kolekcje zwane „sekcjami” i mają konwencjonalne nazwy. Kod maszynowy i (czasami) stałe tworzą tak zwaną sekcję „tekstową” obrazu programu. Zmienne inicjowane niezerowo to podobnie sekcja „dane”; a niezainicjowane i niezainicjowane zmienne to „bss” (nazwa sama w sobie ma za sobą całą historię ludową).

Kiedy proces ma załadowany plik obrazu wykonywalnego programu, różne części - tekst, dane i bss - są inicjowane z zawartości pliku obrazu.

W sekcji „tekst” wyróżnia się to, że kod maszynowy (i stałe) prawie zawsze nie jest zapisywany. Może on być współużytkowany przez obrazy pamięci wirtualnej całego procesu wykonawczego, w którym załadowano plik wykonywalny. Dokładny scenariusz, w którym tekst programu może być udostępniany, jest poza zakresem tej odpowiedzi i obejmuje takie rzeczy, jak idempotence naprawy programu ładującego i tożsamość układu przestrzeni adresowej. Ludzie też mogą pisać książki na ten temat. ☺

Udostępniony tekst to optymalizacja stosowana przez jądro. Eliminuje to potrzebę, aby każda instancja jednego działającego obrazu programu posiadała swój własny indywidualny obraz pamięci, zużywając cenną pamięć fizyczną z wieloma kopiami dokładnie tego samego kodu maszynowego (i stałych).

lepki tekst

Ale można zrobić więcej niż udostępnianie tekstu. Oczywiście, jeśli zawsze działa co najmniej jeden proces korzystający z określonego obrazu programu udostępniającego tekst, jądro po prostu dołącza przestrzeń pamięci wirtualnej nowych procesów do istniejącego segmentu tekstu udostępnionego, gdy uruchamiana jest nowa instancja programu. Prawie zawsze istnieje instancja (powiedzmy) /bin/loginlub /bin/shdziałająca gdzieś w systemie średniej wielkości, więc nowe instancje programu logowania lub domyślnej powłoki mogą po prostu dołączyć do załadowanych kopii ich segmentów tekstowych, które jądro już załadowało do pamięci.

Przyklejony tekst rozszerza ten pomysł na programowanie obrazów, których żaden proces nie jest obecnie uruchomiony . Jeśli plik obrazu wykonywalnego jest oznaczony jako tekst lepki, jądro zachowuje swój segment tekstowy po zakończeniu ostatniego procesu, aby go użyć; w nadziei, że wkrótce zostanie uruchomiona inna instancja programu, i może po prostu ponownie dołączyć do segmentu.

We wczesnych Unicach załadowane segmenty tekstu lepkiego byłyby zamieniane w celu zamiany pamięci, gdy nie był do nich dołączony żaden proces. (Później Unices przestał używać do tego zamiany.) Być może słyszałeś o tym po nazwie zapisanego tekstu .

Oczywiście, ustawienie bitu lepkiego tekstu na obrazie programu należy wykonać ostrożnie. Jakie korzyści z tego czerpią programy, zależą od tego, do czego maszyna jest zwykle używana. A obecnie nieprzyłączone segmenty tekstowe zajmują zasoby jądra, co oznacza, że ​​istnieje praktyczny limit ich liczby w dowolnym systemie. Jest to więc ogólnie operacja wymagająca uprawnień administratora.

desuetude

Istnieje cały szereg założeń, które leżą u podstaw działania lepkiego tekstu, które już nie są prawdziwe. Odczytywanie gotowego segmentu z pamięci wymiany niekoniecznie jest szybsze niż zwykłe stronicowanie na żądanie z rzeczywistego pliku wykonywalnego. Formaty systemu plików stały się lepsze w przypadku losowych (w przeciwieństwie do sekwencyjnych) wzorców odczytu. Pojawienie się stronicowania na żądanie zmienia same rzeczy, podobnie jak ujednolicone pamięci podręczne, nie idempotentne zewnętrzne naprawy wynikające z różnic w wyszukiwaniu w bibliotekach współdzielonych oraz losowość układu przestrzeni adresowej.

Dni przyklejonych bitów tekstu dla obrazów programów wykonywalnych już dawno minęły. Na przykład wyraźna lepka flaga znacznika tekstu dla obrazów programów wykonywalnych została uznana za przestarzałą przez twórców 4.3BSD w połowie lat 80.

Dalsza lektura

  • Maurice J. Bach (1986). Projekt systemu operacyjnego UNIX . Prentice-Hall. ISBN 9780132017992.
JdeBP
źródło
1
Bardzo ładna odpowiedź! Dzisiaj się czegoś nauczyłem. :)
Andreas Wiese
Ja też :) To brzmi jak to, co kiedyś znałem jako TSRDOS - „zakończ i zostań rezydentem”. Jednak zwykle dotyczyło to sterowników urządzeń, które inne wywołane później procesy muszą wywołać, i prawdopodobnie przestarzały, gdy świat przeszedł na wielowątkowe / wieloprocesowe systemy operacyjne.
Steve
1
To niesamowita odpowiedź. Gdzie mogę przeczytać o genezie bss?
kot
1
TSR nie są tak naprawdę analogiczne. Aby zobaczyć analogi w świecie IBM + Microsoft, spójrz na DOS + Windows 3.x w trybie standardowym i 16-bitowej wersji OS / 2 1.x. Te CODEodcinki (i na OS / 2 tylko do odczytu DATAsegmenty) EXE i DLL są (zazwyczaj) dzielone między wszystkich uruchomionych programów. Po części nie ma prawdziwego odpowiednika „lepkości”, ponieważ 32-bitowy system OS / 2 w wersji 2.xi 386 Tryb ulepszony zastąpił zamianę segmentów na pamięć wirtualną stronicowaną na żądanie, podobnie jak świat Unix kilka lat wcześniej, na obu arenach wpływających na potrzeba lepkości segmentacji w podobny sposób.
JdeBP
3
@JdeBP: Pytanie „Czy ten lepki kawałek był jak setuid?” jest raczej szeroki i nieprecyzyjny. Argumentowałbym, że odpowiedź brzmi „Cóż, nieco; to skomplikowane”, ponieważ dziewięć bitów niskiego rzędu było i jest podobnych: wpływają one na to, czy niektórzy użytkownicy mogą wykonywać określone operacje na pliku. A zestaw-UID, zestaw-GID i bity lepkie były podobne, ponieważ nie odnosiły się do tego, czy operacja jest dozwolona, ​​ale zamiast tego moderowały pewien aspekt tego, w jaki sposób została wykonana (konkretnie operacja wykonania).
G-Man,