Arquitectura de Computadores II. Máquinas Virtuais - PDF
Download "Arquitectura de Computadores II. Máquinas Virtuais"
Orlando Sales Carrilho
1 Arquitectura de Computadores II 3º Ano Máquinas Virtuais João Luís Ferreira Sobral Departamento do Informática Universidade do Minho Março 2003
2 Máquinas Virtuais Questões que levaram à introdução de máquinas virtuais 1. Como possibilitar a execução de programas em arquitecturas de computadores com conjuntos de instruções diferentes, sem efectuar a recompilação do código fonte? 2. Como garantir que código executável que é descarregado é seguro? 3. Como produzir código compacto, por forma a que seja descarregado rapidamente? 1. Obtenção de código executável portável (sem recompilação das fontes) O código fonte é compilado para um ISA virtual (ISA da máquina virtual), que durante a execução é traduzido para um ISA real As E/S são efectuadas através de chamadas a rotinas pré-definidas (i.é., não existem instruções específicas para E/S) A abordagem tradicional obriga ao desenvolvimento de nº Linguagens x nº de arquitecturas compiladores. Com uma máquina virtual não apenas necessários nº Linguagens compiladores + nº de arq. máquinas virtuais 2. Segurança do código executável O código executável é validado durante a execução ou quando carregado Cada operando tem um tipo associado possibilitando validações adicionais 3. Código compacto Utilizar um ISA que origine instruções com um número reduzido de bits Exemplos de Máquinas Virtuais Smalltalk Digitalk (década de 80) JVM (Java Virtual Machine) SUN (meados de 90) CLR (Common Language Runtime) Microsoft (finais de 90) Arquitectura de Computadores II 2 João Luís Sobral 2003
3 Visão global Máquina de stack (todos os cálculos são efectuados numa pilha) Opcodes de 8 bits (201 definidos, 25 quick, 3 reservados). Grande parte das instruções ocupa apenas 8 bits. Cada instrução identifica o tipo de dados dos operandos, o que melhora a segurança do código Instruções para acesso a elementos de arrays Zona dedicada ao armazenamento de constantes e símbolos Não existem instruções para manipulação directa de endereços de memória (segurança do código!) Tipos de dados byte 8 bits em complemento para 2 short - 16 bits em complemento para 2 int - 32 bits em complemento para 2 long 64 bits em complemento para 2 char 16 bits inteiros sem sinal representando caracteres Unicode float 32 bits IEEE 754 em vírgula flutuante double 64 bits IEEE 754 em vírgula flutuante reference referência para um array ou objecto Zonas de dados PC registo que aponta para a instrução em execução Java stack equivalente à pilha nas linguagens convencionais, contém os parâmetros dos métodos, as variáveis locais e os resultados intermédios Heap contém objectos e arrays Área de métodos contém código dos métodos Área de constantes contém as constantes utilizadas em cada classe e as referências a símbolos externos (semelhante a uma tabela de símbolos, mas com um âmbito alargado) Arquitectura de Computadores II 3 João Luís Sobral 2003
4 Conjunto de Instruções Cada instrução é constituída por um opcode de 8 bits seguido de um ou mais operandos O conjunto de instruções não é ortogonal: algumas instruções operam apenas em operandos específicos Cada instrução é precedida da indicação dos tipos dos operandos A stack frame de cada método contém: Variáveis locais, numeradas de 0, 1, 2,... Uma pilha para manipular os dados, que se encontra vazia quando um método inicia As instruções máquina podem-se referir aos seguintes operandos: 1. valor imediato (imm) 2. variável local (#loc) 3. a pilha 4. a zona de constantes (#cons) 5. endereço de salto (end) Quadro resumo das instruções: Grupo Instrução Tipos de Operandos # Comentário bipush imm8 2 push immediate sipush imm16 3 push immediate Tconst_n i, l, f, d, a 1 push constant 0 or 1 Transferência ldc #cons8 2 push item from constant pool de pop, dup, swap 1 direct operand stack manipulation informação Tload, Tstore #loc8 i, l, f, d, a 2 load/store type T local variable #loc Tload_<n>, Tstore_<n> i, l, f, d, a 1 load/store type T local variable n (0..3) Taload, Tastore b, s, i, l, f, d, c, a 1 load/store array element of type T getfield, putfield #cons16 3 load/store object field Tadd, Tsub, Tmult, Tdiv, i, l, f, d 1 addition, subtract, multiply, divide, Aritméticas Trem, Tneg remainder, NEG Tinc #loc8 Imm8 i 3 increment local var. by Imm8 Lógicas e Tand, Tor, Txor i, l 1 AND, OR, XOR Deslocamento Tshl, Tshr, Tushr i, l 1 shift left logical., right logical, right arth. ifcond end16 cond = eq ne 3 branch to PC + end16 if condz is true if_icmp<cond> end16 lt le gt ge 3 branch to PC + end16 if cond is true Comparação goto end16 3 branch to PC + end16 e salto goto_w end32 5 branch to PC + end32 invokestatic #cons16 3 invoke static method #cons16 Treturn i, l, f, d, a 1 return value of type T from method return 1 return from void method wide 3 gain access to more local variables Outras new #cons16 3 create new object newarray type8 2 create new array of type Arquitectura de Computadores II 4 João Luís Sobral 2003
5 Conjunto de Instruções (exemplos) int x = 2 iconst_2 push 2 istore_0 store into local var #0 (x) int y = 6 bipush 6 push byte 6 istore_1 store into local var #1 (y) int u = x + y iload_1 iadd istore_2 push x push y add local #2 (v) u = add(x,y,-1) // static add(int,int,int) push x iload_1 push y iconst_m1 push -1 invokestatic #1 constant #1 = referência método add istore_2 get result from stack static add(int a, int b,int c) { return(a+b+c); } iload_1 iadd iload_2 iadd ireturn push a push b a + b push c (a + b) + c return integer on stack if ( x < 2 ) x=0; push x iconst_2 push 2 if_icmpge fim x >= 2? iconst_0 push 0 istore_0 x int w[] = new int[3]; w[2] = 4; iconst_3 push 3 newarray int astore_0 w= int[3] aload_0 push w iconst_2 push 2 iconst_4 push 4 iastore Arquitectura de Computadores II 5 João Luís Sobral 2003
6 Exercícios Para cada uma das alíneas seguintes, verifique qual o código gerado pelo compilador 1. Expressões aritméticas a. constantes b. cálculos public class Main { public static void main(string[] str) { int x = 2; int y = 6; int z = 200; int u = ; } z = x + y; z = 3*((x/y) - 2/(z+u)); x++; y <<= 3 2. Invocações de métodos e passagem de parâmetros a. codificação de invocações de métodos b. codificação de métodos static add(int a, int b,int c) { return(a + b + c); } public static void main(string[] str) {... add(x,y,-1); } interprete a informação apresentada com a assinatura do método add 3. Controlo de fluxo 4. Arrays if ( x < 2 ) x=0; boolean flag = ( x < y); for (int i=0; i<10; i++) x++; int w[] = new int[3]; w[2] = 4; w[0]=w[2]; Arquitectura de Computadores II 6 João Luís Sobral 2003
Como construir um compilador utilizando ferramentas Java p. 1/2 Como construir um compilador utilizando ferramentas Java Aula extra A Máquina Virtual Java Prof. Márcio Delamaro delamaro@icmc.usp.br Como
1. Macroarquitetura 2. Emulador do MIC-1 3. O Nível ISA: IJVM. Bibliografia. Teresina - 2011. 3.1. Pilhas 3.2. Conjunto de Instruções IJVM
Universidade Federal do Piauí Centro de Tecnologia Departamento de Engenharia Elétrica Macroarquitetura - Linguagem de Máquina - Prof. Marcos Zurita zurita@ufpi.edu.br www.ufpi.br/zurita Teresina - 2011
Capítulo 4 Nível da microarquitetura Nível acima da lógica digital Função: Implementar a ISA (Instruction Set Architecture) O projeto da microarquitetura depende diretamente da ISA, além dos objetivos