Encontrei algumas explicações sobre o que é "vinculação de endereço" . Eles dizem que "a vinculação de endereços é uma operação de mapeamento de endereços virtuais ou lógicos para endereços físicos".
Esta definição está correta?
Não posso ter certeza se está correto ou não porque uma apresentação da universidade diz que a conversão de endereços virtuais em endereços físicos é realizada em tempo de execução. No entanto, a ligação de endereço diz que a operação de ligação pode ser implementada em tempo de compilação, tempo de carregamento ou tempo de execução.
Isso mostra que há uma contradição.
A explicação no Quora me parece bastante confusa e mistura vários conceitos.
O termo "vinculação de endereço", no contexto de endereços de memória (em oposição a endereços de rede, por exemplo), vem do artigo de Leon Presser e John R. White de 1972 sobre vinculadores e carregadores (consulte também a entrada ACM ), onde é definido do seguinte modo:
Uma leitura rápida pode dar a impressão de que estamos falando de endereços lógicos e físicos do ponto de vista do gerenciamento de memória, mas não é o caso; no artigo, endereços físicos são endereços de “informações” na memória, e endereços lógicos são os símbolos usados para se referir a essas informações. Assim, a ligação de endereço é o que é comumente referido hoje em dia como realocação de símbolo (ou ponteiro) e, como você diz, isso pode acontecer em tempo de compilação (ao gerar um binário estático, por exemplo), em tempo de carregamento (quando o vinculador dinâmico resolve símbolos em uma biblioteca compartilhada) ou em tempo de execução (quando o programa em execução resolve os símbolos manualmente, por exemplo , usando
dlopen
).Esse artigo é confuso. A primeira parte do artigo parece precisa. Os endereços virtuais são usados pelo núcleo da CPU, são mapeados pela MMU para endereços físicos e, em seguida, são usados quando vão para a RAM. Eu nunca ouvi isso ser chamado de "vinculação de endereço". "Mapeamento" seria mais comum, mas isso é apenas uma questão de terminologia.
Depois, há esta afirmação no meio do segundo parágrafo, referindo-se ao processo acima:
Isso não faz sentido.
O código relocável ou independente de posição é necessário na situação em que o código do programa não conhece o endereço virtual em que está localizado, mas precisa levar em consideração que pode ser colocado em qualquer lugar na memória virtual. Isso não tem nada a ver com endereço físico, pois o código do programa em execução no sistema não tem conhecimento deles. Todos os endereços que ele vê são endereços virtuais.
Bibliotecas compartilhadas e randomização de layout de espaço de endereço são os dois casos comuns em que o código independente de posição é necessário. Requer suporte do compilador, pois o código deve ser construído de forma que não possa conter nenhum endereço de memória absoluto, mas faça todos os acessos relativos à sua própria posição ou relativos a alguma posição de base armazenada em um registrador.
Tudo isso acontece dentro da visão do processo do espaço de endereço virtual. Ele precisa de suporte do compilador, pois o próprio código precisa estar ciente disso.
A tradução de endereço virtual pela MMU não requer cooperação do processo. Em vez disso, é tarefa do sistema operacional corrigir os mapeamentos de endereços conforme necessário, por exemplo, se parte do processo for paginada para troca e precisar ser acessada.
A segmentação também foi mencionada, funciona praticamente como o artigo explica, exceto que pelo menos em x86, a segmentação produz endereços virtuais , então o mapeamento de memória virtual para física acontece depois dela.
(Todas as opções acima são baseadas no que sei sobre sistemas x86. Outros sistemas podem ser diferentes.)