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)