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.
fonte
Respostas:
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/login
ou em/bin/sh
execuçã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
fonte
TSR
nos 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.bss
?CODE
segmentos (e nosDATA
segmentos 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.