Auto-relocação - Self-relocation

Na programação de computador, um programa de auto-relocação é um programa que realoca suas próprias instruções e dados dependentes de endereço quando executado e, portanto, é capaz de ser carregado na memória em qualquer endereço. Em muitos casos, o código de auto-relocação também é uma forma de código de auto-modificação .

Visão geral

A auto-relocação é semelhante ao processo de realocação empregado pelo linker - loader quando um programa é copiado do armazenamento externo para a memória principal; a diferença é que é o próprio programa carregado, e não o carregador no sistema operacional ou shell, que realiza a realocação.

Uma forma de auto-relocação ocorre quando um programa copia o código de suas instruções de uma sequência de locais para outra sequência de locais dentro da memória principal de um único computador e, em seguida, transfere o controle do processador das instruções encontradas nos locais de origem da memória com as instruções encontradas nos locais de destino da memória. Como tal, os dados operados pelo algoritmo do programa são a sequência de bytes que definem o programa.

A auto-relocação normalmente acontece no tempo de carregamento (depois que o sistema operacional carregou o software e passou o controle para ele, mas ainda antes de sua inicialização terminar), às vezes também ao alterar a configuração do programa em um estágio posterior durante o tempo de execução .

Exemplos

Carregadores de inicialização

Como exemplo, a auto-relocação é frequentemente empregada nos estágios iniciais de sistemas operacionais de inicialização em arquiteturas como IBM PC compatíveis , onde carregadores de inicialização de cadeia de nível inferior (como o registro mestre de inicialização (MBR), registro de inicialização de volume (VBR) e inicial estágios de inicialização de sistemas operacionais como DOS ) movem-se para fora do lugar para carregar o próximo estágio na memória.

Drivers x86 DOS

No DOS , a auto-realocação às vezes também é usada por drivers mais avançados e RSXs / TSRs carregando-se "alto" na memória superior de forma mais eficaz do que possível para carregadores "altos" fornecidos externamente (como LOADHIGH / HILOAD , INSTALLHIGH / HIINSTALL ou DEVICEHIGH / HIDEVICE etc. desde DOS 5) para maximizar a memória disponível para aplicativos. Isso se deve ao fato de que o sistema operacional não tem conhecimento do funcionamento interno de um driver a ser carregado e, portanto, tem que carregá-lo em uma área de memória livre grande o suficiente para conter todo o driver como um bloco, incluindo seu código de inicialização, mesmo se isso for liberado após a inicialização. Para TSRs, o sistema operacional também precisa alocar um Prefixo de segmento de programa (PSP) e um segmento de ambiente . Isso pode fazer com que o driver não seja carregado na área de memória livre mais adequada ou até mesmo impedir que seja carregado muito alto. Em contraste com isso, um driver de auto-relocação pode ser carregado em qualquer lugar (incluindo na memória convencional ) e, em seguida, realocar apenas sua parte residente (normalmente muito menor) em uma área de memória livre adequada na memória superior. Além disso, os TSRs de auto-relocação avançados (mesmo se já carregados na memória superior pelo sistema operacional) podem ser realocados sobre a maior parte de seu próprio segmento PSP e buffer de linha de comando e liberar seu segmento de ambiente para reduzir ainda mais a pegada de memória resultante e evitar fragmentação . Alguns TSRs com relocação automática também podem alterar dinamicamente sua "natureza" e se transformar em drivers de dispositivo, mesmo se carregados originalmente como TSRs, normalmente também liberando alguma memória. Finalmente, é tecnicamente impossível para um carregador externo realocar os drivers na memória expandida (EMS), na área de alta memória (HMA) ou na memória estendida (via DPMS ou CLOAKING ), porque esses métodos requerem pequenos stubs específicos do driver para permanecer no convencional ou memória superior para coordenar o acesso à área de destino de realocação e, no caso de drivers de dispositivo, também porque o cabeçalho do driver deve permanecer sempre no primeiro megabyte. Para conseguir isso, os drivers devem ser especialmente projetados para suportar a auto-relocação nessas áreas.

Alguns drivers DOS avançados também contêm um driver de dispositivo (que seria carregado em deslocamento + 0000h pelo sistema operacional) e TSR (carregado em deslocamento + 0100h) compartilhando uma parte de código comum internamente como binário fat . Se o código compartilhado não for projetado para ser independente da posição , ele requer alguma forma de correção de endereço interno semelhante ao que, de outra forma, já teria sido executado por um carregador de realocação ; isso é semelhante ao estágio de correção da auto-relocação, mas com o código já sendo carregado no local de destino pelo carregador do sistema operacional (em vez de ser feito pelo próprio driver).

Programas IBM DOS / 360 e OS / 360

O IBM DOS / 360 não tinha a capacidade de realocar programas durante o carregamento. Às vezes, várias versões de um programa eram mantidas, cada uma construída para um endereço de carregamento diferente ( partição ). Uma classe especial de programas, chamada de programas de auto-relocação, foi codificada para se realocar após o carregamento. IBM OS / 360 realocou programas executáveis ​​quando eles foram carregados na memória. Foi necessária apenas uma cópia do programa, mas uma vez carregado, o programa não pôde ser movido (o chamado código independente de posição único ).

Outros exemplos

Como um exemplo extremo de auto-relocação (muitas vezes), é possível construir um programa de computador de forma que ele não permaneça em um endereço fixo na memória, mesmo durante a execução. O Apple Worm é um auto-realocador dinâmico.

Veja também

Notas

Referências

Leitura adicional