O que o pedaço adesivo originalmente fez quando aplicado aos arquivos?

65

Em vários lugares, pode-se ver o "bit pegajoso" acusado de ser atualmente um nome impróprio completo, pois sua funcionalidade atualmente é afetar as permissões de gravação nos diretórios e agir como um sinalizador de exclusão restrito .

Em uma resposta do AskUbuntu, o respondente escreveu que "um pouco persistente geralmente se aplica aos diretórios" . Observei que de fato os sistemas modernos parecem na prática nunca aplicá-lo a arquivos, mas há muito tempo o caso usual era aplicar-se a arquivos (imagem de programa executável) e não a diretórios. (No que diz respeito à escassez de uso moderno em arquivos, há uma pergunta relacionada em É o pouco persistente não usado nos sistemas de arquivos atuais .)

Isso levou à pergunta:

O que um bit adesivo aplicado a um executável fez? Foi como setuid então?

Observe o tempo passado. Não é assim que funciona o bit pegajoso? agora. É como costumava funcionar então.

JdeBP
fonte
3
Eu gostaria de salientar que "observei que, de fato, os sistemas modernos parecem na prática nunca aplicá-lo a arquivos" é verdade apenas para alguns sistemas. A página da Wikipedia em notas adesivas , "Atualmente, esse comportamento funciona apenas no HP-UX e no UnixWare". Ele possui um gráfico mostrando várias implementações: o thread comum é o sistema operacional ignorando-o ou tratando-o para identificar como a memória / swap / etc. deve ser manuseado. Os detalhes de como isso foi usado variam entre os sistemas operacionais. por exemplo, nenhum sistema Linux jamais usou a parte difícil como a resposta do JdeBP.
TOOGAM

Respostas:

91

Não, o bit adesivo não era como os sinalizadores set-UID ou set-GID. Não efetuou nenhuma alteração no processo de credenciais.

O que a parte pegajosa fez foi tornar o texto do programa "pegajoso". Não era um nome impróprio, originalmente.

background: seções da imagem do programa e texto compartilhado

Em essência, sem se aprofundar nos detalhes dos formatos de arquivo executável (que podem e têm livros preenchidos): As partes dos arquivos de imagem do programa que são carregadas diretamente na memória para executar programas incluem código de máquina, constantes e a inicialização valores de variáveis ​​(não inicializadas com zero) e (de uma forma ou de outra) espaços em branco para variáveis ​​inicializadas com zero e não inicializadas.

Eles são agrupados em coleções conhecidas como "seções" e possuem nomes convencionais. O código da máquina e (às vezes) as constantes formam o que é conhecido como a seção "texto" de uma imagem de programa. As variáveis ​​não inicializadas com zero são, da mesma forma, a seção "dados"; e as variáveis ​​inicializadas com zero e não inicializadas são "bss" (um nome que por si só tem toda uma história folclórica).

Quando um processo tem um arquivo de imagem executável do programa carregado, as várias partes - texto, dados e bss - são inicializadas a partir do conteúdo do arquivo de imagem.

O que há de especial na seção "texto" é que o código da máquina (e as constantes) quase sempre não é gravado. Ele tem o potencial de ser compartilhado pelas imagens de memória virtual de todos os processos em execução que tiveram o arquivo de imagem executável carregado nelas. O cenário exato em que o texto do programa pode ser compartilhado está fora do escopo desta resposta e envolve itens como idempotência de correção do carregador e identidade do layout do espaço de endereço. As pessoas também podem e escreveram livros sobre esse assunto. ☺

Texto compartilhado é uma otimização empregada pelo kernel. Isso elimina a necessidade de cada instância de uma única imagem de programa em execução ter sua própria imagem de memória individual, consumindo preciosa memória física com várias cópias do mesmo código de máquina (e constantes).

texto pegajoso

Mas é possível fazer melhor ainda do que o texto compartilhado. Obviamente, se sempre há pelo menos um processo em execução que está usando uma imagem de programa de texto compartilhado específica, o kernel simplesmente anexa o espaço de memória virtual dos novos processos ao segmento de texto compartilhado existente quando uma nova instância do programa é executada. Quase sempre há uma instância (digamos) /bin/loginou em /bin/shexecução em algum lugar de um sistema de tamanho médio, para que novas instâncias do programa de login ou do shell padrão possam simplesmente anexar às cópias carregadas de seus segmentos de texto que o kernel já carregou na memória.

O texto colado estende essa idéia para programar imagens que nenhum processo está em execução no momento . Se um arquivo de imagem executável estiver marcado como texto fixo, o kernel manterá seu segmento de texto após o último processo para usá-lo; na esperança de que outra instância do programa seja executada em breve e possa ser anexada novamente ao segmento.

Nos primeiros Unices, os segmentos de texto colado carregados eram trocados para trocar armazenamento quando nenhum processo era anexado a eles. (Os Unices posteriores pararam de usar swap para isso.) Você também deve ter ouvido falar disso pelo nome texto salvo .

Obviamente, definir o bit de texto em uma imagem de programa é algo que deve ser feito com cuidado. Quais programas se beneficiam disso dependem do uso geral da máquina. E, atualmente, os segmentos de texto não anexados consomem recursos do kernel, o que significa que há um limite prático para quantos se pode ter em qualquer sistema. Portanto, geralmente é uma operação que requer privilégios de superusuário.

desuso

Existe um monte de suposições subjacentes à operação de texto colado, que simplesmente não são mais verdadeiras. A leitura de um segmento pré-fabricado do armazenamento de troca não é necessariamente mais rápida do que a simples demanda de paginação do arquivo de imagem executável real. Os formatos do sistema de arquivos tornaram-se melhores para padrões de leitura aleatórios (em oposição a seqüenciais). O advento da paginação por demanda em si muda as coisas, assim como caches unificados, correções externas não idempotentes resultantes de diferenças na pesquisa de biblioteca compartilhada e aleatória no layout do espaço de endereço.

Os dias de bits de texto fixo para imagens de programas executáveis ​​já se foram. Um sinalizador de marcador de texto explícito para imagens de programas executáveis ​​foi considerado obsoleto pelos autores do 4.3BSD em meados da década de 1980, por exemplo.

Leitura adicional

  • Maurice J. Bach (1986). O design do sistema operacional UNIX . Prentice-Hall. ISBN 9780132017992.
JdeBP
fonte
11
Resposta muito boa! Hoje eu aprendi alguma coisa. :)
Andreas Wiese
Eu também :) Isso parece muito com o que eu costumava conhecer TSRnos dias do DOS - "encerrar e permanecer residente". No entanto, isso costumava ser chamado de drivers de dispositivo que outros processos executados posteriormente precisam chamar e provavelmente obsoletos quando o mundo mudou para sistemas operacionais com vários processos / multiencadeados.
30616 Steve Steve
11
Esta é uma resposta incrível. Onde posso ler sobre a gênese de bss?
cat
11
TSRs não são realmente análogos. Para análogos no mundo IBM + Microsoft, procure o DOS + Windows 3.x no Modo Padrão e o OS / 2 versão 16x 1.x. Os CODEsegmentos (e nos DATAsegmentos somente leitura do OS / 2 ) de EXEs e DLLs são (geralmente) compartilhados entre todos os programas em execução. Não existe um equivalente real de "aderência", em parte porque o OS / 2 versão 2.xe o Modo Avançado 386 substituíram a troca de segmentos pela memória virtual paginada por demanda, assim como o mundo Unix havia vários anos antes, nas duas áreas que afetavam o necessidade de viscosidade de segmentação da mesma maneira.
JdeBP
3
@JdeBP: A pergunta "O bit pegajoso era como setuid?" é bastante amplo e impreciso. Eu diria que a resposta é "Bem, um tanto; é complicado" porque os nove bits de ordem inferior eram e são semelhantes: eles afetam se determinados usuários podem executar determinadas operações em um arquivo. E os bits set-UID, set-GID e sticky eram semelhantes por não se relacionarem com a possibilidade de uma operação, mas moderavam alguns aspectos de como ela (especificamente, a operação de execução) era executada.
G-Man