Arquitetura e Organizacao de Computadores II

Propaganda
Arquitetura de Computadores I
Montadores, Ligadores e Carregadores
Edson Moreno
[email protected]
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
Memória
Executável
Carregador
(SO)
Proposta de uso dos mecanismos
 Arquitetura
 Montador, Ligador e Carregador independentes
Módulo A
Módulo B
Módulo Z
Montador
Montador
Montador
Objeto A
Objeto B
Objeto C
Ligador
Executável
Carregador
SO
Memória
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
Configuração necessária:
1. Salve os arquivos no mesmo diretório
2. Habilite a opção Settings >> Assembly all file in directory
#MAIN.ASM
.text
#FUNC.ASM
.text
main:
li $v0 ,5
.globl print_value
syscall
sw $v0, valor($zero)
print_value:
jal print_value
lw $a0, valor($zero)
li $v0,10
li $v0, 1
syscall
syscall
jr $ra
.data
.globl valor
.data
valor: .word 1
.extern valor 4
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)
Download