View
2
Download
0
Category
Preview:
Citation preview
Arquitetura de Computadores I
Montadores, Ligadores e Carregadores
Edson Moreno
edson.moreno@pucrs.br
http://www.inf.pucrs.br/~emoreno
Visão geral
Fluxo da construção até a execução de um programa
Compiladores
Responsável pela tradução de um programa descrito em linguagem de
alto nível para
Montadores (assembler)
Responsáveis pela tradução do programa escrito em linguagem assembly
Resultado é um programa em linguagem de máquina
Ligadores (linker / Link-editor)
Responsável por unir diferentes partes de um programa
Permite modularizar o desenvolvimento de um programa
Carregadores (loader)
Responsável pela transferência de um programa para a MP
Proposta de uso dos mecanismos
Arquitetura
Montador e Carregador integrados
Código Fonte
Montador
/
Carregador
Memória
Proposta de uso dos mecanismos
Arquitetura
Montador e Carregador independentes
Código Fonte Montador
ExecutávelCarregador
(SO)
Memória
Proposta de uso dos mecanismos
Arquitetura
Montador, Ligador e Carregador independentes
Módulo A
Montador
Ligador
Executável
Módulo B Módulo Z
MontadorMontador
Objeto A Objeto B Objeto C
MemóriaCarregador
SO
Máquina hipotética
Arquitetura
Acumulador (16bits)
PC (16 bits)
Memória de 216 palavras de 16bits
3 formatos de instrução
Conjunto de instruções
Montador (Assembler)
Função
Traduzir programas escritos em linguagem de montagem
(assembly) para linguagem de máquina
Conceitos básicos
Sintaxe típica de programas de montagem
[rótulo] [operação] [operando1] [, operando2] ; comentário
Rótulo
Marcador empregado para definir um endereço da área de código
Operação
Opcodes simbólicos: mnemônico que representa uma instrução
Pseudo instrução: Operação que orienta a atuação do montador
Operandos
Registradores, constantes ou endereços de memória
Montador
Função básica
Substituir Opcodes / mnemônicos por instruções opcodes numéricos
Segue uma tabela de associações
Relaciona o mnemonico com a instrução alvo
Substituir endereços simbólicos por endereços numéricos
Jumps / branches (endereço absoluto ou deslocamento relativo ao pc)
Constantes (valor associado ao ponto do código)
Reserva espaço para dados
De acordo com o tipo associado a cada variável
Geram constantes em memória
Variáveis e constantes (valor associado ao modo de endereçamento do operando)
Algoritmos
Duas passagens
Realiza duas passagens no arquivo fonte
Primeira passagem
Reconhece símbolos definidos pelo programador
o Constrói tabela com símbolos e seus respectivos valores
Segunda passagem
Geração do código objeto
Estrutura de dados empregada
Tabela de instruções
Tabela de diretivas
Tabela de símbolos
Contador de posições
Primeira passagem
Segunda passagem
Ligadores (Linker)
Função
Juntar diferentes arquivos objeto
Gerar um arquivo executável a partir dos objetos
Para isto, deve:
Resolver referências cruzadas
Processo de montagem
Características
Módulos montados de forma independente
Podem ser bibliotecas de funções
Podem fazer uso de funções cujo código não é conhecido
Referência cruzada / não resolvida
Símbolos não conhecidos dentro de um módulo
Montador deve informar este tipo de situação
Cria tabela de uso
Situações devem ser tratadas posteriormente
Tabela de uso
Inserida pelo montador no código objeto gerado
Indica
Símbolos externos que foram utilizados pelo módulo
Onde foram referenciados
Ligador
Utiliza informações para correções necessárias
Deve conhecer o formato do arquivo objeto
Problema
Uma referência não resolvida é um erro?
Para o algoritmo básico do montador sim
Mas pode não ser...
O que fazer?
Considerar todas as referências não resolvidas
Desvantagem é que um erro de montagem somente é detectado na ligação
Incluir diretivas de montagem
Obrigam o programador a declarar explicitamente o que está fazendo o
símbolo
Diretivas
EXTERN
Programador informa quais referências pertencem a outro módulo
Diferencia “símbolo não conhecido” de “símbolo não definido”
Símbolos declarados como EXTERN vão para tabela de uso
Localidade dos símbolos
Locais – Símbolo local ao módulo em que foi definido
Global – Quando definido em um módulo e empregado em outro
Obrigatória sinalização com uma diretiva
o Nesta arquitetura hipotética, utiliza-se a diretiva PUBLIC
o No MARS, emprega-se .GLOBL
Diretivas
PUBLIC
Programador informa símbolos a serem exportados
Símbolo definido localmente mas com escopo global
Resultado é uma tabela de definições
Subconjunto da tabela de símbolos
Incluída no arquivo objeto
Novo algoritmo
Alteração do algoritmo básico
Tabela de símbolos
Deve conter a informação se um símbolo é local ou global
Tratamento de diretivas
Primeira passagem
Insere símbolo na tabela de uso (EXTERN)
Segunda passagem
Insere símbolo na tabela de definições (PUBLIC)
Arquivo objeto
Devem conter informações das tabelas de símbolo e de definições
Tratamento de erro
Redefinição de símbolos (locais e globais devem ter nomes distintos)
Símbolos exportados mas não definidos
Símbolo externo foi exportado
Geração dos módulos
Módulo A
Módulo B
Exemplo MARS
#MAIN.ASM
.text
main:
li $v0 ,5
syscall
sw $v0, valor($zero)
jal print_value
li $v0,10
syscall
.data
.globl valor
valor: .word 1
#FUNC.ASM
.text
.globl print_value
print_value:
lw $a0, valor($zero)
li $v0, 1
syscall
jr $ra
.data
.extern valor 4
Configuração necessária:
1. Salve os arquivos no mesmo diretório
2. Habilite a opção Settings >> Assembly all file in directory
Ligadores
Ligação pode ser realizada de forma
Estática
Realiza duas passagens
Primeira passagem
o Recolhe informações das tabelas de definição
Segunda passagem
o Copia código objeto para executável
o Consulta tabela de uso e resolve referências
Em tempo de carga
Referência a um módulo externo faz com que o carregador
Busque módulo faltante e realize a ligação
Em tempo de execução
Exemplo de emprego deDLLs
Carregador (Loader)
Função
Responsável por copiar um programa para a MP e preparar sua
execução
Tarefas principais
Verificar se o programa existe
Dimensionar a quantidade de memória necessária
Solicitar ao SO a quantidade de memória necessária
Copiar o código para a memória
Ajustar os endereços do código executável
Carregador
Tipicamente integrado com o SO
Tipos de carregadores
Absoluto
Relocador
Dinâmico
Carregador Absoluto
Considera que programa é carregado sempre no mesmo
endereço
Referências específicas a um endereço
Referências definidas em tempo de projeto
Pelo programador ou pelo compilador / montador
Referências criadas pelo programador
Programador deve conhecer a plataforma
Inclusão/alteração de instruções implica em redefinição de endereços
Referências criadas pelo compilador / montador
Emprega símbolos para representar as referências
Carregador Relocador
Programa carregado de forma absoluta impõe restrições
Solução:
Trabalhar com endereços relativos a ponto conhecido
E.g. início do programa
Carga do programa na posição X da memória
Implica em adicionar X a cada uma das referências do programa
Carregador Dinâmico
Problema do emprego de carregador relocador
Não adequado para situações de swapping
Translado de processos entre MP e disco pode maximizar o uso do
processador
Processos não necessariamente retornam a mesma posição de memória
anterior
Solução
Executar relocação no momento em que a posição for referenciada
Endereços devem ser relativos ao início do módulo na memória
Usa registrador específico (registrador de base)
Recommended