Arquitetura de Computadores I - PUCRSemoreno/undergraduate/EC/arqi/class_files… · Fluxo da...

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