Universidade de Evora´ Escola de Cienciasˆ e Tecnologia

Mestrado em Engenharia Inform´atica

Disserta¸c˜ao

Simulador para Arquitectura MIPS32

David Jo˜aoDomingues Rodrigues Maia

Orientador Miguel Jos´eSim˜oesBar˜ao

Mar¸code 2013

Mestrado em Engenharia Inform´atica

Disserta¸c˜ao

Simulador para Arquitectura MIPS32

David Jo˜aoDomingues Rodrigues Maia

Orientador Miguel Jos´eSim˜oesBar˜ao

Quero dedicar este modesto trabalho aos meus trˆesav´os,que j´apartiram para um lugar melhor. A Jos´eJo˜aoPedro da Con- cei¸c˜aoBelezas, uma vez que nasceu com ele a minha vontade de estudar engenharia e a Jos´eda Costa Maia e Ant´onioAugusto Nu- nes Domingues que sempre foram uma ins- pira¸c˜aoem tempos dif´ıceis. Sum´ario

A virtualiza¸c˜aode sistemas ´ecada vez mais utilizada no mundo inform´atico. O seu em- prego acarreta in´umerasvantagens, sendo que, em alguns casos, permite atingir melhor desempenho relativamente a uma m´aquinanativa.

Esta tese prop˜oeum modelo de implementa¸c˜aode um simulador da arquitectura MIPS32 utilizando a linguagem de programa¸c˜aoC, sendo as aplica¸c˜oesde teste desenvolvidas uti- lizando a linguagem assembly MIPS. E´ objectivo recriar os primeiros passos no processo de virtualiza¸c˜aode sistemas, assim como possibilitar a instala¸c˜aode um minissistema operativo, baseado na fam´ılialinux, no simulador. Para tal, ser´anecess´arioreproduzir o comportamento de v´arios dispositivos f´ısicos, tais como o disco r´ıgido, interface de rede, TLB, cache, rato, teclado e monitor. Embora estes sejam dispositivos desej´aveis, apenas o processador e a mem´oriaRAM s˜aocomponentes fulcrais ao funcionamento do simulador.

De forma a respeitar os requisitos m´ınimosda arquitectura ser˜aoimplementados todos os mecanismos necess´arios, nomeadamente, coprocessadores, modos de opera¸c˜ao,registos gen´ericose registos do coprocessador central, unidade de gest˜aode mem´oria,mecanismo de tradu¸c˜aode endere¸cos,sistema de excep¸c˜oese sistema de interrup¸c˜oes.

i

Simulator for the MIPS32 Architecture

Abstract

Virtualization systems are increasingly used in the computer world. Their use brings numerous advantages and, in some cases, allows to achieve better performance compared to a native machine.

This thesis proposes an implementation model of a simulator for MIPS32 architecture using the C programming language and the test applications developed using the MIPS assembly language. The aim is to recreate the first steps in the process of virtualization systems, as well as to enable the installation of a -based mini in the simulator. This will need to reproduce the behavior of several physical devices such as hard disk, network interface, memory management unit including a translation lookaside buffer (TLB), cache, mouse, keyboard, monitor. Although these devices are desirable, only the processor and main memory RAM are key components to the operation of the simulator.

In order to meet the minimum requirements of the architecture, all the necessary me- chanisms will be implemented including coprocessors, operating modes, generic registers and records of the central coprocessor, memory management unit, address translation mechanism and the exception and interruption systems.

iii

Pref´acio

Este documento cont´ema disserta¸c˜aointitulada “Simulador para a Arquitectura MIPS32”, entregue em Outubro de 2012 no ˆambito do Mestrado em Engenharia Inform´aticado autor David Jo˜aoDomingues Rodrigues Maia1, na Universidade de Evora,´ em Portugal. O autor ´eLicenciado em Engenharia Inform´atica,tamb´empela Universidade de Evora.´ Actualmente ´eadministrador de sistemas de informa¸c˜aona empresa Deloitte, BPAS - AMS, em Portugal.

O orientador deste trabalho ´eo Professor Doutor Miguel Jos´eSim˜oesBar˜ao2, Professor auxiliar no Departamento de Inform´aticada Universidade de Evora.´

[email protected] [email protected]

v

Agradecimentos

Com o desenvolvimento do trabalho final de Mestrado culmina uma importante fase na vida de qualquer estudante. Desta forma, gostaria de dedicar umas palavras de apre¸co a um conjunto de pessoas, que directa ou indirectamente, ajudaram no desenvolvimento do presente trabalho.

Aos meus pais e irm˜ao,um grande agradecimento pelo amor incondicional, assim como pelo enorme esfor¸coe sacr´ıficosfeitos ao longo desta fase, sem os quais nada disto seria poss´ıvel. Muito obrigado Pai, M˜aee Jo˜ao!

Quero agradecer ao meu orientador, Professor Miguel Bar˜ao,pelo incessante apoio, com- preens˜aoe claramente pela disponibilidade demonstrada ao longo do desenvolvimento de todo o trabalho. Muito obrigado professor Miguel Bar˜ao!

Gostaria de agradecer especialmente `aminha namorada Renata Carmona, pelo constante apoio e dedica¸c˜aono desenvolvimento da disserta¸c˜ao,sem o qual n˜aoteria sido poss´ıvel a entrega a tempo. Um muito obrigado e um beijo especial!

Aos meus colegas e amigos, Daniel Quina, Alexandre Cabo, Laura Sim˜oes, Nelson Dias e Hugo Teodoro, gostaria de agradecer pelo incentivo, conselhos e pela troca de ideias, muito importantes na resolu¸c˜aode problemas, assim como pelo suporte no desenvolvi- mento pr´atico.Obrigado a todos!

vii

Nota¸c˜aoe s´ımbolos

|| Concatena¸c˜aode bits numa palavra de 32 bits. xy..z Selec¸c˜aodos bits desde y at´ez da palavra de 32 bits X. 0bn Valor da constante n em base 2. (Bin´ario) 0xn Valor da constante n em base 16. (Hexadecimal)

OR Opera¸c˜aoL´ogicaOR AND Opera¸c˜aoL´ogicaAND XOR Opera¸c˜aoL´ogicaXOR NOR Opera¸c˜aoL´ogicaNOR

USEG Espa¸code mem´oriavirtual mapeada destinado ao modo de opera¸c˜ao user. KSEG0 Espa¸code mem´oriavirtual n˜aomapeada com utiliza¸c˜aode cache destinado ao modo de opera¸c˜ao kernel. Este segmento aponta para os primeiros 512 Bytes na mem´oriaRAM. KSEG1 Espa¸code mem´oriavirtual n˜aomapeada sem utiliza¸c˜aode cache destinado ao modo de opera¸c˜ao kernel. KSSEG Espa¸code mem´oriavirtual mapeado destinado ao modo de opera¸c˜ao superuser e kernel. KSEG3 Espa¸code mem´oriavirtual mapeada destinado ao modo de opera¸c˜ao kernel.

CP0..3 Coprocessador 0 ... 3 SEL Vari´avel utilizada pelo processador para identificar o sub registo associado ao registo interno do CP0.

ix

Acr´onimos

ALU Arithmetic Logic Unit

CISC Complex Instruction Set Computer

CPU Central Processing Unit

ELF Executable Linkable Format

FMT Fixed Map Translation

FPU Floating Point Unit

GPR General Purpose Register

GPT Global Page Table

IF Instruction Fetch

IPC Inter Process Communication

ISA Instruction Set Architecture

LSB Least Significant Byte

MEM Memory

MIPS Microprocessor without Interlocked Pipeline Stages

MMU Memory Management Unit

MSB Most Significant Byte

xi xii

PC Program Counter

PFN Physical Frame Number

PRA Privileged Resource Architecture

PTB Page Table Base

PTE Page Table Entry

PTL Page Table Limit

RAM Random Access Memory

RISC Reduced Instruction Set Computer

ROM Read Only Memory

RD Read Registers

TLB Translation Lookaside Buffer

VPN Virtual Page Number

VMM Virtual Machine Monitor

WB Write Back Conte´udo

Sum´ario i

Abstract iii

Pref´acio v

Agradecimentos vii

Nota¸c˜aoe s´ımbolos ix

Acr´onimos xii

1 Introdu¸c˜ao1 1.1 Enquadramento e Motiva¸c˜ao...... 1 1.2 Objectivos...... 3

2 Estado da Arte e Conceitos Envolvidos5 2.1 Virtualiza¸c˜aode Sistemas...... 5 2.2 T´ecnicasde tradu¸c˜aoe compila¸c˜aode instru¸c˜oes...... 13 2.3 Comunica¸c˜aoentre processos (IPC)...... 16 2.3.1 Named e Unnamed Pipes...... 16 2.4 Executable and Linkable Format (ELF)...... 18 2.4.1 Organiza¸c˜aode ficheiros ELF...... 18

xiii xiv CONTEUDO´

2.4.2 Interpreta¸c˜aode ficheiros ELF...... 22

3 Sistema Proposto 25 3.1 Apresenta¸c˜ao...... 25 3.1.1 O que se pretende...... 26 3.1.2 Metodologias...... 28 3.2 Arquitectura...... 30 3.2.1 M´odulosdo Sistema...... 31 3.2.2 Plataforma de desenvolvimento...... 33

4 M´odulos 35 4.1 Processador...... 36 4.1.1 Modos de Execu¸c˜ao...... 39 4.1.2 Endianness...... 42 4.1.3 Interpreta¸c˜aode c´odigom´aquina...... 45 4.1.4 Pipelines...... 52 4.1.5 Coprocessadores...... 57 4.1.6 Registos Gen´ericos...... 57 4.1.7 Registos do Coprocessador Central...... 59 4.1.8 Mecanismo de Excep¸c˜oes...... 72 4.2 Unidade de Gest˜aode Mem´oria(MMU)...... 92 4.2.1 Mem´oriaVirtual...... 92 4.2.2 Pagina¸c˜ao...... 95 4.2.3 Simula¸c˜aoem Software...... 100 4.3 Mecanismo de Tradu¸c˜aode Endere¸cos(TLB)...... 104 4.3.1 Interface de comunica¸c˜aoMMU/TLB...... 105 4.3.2 Instru¸c˜oesde controlo MMU/TLB...... 109 4.3.3 TLB Flush vs ASID’s...... 110 4.3.4 Excep¸c˜oesda TLB...... 112 4.3.5 Simula¸c˜aoem Software...... 116 4.4 Mem´oriasRAM e ROM...... 121 4.4.1 Simula¸c˜aoem Software...... 123 CONTEUDO´ xv

4.5 Simulador UE...... 127 4.5.1 Carregamento e arranque do sistema...... 127 4.5.2 Execu¸c˜ao...... 133 4.5.3 T´ermino de Execu¸c˜ao...... 134

5 Utiliza¸c˜aodo Sistema 137 5.1 Interface e funcionamento...... 138 5.2 Demonstra¸c˜oes...... 142 5.2.1 C´alculodo factorial em modo e zona de Kernel ...... 142 5.2.2 C´alculoda sequˆenciade Fibonacci em modo e zona de User .... 146 5.2.3 Casos de erro e mecanismos MIPS...... 151 5.2.4 C´alculode n´umerosprimos em C (GCC)...... 157

6 Conclus˜oes 161 6.1 Objectivos alcan¸cados...... 161 6.2 Limita¸c˜oes...... 163 6.3 Compara¸c˜aocom trabalhos relacionados...... 164 6.4 Trabalho Futuro...... 168

Bibliografia 172

A Compila¸c˜aode c´odigobin´ario- Makefile 175

B C´odigoAssembler MIPS - Demonstra¸c˜ao1 177

C C´odigoAssembler MIPS - Demonstra¸c˜ao2 181

D C´odigoAssembler MIPS - Demonstra¸c˜ao 3 185

E C´odigoAssembler MIPS - Demonstra¸c˜ao4 193

Lista de Figuras

2.1 Hypervisor tipo 1...... 6 2.2 Hypervisor tipo 2...... 7 2.3 Camadas da emula¸c˜aode sistemas...... 8 2.4 Camadas de virtualiza¸c˜aode sistemas completa ou nativa...... 9 2.5 Camadas em sistemas paravirtualizados...... 11 2.6 Arquitectura Intel VT-x/ VT-i...... 12 2.7 Estrutura de compila¸c˜aopara a linguagem Java...... 14 2.8 Arquitectura do emulador QEMU...... 15 2.9 Comunica¸c˜aocom Pipelines Unix...... 17 2.10 Formato de um ficheiro bin´arioELF...... 19

3.1 Camadas de abstra¸c˜ao...... 26 3.2 M´odulosdo SimuladorUE...... 31

4.1 M´aquinade estados da execu¸c˜aono processador...... 38 4.2 Tipos de dados no SimuladorUE...... 43 4.3 Little Endian...... 44 4.4 Big Endian...... 44 4.5 Pipeline de instru¸c˜ao´unicacom profundidade 1...... 54 4.6 Pipeline paralelo com profundidade 5...... 54 4.7 Super pipeline com profundidade 5...... 55

xvii xviii LISTA DE FIGURAS

4.8 Pipeline Superescalar...... 55 4.9 STACK para modo de execu¸c˜aoKernel em sistemas Linux...... 77 4.10 Diagrama de actividade para as excep¸c˜oes Reset, Soft Reset e NMI.... 89 4.11 Diagrama de actividade para as excep¸c˜oesdiferentes de Reset, Soft Reset e NMI...... 91 4.12 Estrutura da mem´oriavirtual para arquitecturas de 32 bits...... 93 4.13 Mecanismo de tradu¸c˜aoem sistemas com pagina¸c˜ao...... 97 4.14 Mecanismo de pagina¸c˜aolinear...... 98 4.15 Mecanismo de pagina¸c˜aomultin´ıvel...... 99 4.16 Escalonamento de processos com ASID...... 111 4.17 Diagrama de sequˆenciapara a tradu¸c˜aode endere¸cosvirtuais em en- dere¸cosf´ısicos...... 119 4.18 Disposi¸c˜aoda mem´oriaRAM...... 123 4.19 Introdu¸c˜aode um novo bloco na RAM...... 125 4.20 Disposi¸c˜aodos canais no simulador...... 130

5.1 Desenvolvimento e compila¸c˜aode programas para o SimuladorUE..... 139 5.2 Terminal VMM do simuladorUE...... 140 5.3 Fun¸c˜oesdo SimuladorUE...... 141 5.4 Execu¸c˜aodo exemplo 1...... 144 5.5 Valida¸c˜aodos resultados...... 145 5.6 Execu¸c˜aodo exemplo2...... 148 5.7 Registos gen´ericos...... 149 5.8 Registos internos do coprocessador zero...... 150 5.9 Excep¸c˜aoMachine Check...... 152 5.10 Excep¸c˜aoAddress Error...... 153 5.11 Excep¸c˜aoTLBL (TLB Refill)...... 154 5.12 Excep¸c˜aoCoprocessor Unusable...... 155 5.13 Excep¸c˜aoSystem Call...... 156 5.14 Registos gen´ericos...... 159 5.15 Execu¸c˜aodo exemplo 4...... 160

6.1 Tradu¸c˜aobin´ariadin˜amicados simuladores QEMU e SimuladorUE.... 166 Lista de Tabelas

2.1 Tabela com tipos de architectura definidos para o formato ELF...... 20

4.1 Codifica¸c˜aopara a instru¸c˜aoADDI...... 45 4.2 Codifica¸c˜aopara a instru¸c˜aoADD...... 45 4.3 Codifica¸c˜aopara a instru¸c˜aoMFC0...... 46 4.4 Codifica¸c˜aopara a instru¸c˜aoTLBR...... 46 4.5 Tabela de codifica¸c˜aoOPCODE...... 47 4.6 Tabela de codifica¸c˜aoSPECIAL...... 47 4.7 Tabela de codifica¸c˜aoSPECIAL2...... 48 4.8 Tabela de codifica¸c˜aoRGIMM...... 48 4.9 Tabela de codifica¸c˜aoSPECIAL3...... 48 4.10 Tabela de codifica¸c˜aoCOP0 (rs)...... 49 4.11 Tabela de codifica¸c˜aoCOP0...... 49 4.12 Representa¸c˜aointerna das instru¸c˜oesdo conjunto opcode...... 51 4.13 Tabela com registos gen´ericosdo coprocessador zero...... 57 4.14 Tabela com registos internos do coprocessador zero...... 60 4.15 Registo interno UserLocal...... 60 4.16 Registo interno HWREna...... 61 4.17 Registo interno BadVAddr...... 61 4.18 Registo interno Count...... 61 4.19 Registo interno Compare...... 62

xix xx LISTA DE TABELAS

4.20 Registo interno Status...... 62 4.21 Registo interno Cause...... 64 4.22 Tabela de c´odigospor execp˜aopara a arquitectura MIPS32...... 66 4.23 Registo interno EPC...... 66 4.24 Registo interno PRId...... 67 4.25 Registo interno EBase...... 68 4.26 Registo interno Config...... 68 4.27 Tabela de atributos do registo Config0...... 68 4.28 Registo interno Config1...... 69 4.29 Tabela de atributos do registo Config1...... 69 4.30 Registo interno Config2...... 69 4.31 Registo interno ErrorEPC...... 70 4.32 Quadro de excep¸c˜oess´ıncronase ass´ıncronascom respectivas prioridades. (1 maior prioridade, 5 menor prioridade)...... 73 4.33 C´alculodo endere¸co base para os pontos de entrada...... 73 4.34 Quadro com deslocamentos utilizados no c´alculode pontos de entrada... 74 4.35 C´alculodo endere¸co base para os pontos de entrada...... 75 4.36 Estados modificados pela excep¸c˜aoReset...... 79 4.37 Estados modificados pela excep¸c˜aoSoft Reset...... 80 4.38 Estados modificados pela excep¸c˜aoNMI...... 81 4.39 Estados modificados pela excep¸c˜aoMachine Check...... 81 4.40 Estados modificados pela excep¸c˜aoAddress Error...... 82 4.41 Estados modificados pela excep¸c˜aoTLB Refill...... 82 4.42 Estados modificados pela excep¸c˜aoTLB Execute-Inhibit...... 83 4.43 Estados modificados pela excep¸c˜aoTLB Read-Inhibit...... 83 4.44 Estados modificados pela excep¸c˜aoTLB Invalid...... 83 4.45 Estados modificados pela excep¸c˜aoTLB Modified...... 84 4.46 Estados modificados pela excep¸c˜aoCache...... 84 4.47 Estados modificados pela excep¸c˜aoBus Error...... 85 4.48 Estados modificados pela excep¸c˜aoInteger Overflow...... 85 4.49 Estados modificados pela excep¸c˜aoTrap...... 85 LISTA DE TABELAS xxi

4.50 Estados modificados pela excep¸c˜aoSystem Call...... 85 4.51 Estados modificados pela excep¸c˜aoBreak Point...... 86 4.52 Estados modificados pela excep¸c˜aoReserved Instruction...... 86 4.53 Estados modificados pela excep¸c˜aoCoprocessor Unusable...... 86 4.54 Estados modificados pela excep¸c˜aoFloating Point...... 87 4.55 Estados modificados pela excep¸c˜aodo Coprocessor 2...... 87 4.56 Estados modificados pela excep¸c˜aoWatch...... 87 4.57 Estados modificados pela excep¸c˜aoInterrupt...... 88 4.58 Zonas de endere¸camento na mem´oriavirtual...... 94 4.59 Zonas de endere¸camento em fun¸c˜aodo modo de opera¸c˜aodo processador. 95 4.60 Registo interno Index...... 105 4.61 Registo interno Random...... 105 4.62 Registo interno EntryLo0 e EntryLo1...... 106 4.63 Especifica¸c˜aodos bits do registo EntryLo0 e 1...... 106 4.64 Registo interno Context...... 107 4.65 Registo interno Pagemask...... 108 4.66 Codifica¸c˜aodo tamanho das p´aginas...... 108 4.67 Registo interno Wired...... 108 4.68 Registo interno EntryHi...... 109 4.69 Exemplo de mapeamento de p´aginas virtuais para f´ısicas...... 110 4.70 Exemplo de mapeamentos com p´aginasf´ısicaspartilhadas...... 112 4.71 Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Refill...... 114 4.72 Pontos de entrada para a excep¸c˜aoTLB Refill...... 114 4.73 Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Modified...... 115 4.74 Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Invalid...... 116 4.75 Tabela de gera¸c˜aode endere¸cosf´ısicosem fun¸c˜aodo tamanho de p´agina.. 120 4.76 Tabela de mapeamento de endere¸cosfis´ıcospara dispositivos...... 131 4.77 Codifica¸c˜aopara a instru¸c˜aoEND...... 135

Cap´ıtulo1

Introdu¸c˜ao

Com o primeiro cap´ıtulopretende-se fazer uma introdu¸c˜aosobre o ˆambito do trabalho e o contexto onde este se insere na tem´aticado processo de simula¸c˜aode sistemas de informa¸c˜ao.O enquadramento e a motiva¸c˜aopara o trabalho s˜aoapresentados na sec¸c˜ao 1.1 e os objectivos definidos para esta disserta¸c˜aos˜aoenumerados na sec¸c˜ao 1.2.

1.1 Enquadramento e Motiva¸c˜ao

Em 1981, John Hennessy na Universidade de Standford, come¸coua trabalhar no que se tornou no primeiro processador MIPS. O conceito inicial foi de aumentar drasticamente o desempenho do processador utilizando pipelines de instru¸c˜oes,uma t´ecnicaj´aconhecida na altura mas dif´ıcilde implementar.

Naquela ´epoca, as arquitecturas seguiam o desenho da arquitectura CISC (Complex Instruction Set Computer), um desenho de instru¸c˜oescomplexas cuja execu¸c˜aocompleta demorava v´ariosciclos de rel´ogio,o que implicava que o processador perdesse muito tempo `aespera que uma instru¸c˜aocompletasse a sua execu¸c˜aopara poder iniciar a execu¸c˜aoda instru¸c˜aoseguinte. Se uma instru¸c˜aonecessitasse de aceder `amem´oria, o processador n˜aofazia nada sen˜aoesperar que o acesso `amem´oriaterminasse para a acabar a instru¸c˜ao,deixando subaproveitados os recursos de hardware existentes no processador, que poderiam entretanto ser reaproveitados para outras tarefas.

1 2 CAP´ITULO 1. INTRODUC¸ AO˜

Da necessidade de aumentar o desempenho do processador nasceu a arquitectura RISC (Reduced Instruction Set Computer) que utiliza um conjunto de instru¸c˜oesmais simples e uniformes. As instru¸c˜oesperderam riqueza na quantidade e complexidade de opera¸c˜oes poss´ıveis de fazer em cada instru¸c˜ao,sendo que as mesmas demoram aproximadamente 1 ciclo do rel´ogiodo processador. Com a utiliza¸c˜aodos pipelines os processadores tiveram um aumento vis´ıvel do seu desempenho uma vez que reutilizavam os tempos mortos do processador.

Actualmente existem v´arias arquitecturas de computadores, sendo as mais conhecidas: Intel x86, x64 ou x86-64, PowerPc, SPARC, MIPS, Alpha e ARM, entre muitas outras. Estas arquitecturas baseiam-se nas antecessoras RISC e CISC, das quais evolu´ırame adicionaram novas extens˜oesmantendo a sua base inalterada.

Chama-se a aten¸c˜aopara o facto de que as arquitecturas existentes poderem n˜aofun- cionar no mesmo ramo, isto ´e,algumas arquitecturas acima referidas s˜aoutilizadas nos conhecidos computadores de mesa, tamb´emdesignados como “desktops”, com sistemas operativos complexos, em microcontroladores ou em sistemas embebidos que podem ou n˜aoutilizar sistemas operativos. As arquitecturas Intel x86, x64, PowerPc e SPARC s˜aoconhecidas por serem utilizadas em computadores de mesa, cujos famosos sistemas operativos, Windows, Unix, Linux, Macintosh, Solaris, AIX, entre outros, assentam. Por outro lado, na ´areados microcontroladores e sistemas embebidos, as arquitecturas l´ıders˜aoARM, MIPS, Atmel AVR, entre outras, as quais permitem a programa¸c˜aode sistemas mais simples de forma a correrem directamente sobre o hardware.

Nos casos em que o hardware ´ebastante limitado, ´ecomum n˜aohaver sistemas operati- vos ou aplica¸c˜oescomplexas para gest˜aodos recursos, mas sim aplica¸c˜oesrelativamente simples “flashadas” na mem´oriaque correm muitas vezes inteiramente em modo privi- legiado, tamb´emconhecido por modo kernel, como abordado mais `afrente. Seguem-se exemplos dos casos acima citados, nomeadamente: as calculadoras, videojogos como a Playstation 2, perif´ericos, routers, microcontroladores, prot´otipos, etc. Al´emdos referi- dos, existe outra ´area,actualmente emergente no mercado, designadamente, dispositivos m´oveis como os telem´oveis, que utilizam sistemas operativos embutidos, tais como o Android da Google, Windows Mobile, Windows CE ou o Mobile Linux.

Com a evolu¸c˜aodos tempos nasceu a necessidade de simular o funcionamento de uma arquitectura dentro de outra, conhecida como virtualiza¸c˜aode sistemas. Esta t´ecnica consistia na cria¸c˜aode aplica¸c˜oesque simulavam o comportamento de dispositivos f´ısicos, possibilitando a execu¸c˜aode c´odigobin´ariogerado para uma arquitectura espec´ıfica onde o sistema nativo ´eapelidado de “anfitri˜ao”e o sistema simulado ´econhecido por “h´ospede”. 1.2. OBJECTIVOS 3

A simples simula¸c˜aodo hardware por si s´on˜aopossibilita a instala¸c˜aode sistemas operativos complexos numa m´aquinavirtual, como se ver´amais `afrente no presente trabalho. Para tal, al´emda simula¸c˜aodo hardware, ´enecess´arioimplementar v´arios mecanismos de cada arquitectura, com desenhos e implementa¸c˜oesespec´ıficasde cada uma, tais como o mecanismo de excep¸c˜oesou o mecanismo de interrup¸c˜oes, utilizados para possibilitar a comunica¸c˜aoentre o processador e os perif´ericosligados f´ısicamente, como o monitor, rato ou teclado.

1.2 Objectivos

A presente disserta¸c˜aotem como objectivo a cria¸c˜aode um simulador para a arquitectura MIPS de 32 bits (MIPS32), que possibilite a execu¸c˜aode c´odigobin´ario,desenvolvido especificamente para a referida arquitectura, como se de um hardware real se tratasse, tais como programas simples ou sistemas operativos complexos, como o Linux.

O simulador dever´aimplementar todas as instru¸c˜oesdisponibilizadas na ISA MIPS32 (Instruction Set Architecture) revis˜ao2. Para que a aplica¸c˜aopossa correr progra- mas complexos, ser´anecess´arioa simula¸c˜aode alguns componentes f´ısicosnecess´arios `asua execu¸c˜ao,tais como: um processador gen´ericoMIPS, mem´oriaRAM, mem´oria ROM, unidade de gest˜aode mem´oriaMMU (Memory Management Unit), mecanismo de tradu¸c˜aode endere¸cosTLB (Translation Lookaside Buffer) e mem´oriapermanente como o disco r´ıgido.

Todos estes componentes ser˜aoimplementados de uma forma gen´erica,sendo objectivo a cria¸c˜aode um sistema modularizado com um n´ıvel de compatibilidade com a arquitectura MIPS que permita a comuta¸c˜aodos m´odulos existentes por outros com implementa¸c˜oes espec´ıficas. Relativamente `agest˜aoda mem´oria,f´ısicae virtual, n˜aoser´aobjectivo a demonstra¸c˜aoda eficiˆenciaou desempenho de algoritmos de gest˜aode mem´oria, como o LRU (Least Recently Used), FIFO (First In First Out), LIFO (Last In First Out) ou aleat´orio(Random), mas sim a demonstra¸c˜aodos procedimentos e a forma como s˜ao executados no sistema, tal como o Page Fault ou o TLB Miss que ´euma das excep¸c˜oes que mais vezes ocorre num sistema operativo real.

Como objectivo seguinte ser´aa explana¸c˜aoe o desenvolvimento de um kernel mini- malista que dˆesuporte a alguns mecanismos e funcionalidades, mormente, a gest˜aode processos e mem´oria,tanto f´ısicacomo virtual. A gest˜aode processos e seus respectivos contextos ser˜aoexecutados numa escala reduzida, uma vez que esta depende unicamente do refinamento do sistema operativo em si e n˜aodo simulador ou da arquitectura em quest˜ao.

Cap´ıtulo2

Estado da Arte e Conceitos Envolvidos

De forma a contextualizar o presente trabalho, ´eimportante introduzir no¸c˜oese conceitos para uma melhor compreens˜aodo mesmo.

Na sec¸c˜ao 2.1 abordaremos o estado da arte actual na ´areada virtualiza¸c˜aode sistemas, nomeadamente os v´ariostipos de virtualiza¸c˜aoe simula¸c˜aoexistentes. Ser˜aoigualmente abordadas algumas t´ecnicas de optimiza¸c˜aoutilizadas no processo de simula¸c˜aoem 2.2.

A t´ıtulointrodut´orio,veremos na sec¸c˜ao 2.3 os conceitos IPC (Interprocess Comunica- tion) e a representa¸c˜aoe extrac¸c˜aode informa¸c˜aode ficheiros bin´ariosELF em 2.4, dois conceitos importantes no desenvolvimento da presente tese.

2.1 Virtualiza¸c˜aode Sistemas

A virtualiza¸c˜aode sistemas encontra-se actualmente em forte expans˜ao. Esta consiste na cria¸c˜aode um ambiente virtual, permitindo a utiliza¸c˜aode v´ariossistemas operativos e aplica¸c˜oescompilados para uma arquitectura diferente da arquitectura nativa. O seu emprego acarreta in´umerasvantagens para as empresas n˜aos´oa n´ıvel econ´omico, mas em termos de flexibilidade, escalabilidade e variedade de ambientes poss´ıveis de criar, visto que existe actualmente uma necessidade de diminuir o desperd´ıciode recursos, e

5 6 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

esta constitui uma alternativa vi´avel.

Atrav´esda virtualiza¸c˜aode sistemas ´eposs´ıvel criar, utilizar e descartar ambientes de desenvolvimento, testes ou produ¸c˜aomuito rapidamente sem a necessidade de aquisi¸c˜ao e manuten¸c˜aode hardware novo. E´ igualmente poss´ıvel criar uma grande variedade de ambientes e cen´arios,que os programadores podem utilizar para melhorar o seu trabalho. O seu funcionamento consiste na cria¸c˜aode uma camada middleware, que emular´aum conjunto de hardware de forma a suportar a execu¸c˜aode sistemas operativos, independentemente da arquitectura nativa.

Uma solu¸c˜aode virtualiza¸c˜ao´ecomposta, essencialmente, por dois actores: o anfitri˜ao (host) e o h´ospede (guest). Podemos entender o anfitri˜aocomo sendo o sistema operativo que ´eexecutado nativamente por uma m´aquinaf´ısicae o h´ospede, por sua vez, ´eo sistema virtualizado que ´eexecutado dentro do anfitri˜ao.

Associado `at´ecnicade virtualiza¸c˜aoencontra-se o conceito de hypervisor ou Virtual Machine Monitor (VMM), que consiste numa aplica¸c˜aoque permite a execu¸c˜aoconcor- rente de v´ariasm´aquinasvirtuais no mesmo sistema, sendo a mesma compilada para uma arquitectura em particular. O hypervisor ´erespons´avel pela cria¸c˜ao,isolamento e preserva¸c˜aodo estado das m´aquinas virtuais, assim como da gest˜aodos acessos aos recursos do sistema. Existem no entanto dois tipos de VMM, podendo estes ser:

Tipo 1 Os hypervisors do tipo um s˜aogeralmente utilizados em servidores e assentam directamente sobre o hardware f´ısico,sem utiliza¸c˜aode um sistema operativo. Desta forma, toda a gest˜aoe manuten¸c˜aodos recursos f´ısicos´efeito exclusivamente pelo hypervisor. Na imagem abaixo podemos ver as camadas existentes entre os sistemas virtualizados, h´ospedes e o hardware f´ısico.

              

Figura 2.1: Hypervisor tipo 1.

Um exemplo de hypervisors modernos que utilizem este modelo s˜ao:Oracle VM Server for SPARC, Citrix XenServer, KVM, VMware ESX/ ESXi ou Microsoft Hyper-V. 2.1. VIRTUALIZAC¸ AO˜ DE SISTEMAS 7

Tipo 2 Os hypervisors do tipo dois, em oposi¸c˜aoaos do tipo um, consistem numa aplica¸c˜ao que corre sobre o sistema operativo e n˜aono hardware f´ısico. Como podemos ver na figura abaixo, nestes casos os sistemas virtualizados correm na terceira camada de software do sistema.

# $ # $ # $ ! ! !    !!"    $% &'("

Figura 2.2: Hypervisor tipo 2.

Tanto o VMWare como Oracle Virtual Box, s˜aodois exemplos actuais de hypervi- sors do tipo dois, correndo sobre sistemas operativos como o Windows ou Linux.

No processo de cria¸c˜aode m´aquinasvirtuais, s˜aoempregues t´ecnicascomo a virtua- liza¸c˜aopor software ou virtualiza¸c˜aopor hardware, de forma a conseguirmos executar um sistema operativo h´ospede. No primeiro caso, ´efeita a simula¸c˜aodo comportamento dos perif´ericose dos mecanis- mos associados, podendo em alguns casos permitir o acesso directo aos perif´ericosf´ısicos, como veremos em seguida. No segundo caso, o hardware f´ısicodisp˜oede mecanismos que permitem o aux´ılioe acelera¸c˜aode instru¸c˜oesassociadas `avirtualiza¸c˜aode sistemas. A virtualiza¸c˜aoassistida por software categoriza-se em trˆessubgrupos de virtualiza¸c˜ao, nomeadamente:

Emula¸c˜ao

A emula¸c˜ao´euma t´ecnicautilizada pela virtualiza¸c˜ao,cujo objectivo ´epossi- bilitar a comunica¸c˜aoentre dois sistemas originalmente distintos e incompat´ıveis. Esta incompatibilidade pode ser do tipo hardware para software ou software para software. Assim, um emulador implementa todas as instru¸c˜oesrealizadas pela m´aquinareal em um ambiente abstracto de software, possibilitando a execu¸c˜aode aplica¸c˜oes destinadas a uma plataforma espec´ıficasem modifica¸c˜oes.Um exemplo deste com- portamento ´ea possibilidade de correr aplica¸c˜oesdesenvolvidas para a arquitectura MIPS numa m´aquinacom a arquitectura x86. 8 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

No quadro abaixo, podemos ver a representa¸c˜aodas camadas necess´ariasno pro- cesso de emula¸c˜aode sistemas:

   #&'  %&' "   #$$    !    

Figura 2.3: Camadas da emula¸c˜aode sistemas.

O processo de cria¸c˜aode um emulador ´ebastante complexo, uma vez que necessita simular todas as instru¸c˜oesdo processador, assim como suas caracter´ısticasinter- nas, como chips ou circuitos integrados do hardware que o constitui. E´ igualmente necess´ariosimular todos os mecanismos associados aos perif´ericos como: a implementa¸c˜aodo conjunto instru¸c˜oesdo processador (ISA), mem´oria principal RAM, unidade de gest˜aode mem´oria(MMU), mecanismo de tradu¸c˜ao de endere¸cos,mecanismos de excep¸c˜oese interrup¸c˜oesdo processador, interface de rede, dispositivos de mem´oriapermanente (como os discos r´ıgidos)e acesso a diversos dispositivos. Comparativamente aos restantes modelos de virtualiza¸c˜ao,a t´ecnicade emula¸c˜ao ´ea mais antiga e possui o desempenho mais baixo, uma vez que a simula¸c˜aodos componentes ´emuito pesada e minuciosa. Cada instru¸c˜aodo sistema h´ospede ´einterpretada e optimizada pelo simulador, gerando assim um bloco de c´odigo (conjunto de instru¸c˜oes)a ser executado na arquitectura do anfitri˜ao. A grande desvantagem prende-se ao facto de, para se ter um desempenho satis- fat´orio,o sistema anfitri˜aodeve possuir um desempenho ou capacidade superior ao h´ospede. Actualmente existem v´ariostipos de emuladores de sistemas, entre os quais se destacam os emuladores QEMU, , PearPC e GXemul.

Virtualiza¸c˜aoCompleta

Atrav´esda t´ecnicade virtualiza¸c˜aocompleta, tamb´emconhecida como virtua- liza¸c˜aonativa, ´eposs´ıvel executar software desenvolvido sem modifica¸c˜oes, `ase- melhan¸cado que acontece na emula¸c˜ao.A grande diferen¸carelativamente `at´ecnica anterior ´eo facto de a arquitectura do h´ospede ser a mesma que a arquitectura do anfitri˜ao. 2.1. VIRTUALIZAC¸ AO˜ DE SISTEMAS 9

562' 2($ 562' 2(7

%$ %7 %8 %9

 ((  ((

 !# $  !# 7

%  @(A

&'(

)' 01' 203  (4 '!562' 2(   

%     

Figura 2.4: Camadas de virtualiza¸c˜aode sistemas completa ou nativa.

Nesta solu¸c˜ao´enecess´ario simular os componentes f´ısicosda m´aquina,de forma a permitir a execu¸c˜aode um sistema operativo, sendo geralmente simulados com- ponentes gen´ericos. Associado `asimula¸c˜aodos componentes f´ısicos,encontra-se a implementa¸c˜aodo seguinte conjunto de mecanismos: instru¸c˜oes do processador (ISA), mem´oriaprincipal RAM, unidade de gest˜aode mem´oria (MMU), mecanismo de tradu¸c˜aode endere¸cos,mecanismos de excep¸c˜oese interrup¸c˜oesdo processador, interface de rede, dispositivos de mem´oriapermanente como os discos r´ıgidose acesso a diversos dispositivos. Este tipo de virtualiza¸c˜aoemprega a t´ecnicade tradu¸c˜aobin´aria,no qual o hy- pervisor ´erespons´avel por analisar, reorganizar e traduzir blocos de instru¸c˜oes bin´ariasdo sistema operativo h´ospede. A an´alisedas instru¸c˜oes´efeita em tempo de execu¸c˜ao(“on-the-fly”), a fim de adaptar as instru¸c˜oesgeradas `aISA do sis- tema nativo, nos casos em que n˜aosejam idˆenticas. E´ igualmente seu objectivo a optimiza¸c˜aodas sequˆenciasde c´odigoenviadas pelo h´ospede, com o objectivo de melhorar o desempenho da execu¸c˜ao. E´ importante referir que o c´odigon˜aoprivilegiado corre nativamente no hard- ware, sendo o mesmo encaminhado pelo hypervisor. Na figura 2.4, podemos ver o comportamento do sistema relativamente `aexecu¸c˜aode c´odigoprivilegiado, no- meadamente chamadas ao sistema (System Calls). 10 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

Todas as instru¸c˜oesprivilegiadas s˜aointerceptadas pelo hypervisor, uma vez que a sua execu¸c˜aodirecta no sistema h´ospede originaria um comportamento imprevis´ıvel gerando uma falha tanto no isolamento da m´aquina virtual, como na seguran¸cado pr´opriosistema anfitri˜ao. Assim, a categoria de instru¸c˜oes´eanalisada e tratada pelo hypervisor. Contrariamente `aemula¸c˜aode hardware, obt´em-seum maior desempenho uma vez que n˜aoexiste a necessidade de recompila¸c˜aode c´odigo1, uma vez que a grande maioria das instru¸c˜oescorre nativamente. No entanto, ´ede notar que a utiliza¸c˜ao da t´ecnicade tradu¸c˜aobin´ariaintroduz uma redu¸c˜aono desempenho do hypervisor comparativamente com a execu¸c˜aonativa do c´odigobin´ario.

Paravirtualiza¸c˜ao

A Paravirtualiza¸c˜ao´euma t´ecnicade virtualiza¸c˜aode segunda gera¸c˜ao,cujo modo de funcionamento difere das anteriores. Em oposi¸c˜aoao que acontece nos exem- plos anteriores, a paravirtualiza¸c˜aorequer a modifica¸c˜aodo c´odigofonte do sistema operativo do h´ospede, com o objectivo de substituir instru¸c˜oesn˜aovirtualizadas, que comunicam directamente com a camada de virtualiza¸c˜ao,conhecidas como hypercalls. O hypervisor disponibiliza ent˜aouma interface de comunica¸c˜aopara opera¸c˜oes cr´ıticas de kernel, como a gest˜aode mem´oria,controlo sobre o mecanismo de interrup¸c˜oes,entre outros mecanismos, atrav´esde uma Application Programming Interface (API). Semelhantemente ao que acontece com a virtualiza¸c˜aototal, na paravirtualiza¸c˜ao, o hypervisor ´erespons´avel pela captura e emula¸c˜aode algumas opera¸c˜oescriticas nas m´aquinasvirtuais, sendo que as restantes correm directamente no hardware da m´aquinade forma controlada pelo hypervisor. Como podemos ver na figura 2.5, cada m´aquinavirtual, em modo n˜aoprivilegiado disp˜oede acesso directo ao hardware real. Relativamente a instru¸c˜oesprivilegiadas, o hypervisor ´erespons´avel pela intercepta¸c˜aoe execu¸c˜aodas mesmas. Desta forma, a paravirtualiza¸c˜aon˜aosuporta sistemas operativos n˜aomodificados, tais como os sistemas operativos da Microsoft2, tendo assim, desvantagens de com- patibilidade e portabilidade. Relativamente ao desempenho, a paravirtualiza¸c˜ao possui melhor desempenho que as duas t´enicasanteriores, uma vez que o conjunto

1A recompila¸c˜aosignifica que um instru¸c˜aona arquitectura do sistema h´ospede gerar´aum bloco de instru¸c˜oespara a arquitectura nativa. 2Inicialmente a Microsoft n˜aopermitia a modifica¸c˜aodo c´odigofonte dos seus sistemas operativos, sendo mais tarde permitida a modifica¸c˜aoem alguns sistemas operativos, como o Windows XP. 2.1. VIRTUALIZAC¸ AO˜ DE SISTEMAS 11

&'() (0$ &'() (01

%$ %1 %2 %3

 00  00

 !# $  !# 1

00 00   

%     

Figura 2.5: Camadas em sistemas paravirtualizados.

de instru¸c˜oesinterceptadas pelo o hypervisor ´emenor, assim como a execu¸c˜aoe o acesso aos dispositivos f´ısicos´efeito nativamente.

Al´emdos modelos anteriores, existe ainda a virtualiza¸c˜aoassistida por hardware, no qual o processador disp˜oede mecanismos f´ısicospara auxiliar a virtualiza¸c˜ao.

Um exemplo deste comportamento s˜aoos processadores Intel e AMD, para a arquitectura x86, que criaram mecanismos nos seus processadores, nomeadamente o Intel VT-x/VT-i e o AMD-v, para suportar e optimizar a virtualiza¸c˜aode sistemas. O objectivo principal da utiliza¸c˜aodesta t´ecnica ´eo aumento do desempenho da execu¸c˜aodas m´aquinasvirtuais, em sistemas que utilizem virtualiza¸c˜aototal3 ou nativa.

Vejamos como exemplo o mecanismo utilizado pela Intel VT-x. De forma superficial e segundo [Mat02] e [WGP], esta t´ecnicaconsiste na cria¸c˜aode dois modos de execu¸c˜ao no processador, nomeadamente root e non-root. O primeiro ´edestinado `aexecu¸c˜ao do sistema operativo ou hypervisor, equivalendo ao funcionamento de um processador tradicional. O segundo modo, non-root, ´eutilizado exclusivamente para as m´aquinas virtuais.

Na arquitectura x86 existem quatro n´ıveis de privil´egiode execu¸c˜aoconhecidos como an´eis(rings) e variando do zero at´etrˆes,sendo o zero o n´ıvel mais privilegiado. Em cada modo de execu¸c˜aodo processador, encontram-se implementados os quatro an´eisde privil´egiospermitindo a execu¸c˜aode sistemas operativos no n´ıvel zero.

Para gerir a mudan¸ca de contexto no processador, ´ecriada uma estrutura conhecida como

3Neste tipo de execu¸c˜aoos sistemas anfitri˜oese h´ospedes possuem a mesma arquitectura. 12 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

 D(")  '"("#BC"  9!"1!  E# FG"C)H

  1 ' 1))    5'#"167) B )#(C! 0 1))  89!")   I"()  ")' )""( ) "( "!")   I"()  ")' )""( )   2#   !"#"$  @&  5'#"167)  5'#"167)  5'#"167)   !"#"$   !"#"$   !"#"$   !"#"$   !"#"$   !"#"$  @A"   !"#"$   !"#"$  %&'(")   2# 34)'  2# 34)'  2# 34)'

        

Figura 2.6: Arquitectura Intel VT-x/ VT-i.

Virtual Machine Control Structure (VMCS), que cont´emessencialmente duas ´areas:uma para o sistema operativo h´ospede e outra para o hypervisor.

Sempre que exista uma transi¸c˜ao“VM entry”4, o estado do processador ´esalvaguardado na ´areado hypervisor da VMCS, sendo em seguida actualizado o estado do processador com a informa¸c˜aoproveniente da ´areado sistema operativo h´ospede.

Quando ´eexecutada a transi¸c˜aoinversa, “VM exit”5, o estado do processador do sistema operativo virtual ´eguardado, sendo em seguida restaurado o estado do processador do sistema operativo nativo (hypervisor).

No procedimento “VM entry”, ´eefectuada uma passagem do modo root para o modo non-root, assim como no procedimento inverso “VM exit”, ´eefectuada uma passagem do modo non-root para o modo root, como podemos ver na figura 2.6. Desta forma, o sistema operativo virtual pode correr directamente no processador sendo apenas as instru¸c˜oes mais sens´ıveis, como as interrup¸c˜oesno sistema h´ospede, que geram a transi¸c˜ao“VM exit” passando a execu¸c˜aopara o modo root, hypervisor, que em seguida executar´ao procedimento adequado.

4VM Entry corresponde `atransi¸c˜aodo processador nativo (VMM) para o processador virtualizado (sistema h´ospede). 5VM Exit corresponde `atransi¸c˜aodo processador virtualizado (sistema h´ospede) para o processador nativo (VMM). 2.2. TECNICAS´ DE TRADUC¸ AO˜ E COMPILAC¸ AO˜ DE INSTRUC¸ OES˜ 13

Como referido anteriormente, a virtualiza¸c˜aototal assim como a paravirtualiza¸c˜ao,re- querem que tanto o h´ospede como o anfitri˜aoutilizem a mesma arquitectura, uma vez que em ambos os casos os sistemas operativos acedem directamente aos componentes f´ısicos. Um exemplo de sistemas que utilizam este tipo de t´ecnica´eo VMWare Works- tation ou Server e o VirtualBox. E´ de notar que em ambos os casos, para a arquitectura x86, estes suportam a utiliza¸c˜aode virtualiza¸c˜aoassistida por software em processadores Intel ou AMD, nomeadamente Intel VT-x/VT-i e AMD-v. J´ana ´areada paravirtua- liza¸c˜ao,onde existe a necessidade de modifica¸c˜aodo sistema operativo h´ospede, existem os seguintes softwares: Microsoft Hyper-V, VMWare e Xen.

Por outro lado, temos o processo de emula¸c˜aode sistemas, no qual n˜aoexiste a necessi- dade da arquitectura do h´ospede e do anfitri˜aoserem iguais.

2.2 T´ecnicasde tradu¸c˜aoe compila¸c˜aode instru¸c˜oes

Associado `atem´aticada virtualiza¸c˜aode sistemas, encontra-se um conjunto de t´ecnicas utilizadas com o objectivo de aumentar o seu desempenho. Um poderoso exemplo disto ´ea t´ecnicade tradu¸c˜aobin´aria,no qual muitos softwares de virtualiza¸c˜aoe emula¸c˜aose baseiam para a convers˜aode c´odigobin´ario.

Esta convers˜aoconsiste na tradu¸c˜aode um conjunto de instru¸c˜oesbin´ariasem outro conjunto de instru¸c˜oes, nomeadamente transformar o c´odigoda arquitectura simulada em c´odigoda arquitectura nativa do sistema. Existem no entanto dois tipos de tradu¸c˜ao bin´aria:tradu¸c˜aobin´ariaest´aticae tradu¸c˜aobin´ariadinˆamica.

No primeiro caso, o software respons´avel pela tradu¸c˜ao,tentar´aproceder `aconvers˜ao total do c´odigobin´arioexistente no ficheiro execut´avel para o formato da arquitectura nativa do sistema. Esta opera¸c˜aonem sempre ´eposs´ıvel de se efectuar, uma vez que existem limita¸c˜oesna utiliza¸c˜aodesta t´ecnica,dado que podem existir referˆenciasno c´odigocujo valor apenas ´econhecido em tempo de execu¸c˜ao. Um exemplo deste com- portamento s˜aoas instru¸c˜oesde saltos incondicionais na arquitectura MIPS, como o JR $ra.

Na tradu¸c˜aodinˆamica,o funcionamento muda totalmente, uma vez que apenas blocos de c´odigoser˜aotraduzidos e mantidos numa mem´oria cache. O c´odigobin´ariovai sendo traduzido `amedida que ´enecess´ario. Em sistemas que utilizem este tipo de t´ecnica, os primeiros momentos de execu¸c˜aodemoram mais tempo a executar, uma vez que ´e necess´ariotraduzir o c´odigo,sendo os seus ganhos reflectidos sempre que ´enecess´ario executar c´odigoque j´atenha sido previamente traduzido, e se encontre na mem´oria cache. Em sistemas emulados, geralmente, o processo de tradu¸c˜ao´ebastante simples, 14 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS consistindo num ciclo com trˆesopera¸c˜oes:leitura, descodifica¸c˜aoe execu¸c˜aodo c´odigo.

A t´ecnicade tradu¸c˜aobin´ariadinˆamica´egeralmente utilizada em sistemas que disp˜oe de uma representa¸c˜aointerm´edia,conhecida tamb´em como bytecode. Linguagens como o Java ou .NET utilizam actualmente t´ecnicasde compila¸c˜aoe tradu¸c˜aodinˆamica,co- nhecidas como JIT (Just-In-Time), com o objectivo de optimizar a execu¸c˜aodo c´odigo6.

O c´odigofonte da linguagem Java ´ecompilado, atrav´esde um compilador, normalmente javac, e gerar´aum ficheiro “.class” conhecido como bytecode, cujo o conte´udoconsiste numa representa¸c˜aodo c´odigofonte, independente da arquitectura para o qual se destina.

Em seguida, a m´aquinavirtual do java (JVM) no processo de execu¸c˜ao,´erespons´avel pela recompila¸c˜aodo c´odigo bytecode para o c´odigobin´arioda arquitectura do sistema, como podemos ver na figura 2.7.

Figura 2.7: Estrutura de compila¸c˜aopara a linguagem Java.

No entanto, compiladores recentes para a linguagem Java disp˜oemda t´ecnicaJIT para optimizarem a execu¸c˜aodo c´odigo bin´arionas m´aquinasvirtuais. Este tipo de compi- ladores, em oposi¸c˜ao`acompila¸c˜aoest´atica,disp˜oede um processo semelhante ao que acontece na tradu¸c˜aodinˆamica.Apenas alguns blocos de c´odigodo bytecode ser˜aoopti- mizados e compilados em tempo de execu¸c˜ao.A escolha dos blocos de c´odigosegue uma pol´ıticade demanda, isto ´e,apenas os blocos de c´odigospedidos ser˜aocompilados. E´ de notar que o arranque dos programas compilados com esta t´ecnica,´emais lento que nos programas compilados estaticamente, no entanto os seus benef´ıcioss˜aoreflectidos na execu¸c˜aoconsecutiva de blocos de c´odigo.

6Apenas linguagens que tirem partido de bytecode, como o Java ou .Net, utilizam compiladores JIT. As restantes linguagens de programa¸c˜aocomo o C/C++, que n˜aopermitem compila¸c˜aoem runtime, dispˆoemde t´ecnicassemelhantes como o LLVM (Low Level Virtual Machine), que n˜ao´eabordado no presente trabalho. 2.2. TECNICAS´ DE TRADUC¸ AO˜ E COMPILAC¸ AO˜ DE INSTRUC¸ OES˜ 15

     

  !" ### !"

$%&'

(' ( 

8' 492 @)0' $)A( $()0'   )     !)1'2

  3(405& 63 & 7

   !)1'2

Figura 2.8: Arquitectura do emulador QEMU.

O emulador QEMU, que actualmente permite a virtualiza¸c˜aode v´ariasarquitecturas, entre elas a arquitectura MIPS, utiliza a t´ecnicade tradu¸c˜aodinˆamicapara a virtu- aliza¸c˜aodos sistemas. Esta consiste na cria¸c˜aode uma representa¸c˜aointerm´edia,co- nhecida como Micro-Operations de forma muito semelhante com o que acontece com o bytecode do Java. Na figura 2.8 observa-se a forma como o emulador QEMU utiliza a tradu¸c˜aobin´aria dinˆamicano processo de emula¸c˜aodas arquitecturas.

Como se pode ver o emulador QEMU desmonta e recompila blocos de c´odigo bin´ariodo sistema h´ospede de forma a gerar uma representa¸c˜aointerm´edia,as Micro-Operations. Em seguida, ´eefectuada a recompila¸c˜aodas Micro-Operations, na qual ser´agerado o c´odigobin´ariopara a arquitectura nativa do sistema. 16 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

2.3 Comunica¸c˜aoentre processos (IPC)

E´ comum em sistemas elaborados a cria¸c˜aoe utiliza¸c˜aode v´ariosprocessos, dependentes ou independentes entre si, que por sua vez necessitam de comunicar. Num sistema modularizado e distribu´ıdo,os v´arios m´odulosconstituintes do sistema podem funcionar de forma independente, gerando assim uma melhor distribui¸c˜aode carga e gerando uma maior robustez. Com tais caracter´ısticas nasce uma importante quest˜ao:

“Como ´eque os processos ir˜aocomunicar entre si?”

A forma mais conhecida de resolver esta quest˜aoem ambientes Linux, ´eatrav´esdo me- canismo de comunica¸c˜aoentre processos IPC (InterProcess Communication). O IPC consiste num conjunto de t´ecnicase mecanismos no qual ´eposs´ıvel a comunica¸c˜aoentre processos parentes7, n˜aoparentes8 ou existentes em m´aquinasdiferentes. Do conjunto de t´ecnicasdisponibilizadas para IPC sobressaem as seguintes: comunica¸c˜aopor Network Sockets, mem´oriapartilhada (Shared Memory), Named Pipes ou Unnamed Pipes, me- canismos de mensagens (Message Queue), pseudoterminais, invoca¸c˜oesremotas RPC (Remote Procedure Calls), ficheiros especiais, entre outros.

A escolha do mecanismo mais adequado varia em fun¸c˜aodas necessidades, podendo esta ser apenas a partilha de informa¸c˜aoentre os processos ou threads, o aumento do desem- penho na transmiss˜aode dados, modularidade, simples conveniˆenciaou a separa¸c˜aode privil´egiospara aumento da seguran¸ca. Em tais sistemas ´enecess´arioque exista um conjunto rigoroso de regras de comunica¸c˜ao e integra¸c˜aode forma a possibilitar a troca de mensagens correctamente.

Em seguida observar-se-´aa forma como os processos comunicam entre si utilizando exclusivamente pipes do sistema Unix.

2.3.1 Named e Unnamed Pipes

Originalmente os pipes em sistemas Unix foram desenhados de forma a permitir o funcio- namento encadeado de processos, possibilitando que os mesmos possam comunicar entre si, redireccionando assim o fluxo de informa¸c˜aoprovenientes dos trˆesprincipais descri- tores: STDIN (Standard Input = 0 ), STDOUT (Standard Output = 1 ) e STDERR (Standard Error = 2 ). Actualmente existem dois tipos de pipes, nomeadamente, Named Pipes e Unnamed Pipes.

O seu funcionamento ´eigual tirando o facto do primeiro criar um dispositivo de co-

7Processos gerados atrav´esde forks ou exec. 8Processos que n˜aopossuem qualquer n´ıvel de parentesco, funcionam apenas no mesmo sistema. 2.3. COMUNICAC¸ AO˜ ENTRE PROCESSOS (IPC) 17

 %&



"#$%&

 !! 

%&"#

 

"#

Figura 2.9: Comunica¸c˜aocom Pipelines Unix. munica¸c˜aode forma permanente no sistema operativo, no qual dever´aser destru´ıdo manualmente ap´osa sua utiliza¸c˜ao. Nos casos Named Pipe ´enecess´ariocriar o pipe manualmente atrav´esdo programa mkfifo, antes da execu¸c˜aodo processo, de forma a permitir que os processos se possam ligar ao pipe.

No segundo caso, o pipe criado existe apenas enquanto o processo se encontrar em execu¸c˜aoe ser´adestru´ıdoautomaticamente quando o mesmo terminar.

Ambas as formas baseiam-se na t´ecnica FIFO (First In First Out) para controlar a en- trada e sa´ıdade informa¸c˜aodo canal de comunica¸c˜ao. Ao contr´ariodo que acontece com os pseudoterminais, que criam um canal bidireccional, os pipes s˜aocanais unidi- reccionais, sendo necess´arioa cria¸c˜aode dois pipes para que os processos disponham de comunica¸c˜aobidireccional. Na figura 2.9 podemos ver um esbo¸co do fluxo de comu- nica¸c˜aode um conjunto de programas a funcionar utilizando pipelines.

Ap´osa cria¸c˜aode um pipe um processo recebe dois descritores, sendo o primeiro o ponto de entrada de informa¸c˜aono canal e o segundo o ponto de sa´ıdade informa¸c˜ao.Estes descritores n˜aos˜aoos descritores standard (STDIN, STDOUT e STDERR) criados por defeito para os processos, mas sim identificadores dos canais.

Toda a informa¸c˜aotransmitida para o pipe ´eguardada num buffer, cujo tamanho e 18 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS gest˜aos˜aocontrolados pelo sistema operativo. E´ responsabilidade do sistema operativo garantir que a ordem pela qual a informa¸c˜ao´eintroduzida no pipe ´eexactamente a mesma ordem de sa´ıdae que a informa¸c˜aoenviada ´erecebida pelo destinat´ario.

Para a cria¸c˜aoe utiliza¸c˜aodos pipes, o sistema operativo Unix disponibiliza um conjunto de chamadas ao sistema, sendo os mais importantes: pipe, read, write e close.

2.4 Executable and Linkable Format (ELF)

Os ficheiros execut´aveis contˆemum conjunto de informa¸c˜ao,dados e c´odigobin´arioa ser executado, numa representa¸c˜aoespec´ıfica. Actualmente existem v´ariasrepresenta¸c˜oes utilizadas sendo as mais comuns: ELF, COFF, a.out, Mach-O e PE/COFF.

O formato ELF ´euma norma que foi originalmente desenvolvida pelos Unix System Laboratories.

Ao contr´ariodo que acontece com muitos formatos propriet´arios, o formato ELF foi desenhado para ser flex´ıvel e extens´ıvel de forma a poder abranger v´ariostipos de pro- cessadores, arquitecturas ou sistemas operativos diferentes. Como este formato n˜aose prende a nenhum sistema operativo ou processador em particular, foi rapidamente aceite pelos utilizadores de sistemas Unix como um formato standard para ficheiros bin´arios, reduzindo-se o n´umerode implementa¸c˜oesde interfaces diferentes e diminuindo a neces- sidade de recodifica¸c˜aoou recompila¸c˜aode c´odigo.

2.4.1 Organiza¸c˜aode ficheiros ELF

Os ficheiros bin´ariosELF organizam a informa¸c˜aonum conjunto de sec¸c˜oescomo ilustra a figura 2.10. Oficialmente, existem dois tipos de vis˜oessobre os ficheiros ELF, nomeada- mente os ficheiros realoc´aveis e os ficheiros execut´aveis. No primeiro caso, estes possuem informa¸c˜aoadicional utiliz´avel pelo compilador no processo de “linkagem”.

No inicio de cada ficheiro ELF existe um cabe¸calhoELF, que possui informa¸c˜aorelativa ao ambiente de execu¸c˜ao,arquitectura, ponto de entrada na mem´oria virtual e tipo de ficheiro, entre outros aspectos. 2.4. EXECUTABLE AND LINKABLE FORMAT (ELF) 19

 !"

 

#  $%&%'



(

 #  )012

Figura 2.10: Formato de um ficheiro bin´arioELF.

No bloco de c´odigoabaixo (Listing 2.1) pode-se ver a estrutura que representa o cabe¸calho ELF.

#d e f i n e EI NIDENT 16

typedef struct { unsigned char e i d e n t [ EI NIDENT ] ; E l f 3 2 H a l f e type ; E l f 3 2 H a l f e machine ; Elf32 Word e v e r s i o n ; Elf32 Addr e e n t r y ; E l f 3 2 O f f e p h o f f ; E l f 3 2 O f f e s h o f f ; Elf32 Word e f l a g s ; E l f 3 2 H a l f e e h s i z e ; E l f 3 2 H a l f e p h e n t s i z e ; E l f 3 2 H a l f e phnum ; E l f 3 2 H a l f e s h e n t s i z e ; E l f 3 2 H a l f e shnum ; E l f 3 2 H a l f e s h s t r n d x } Elf32 Ehdr ; Listing 2.1: Defini¸c˜aoda estrutura cabe¸calhoELF.

Segue-se uma breve descri¸c˜aoda informa¸c˜aoguardada por estas vari´aveis: e ident Esta vari´avel ´ecomposta por um array de dezasseis bytes independentes da arqui- tectura, utilizados para interpretar ou descodificar o conte´udodo ficheiro; 20 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

e type Identifica o tipo de ficheiro, podendo este variar entre: No file type, Relocatable file, Executable file ou Shared Object file;

e machine Aqui ´eguardado o tipo de arquitectura utilizada, variando de acordo com o quadro abaixo: Nome Valor Significado EM NONE 0 No Machine EM M32 1 AT&T WE 32100 EM SPARC 2 SPARC EM 386 3 intel 80386 EM 68K 4 Motorola 68000 EM 88K 5 EM 860 7 Intel 80860 EM MIPS 8 MIPS RS3000

Tabela 2.1: Tabela com tipos de architectura definidos para o formato ELF.

e version Identifica a vers˜aodo ficheiro;

e entry Indica o endere¸covirtual que deve ser utilizado para iniciar a execu¸c˜aodo c´odigo bin´ario;

e phoff Guarda o valor do deslocamento da tabela de cabe¸calhodo programa em bytes. Caso o ficheiro n˜aopossua uma tabela de cabe¸calhodo programa, este campo cont´emzero;

e shoff Possui o valor do deslocamento da tabela de cabe¸calhodas sec¸c˜oesem bytes. Caso a tabela n˜aoexista, o seu valor ´ezero;

e flags Guarda valores a serem utilizados em processadores espec´ıficos;

e ehsize Cont´emo tamanho do cabe¸calhoELF em bytes; e phentsize Guarda o tamanho de cada entrada da tabela de cabe¸calhodo programa em bytes. Todas as entradas possuem um tamanho igual;

e phnum Guarda o n´umero de entradas na tabela de cabe¸calhodo programa; e shentsize Possui o valor em bytes do tamanho da tabela de cabe¸calhodas sec¸c˜oes;

e shnum Guarda o n´umero de sec¸c˜oesexistentes na tabela de cabe¸calhodas sec¸c˜oes;

e shstrndx Esta vari´avel guarda o ´ındiceda tabela de cabe¸calhode sec¸c˜aoassociado ao nome da sec¸c˜ao. 2.4. EXECUTABLE AND LINKABLE FORMAT (ELF) 21

Em ficheiros execut´aveis a tabela header do programa ´eobrigat´oriauma vez que possui os mapeamentos de sec¸c˜aopara segmento que dever˜aoser carregados para mem´oria.A tabela de cabe¸calho de sec¸c˜oes´ecomposta por um array de estruturas ELF32_Shdr, que possui um conjunto de informa¸c˜oesrelativas a cada sec¸c˜ao.

Da mesma forma que a tabela de cabe¸calhoELF, a estrutura ELF32_Shdr inclui a lo- caliza¸c˜aodo c´odigobin´arioassim como informa¸c˜oesextra do segmento. Segue-se a estrutura que representa a informa¸c˜aode cada sec¸c˜aonum ficheiro ELF: typedef struct { Elf32 Word sh name ; Elf32 Word sh type ; Elf32 Word s h f l a g s ; Elf32 Addr sh addr ; E l f 3 2 O f f s h o f f s e t ; Elf32 Word s h s i z e ; Elf32 Word s h l i n k ; Elf32 Word s h i n f o ; Elf32 Word s h a d d r a l i g n ; Elf32 Word s h e n t s i z e ; } Elf32 Shdr ; Listing 2.2: Defini¸c˜aoda estrutura cabe¸calhode sec¸c˜ao.

Esta estrutura identifica um bloco de dados associado a uma sec¸c˜aoe o endere¸coem que este deve ser carregado em mem´oria,assim como o nome e outros atributos. sh name Esta vari´avel guarda o nome da sec¸c˜ao;

sh type Neste campo s˜aodefinidos o tipo de conte´udoexistente na sec¸c˜ao.Ver [Sta01] para mais informa¸c˜ao;

sh flags Descreve um conjunto de atributos associados `asec¸c˜ao;

sh addr Guarda o endere¸cono qual deve ser carregado o primeiro byte da sec¸c˜ao; sh offset Possui o valor do deslocamento desde o inicio do ficheiro at´eao primeiro byte da sec¸c˜ao;

sh size Guarda o tamanho da sec¸c˜aoem bytes;

sh link Guarda uma referˆenciapara um ´ındiceda tabela de cabe¸calhoda sec¸c˜ao. A sua interpreta¸c˜aodepende exclusivamente do tipo de sec¸c˜ao;

sh info Guarda informa¸c˜aoextra cuja interpreta¸c˜aodepende do tipo de sec¸c˜ao; 22 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS sh addralign Indica se a sec¸c˜aodeve ser alinhada ou n˜ao;

sh entsize Uma vez que algumas sec¸c˜oes possuem uma tabela de s´ımbolos, sendo o tamanho de cada entrada igual, este campo guarda o valor de cada entrada.

Atrav´esda estrutura acima citada, ´eposs´ıvel aceder a toda a informa¸c˜aorelativa a cada sec¸c˜ao,assim como a localiza¸c˜aode cada atributo dentro do ficheiro ELF.

Para informa¸c˜oesdetalhadas relativas ao formato ELF ver [Sta01]. Em seguida veremos a forma com o simulador extrai a informa¸c˜aoproveniente do ficheiro bin´ario.

2.4.2 Interpreta¸c˜aode ficheiros ELF

O processo de interpreta¸c˜aodo ficheiro bin´arioexecut´avel, passado como argumento ao simulador, encontra-se dividido em trˆesopera¸c˜oes:extrair o cabe¸calhoELF, localiza¸c˜ao da tabela de sec¸c˜oes e extrac¸c˜aode conte´udos.

A primeira fase consiste na extrac¸c˜aodo cabe¸calhoELF localizado no in´ıciodo ficheiro ELF. No seguinte bloco de c´odigo´epossivel visualizar a extrac¸c˜aodo cabe¸calhoELF:

Elf32 Ehdr elfEhdr; Elf32 Shdr ∗ e l f S h d r ; FILE ∗ targetFile; char tempBuf[64]; int index , r e t = −1;

targetFile = fopen(argv[1], ”r”); i f (targetFile == NULL) { printf(”File not open! \ n” ) ; e x i t (−1) ; }

i f (targetFile) { /∗ Ler cabecalho ELF(Endereco zero do ficheiro) ∗/ fread(&elfEhdr , sizeof (elfEhdr), 1, targetFile); Listing 2.3: Extrac¸c˜aodo cabe¸calhoELF.

Uma vez executado o bloco de c´odigo,o simulador disp˜oede acesso aos campos: e_shoff, e_shnum e e_shentsize, que possuem o deslocamento da tabela de cabe¸calhosdas sec¸c˜oes,o n´umerode sec¸c˜oesexistentes e o tamanho de cada sec¸c˜ao,respectivamente. 2.4. EXECUTABLE AND LINKABLE FORMAT (ELF) 23

Assim, atrav´esdo campo e_shoff ´eposs´ıvel localizar a tabela de sec¸c˜oes,sendo em seguida necess´arioreservar espa¸coem mem´oriae modificar o apontador do ficheiro ELF para a localiza¸c˜aoda tabela de sec¸c˜oescomo podemos ver no bloco de c´odigoabaixo.

/∗ Elf32 Ehdr.e shnum indicao numero de seccoes existentes ∗/ elfShdr = calloc(elfEhdr.e shnum , sizeof (∗ e l f S h d r ) ) ; assert(elfShdr);

/∗ Modificaro apontador do ficheiro paraa tabela de cabecalho das seccoes ∗/ fseek(targetFile , elfEhdr.e s h o f f , SEEK SET) ; fread(elfShdr , sizeof (∗ elfShdr), elfEhdr.e shnum, targetFile); Listing 2.4: Modifica¸c˜aodo apontador do ficheiro para a tabela de sec¸c˜oes.

A ´ultimafase consiste em percorrer todas as sec¸c˜oesde forma iterativa, uma vez que sabemos o n´umerode entradas na tabela de sec¸c˜oesatrav´esdo e_shnum, introduzindo assim o c´odigode cada sec¸c˜aona mem´oriaRAM.

Existem no entanto um conjunto de sec¸c˜oes especiais, utilizadas especificamente pelo assembler, como .text, .bss ou .data. Independentemente do tipo de sec¸c˜ao,o simu- lador processar´asem excep¸c˜oes,introduzindo todo o c´odigoexistente nas sec¸c˜oespara a mem´oriado simulador como podemos ver no bloco de c´odigobin´arioabaixo:

/∗ P e r c o r r e r cada seccao ∗/ for ( index = 0 ; ( unsigned int ) index < elfEhdr . e shnum; index++){

/∗ Seo Elf32 Shdr.sh addr for diferente de zero, entaoa seccao deve ser carregada para memoria ∗/ i f (elfShdr[index].sh addr ) {

/∗ Modificaro apontador do ficheiro parao nome da seccaoe l e ro valor ∗/ fseek(targetFile , elfShdr[elfEhdr.e shstrndx ]. sh o f f s e t + elfShdr[index].sh name , SEEK SET) ;

int j = 0 ;//Contador int word ;//Instrucao

fseek(targetFile , elfShdr[index]. sh offset , SEEK SET) ;

for ( j =0; j< (elfShdr[index]. sh size)/4; j++){ //Ler codigo binario da seccao paraa memoria RAM fread(&word, sizeof (WORD), 1, targetFile); 24 CAP´ITULO 2. ESTADO DA ARTE E CONCEITOS ENVOLVIDOS

StoreMemory (cpu, sizeof (WORD) , ( ( j ) ∗4)+elfShdr [index ] . sh addr, word); } //End FOR de codigo binario } //EndIF de elfShdr[index].sh addr } //End FOR percorrer seccoes

fclose(targetFile); free(elfShdr); Listing 2.5: Extrac¸c˜aode informa¸c˜aodas sec¸c˜oes.

Em cada itera¸c˜aodo ciclo, ´enecess´ariovalidar se a sec¸c˜aoser´acarregada para a mem´oria atrav´esdo valor existente em elfShdr[index].sh_addr, uma vez que este identifica o endere¸cobase da sec¸c˜ao.

Em seguida ´enecess´ariogerar um novo ciclo de forma a percorrer a informa¸c˜aobin´aria da sec¸c˜ao,apontada pelo o endere¸coexistente em elfShdr[index].sh_offset, intro- duzindo assim a informa¸c˜aona mem´oriaRAM do simulador. Cap´ıtulo3

Sistema Proposto

Neste cap´ıtuloser´afeita uma descri¸c˜aogeral do sistema proposto assim como as meto- dologias utilizadas.

A sec¸c˜ao 3.1 descreve o que se pretende com o trabalho em 3.1.1 e qual a metodologia a seguir na sec¸c˜ao 3.1.2. A arquitectura ´eexposta na sec¸c˜ao 3.2, a apresenta¸c˜aodos m´odulosdo sistema na sec¸c˜ao 3.2.1 e a plataforma em que o trabalho foi desenvolvido em 3.2.2.

Os cap´ıtulosseguintes exp˜oemdetalhadamente os procedimentos adoptados em cada fase do trabalho.

3.1 Apresenta¸c˜ao

Cada vez mais a virtualiza¸c˜aode sistemas det´emum papel fundamental no funciona- mento de qualquer empresa. Os seus benef´ıcioss˜aoin´umeros sendo que talvez o mais importante seja o econ´omico.A possibilidade de correr sistemas dentro de outros siste- mas introduz um n´ıvel de flexibilidade elevado para v´arias´areascomo o desenvolvimento de aplica¸c˜oesou cria¸c˜aode ambientes novos. Assim, a necessidade de aquisi¸c˜aode com- ponentes f´ısicosnovos para cria¸c˜aode novos sistemas diminui, assim como a manuten¸c˜ao.

Desta tem´aticasurgiu a vontade de criar um simulador para a arquitectura MIPS que n˜aose limite apenas a criar o motor de execu¸c˜aomas sim todos os mecanismos inerentes

25 26 CAP´ITULO 3. SISTEMA PROPOSTO

`asua arquitectura.

O presente trabalho demonstra a forma como s˜aodesenvolvidos os primeiros passos no processo de virtualiza¸c˜aode sistemas, assim como seus mecanismos e motor de execu¸c˜ao direccionados para a arquitectura MIPS32.

3.1.1 O que se pretende

A virtualiza¸c˜aode sistemas come¸capor simular o comportamento da arquitectura de- sejada, criando assim uma camada de abstrac¸c˜aono qual o sistema h´ospede assentar´a e poder´aexecutar c´odigonativo da respectiva arquitectura. A figura 3.1 apresenta o conjunto de camadas que existem entre o hardware real e o sistema que est´aa ser virtu- alizado.

 

6$%4"



0"!1 " !" 0 2"" #$!%&'() !3 4"

7$%4"8 9 

6 2"B0$15 C$0$  !5'7B"BDE)

" 5"!3 4"

@ !"!3 4"

8 9 3A0"

Figura 3.1: Camadas de abstra¸c˜ao.

O papel desta camada ´eoptimizar a comunica¸c˜aoentre os dois sistemas operativos, o h´ospede e o anfitri˜ao,para que seja apresentado ao sistema virtualizado um ambiente de execu¸c˜aosemelhante ao que se obteria com hardware f´ısico. 3.1. APRESENTAC¸ AO˜ 27

E´ exactamente isto que acontece em simuladores como o VMWare Player ou vSphere, Oracle VirtualBox, QEMU ou Microsoft Hyper-V. Estes simulam v´arioscomponentes gen´ericosque ser˜aoutilizados no simulador, tamb´emconhecido por m´aquinavirtual. Estas m´aquinas,de forma a permitir executar sistemas operativos complexos, necessi- tam responder a v´ariosrequisitos das arquitecturas simuladas, nomeadamente, modos de execu¸c˜ao,estruturas do processador, organiza¸c˜aoe gest˜aoda mem´oria,mecanismos f´ısicosou virtuais.

O mesmo acontece com a arquitectura MIPS, onde existem v´ariosmecanismos e requisi- tos m´ınimosque devem ser cumpridos de forma a se poder afirmar que se tˆemrealmente um simulador.

Este trabalho est´adirectamente relacionado com esta tem´atica, uma vez que o seu objec- tivo principal ´ea cria¸c˜aodesta camada de software na m´aquinaanfitri˜ao,possibilitando a simula¸c˜aode hardware e permitindo que c´odigo nativo da arquitectura MIPS possa correr fluentemente.

Assim, o simulador desenvolvido neste trabalho dever´arespeitar os seguintes requisitos:

1. Implementa¸c˜aoda arquitectura MIPS32 Revis˜ao2;

2. Implementa¸c˜aodos modos de execu¸c˜ao Kernel e User;

3. Implementa¸c˜aodos coprocessadores de controlo, v´ırgula flutuante e respectivos registos internos;

4. Implementa¸c˜aodos componentes f´ısicosnecess´arios`aexecu¸c˜aode um sistema fun- cional como o processador, mem´oriaprincipal e m´odulode liga¸c˜aoentre os v´arios componentes;

5. Implementa¸c˜aodos mecanismos de mem´oriavirtual, nomeadamente de tradu¸c˜ao de endere¸cospara a arquitectura MIPS32;

6. Implementa¸c˜aodo mecanismo de excep¸c˜oespara a arquitectura MIPS32;

7. Implementa¸c˜aodo mecanismo de interrup¸c˜oespara a arquitectura MIPS32;

8. Execu¸c˜aode c´odigobin´ariono formato ELF. 28 CAP´ITULO 3. SISTEMA PROPOSTO

3.1.2 Metodologias

A documenta¸c˜aobase utilizada na constru¸c˜aodo simulador para a arquitectura MIPS32 ´e:

1. Referˆenciar´apidapara a ISA MIPS32, [MT08];

2. Introdu¸c˜ao`aarquitectura MIPS32, [MT10a];

3. Instruction Set da arquitectura MIPS32, [MT10b];

4. Privileged Resource Architecture da arquitectura MIPS32, [MT10c];

5. Livro complementar ”See MIPS Run”,[Swe06];

6. Descri¸c˜aot´ecnicada motherboard Malta MIPS, [MT02];

7. Descri¸c˜aot´ecnicade um microcontralador que utiliza processador MIPS, [Mic09].

Cronologicamente, o simulador desenvolveu-se nas seguintes fases:

1. Desenho e constru¸c˜aodo motor de execu¸c˜aopara um processador gen´ericoMIPS32;

2. Constru¸c˜aode um componente que simule a mem´oriaRAM para armazenamento de dados em tempo de execu¸c˜ao;

3. Desenho e implementa¸c˜aodo elo de liga¸c˜aoentre o processador e a mem´oriaRAM;

4. Acrescento do mecanismo de excep¸c˜oes no processador;

5. Introdu¸c˜aodo mecanismo de tradu¸c˜aode endere¸cosTLB na MMU do processador;

6. Optimiza¸c˜aodo simulador;

7. Enriquecimento das funcionalidades do processador;

8. Implementa¸c˜aode c´odigobin´ario,simples e elaborado, para testes e demonstra¸c˜oes;

9. Utiliza¸c˜aodo sistema na sua totalidade.

Em primeiro lugar ´enecess´arioconstruir o motor de execu¸c˜aodo processador cuja essˆenciaconsiste no conjunto de instru¸c˜oesISA, na unidade de gest˜aode mem´oriasem tradu¸c˜aode endere¸cos(FMT), nos registos gen´ericosnecess´ariosao processamento das instru¸c˜oese nos registos privados do coprocessador de controlo que guardam informa¸c˜oes relativas a modos de opera¸c˜ao,configura¸c˜oese estados do processador. 3.1. APRESENTAC¸ AO˜ 29

Dado que nesta fase alguns mecanismos ou componentes ainda n˜aoexistem, ´enecess´ario simular determinados “comportamentos” de forma a possibilitar o teste das instru¸c˜oes. Um exemplo destes casos s˜aoas instru¸c˜oesde acesso `amem´oria, load e store, ou a chamada ao sistema syscall que acede ao mecanismo de excep¸c˜oesdo processador.

O passo seguinte consiste na cria¸c˜aode uma “´area”de trabalho para o processador poder armazenar e executar blocos de c´odigosequenciais, mormente a mem´oriaRAM. A mem´oriaRAM n˜aosegue uma especifica¸c˜aoj´aexistente, o que n˜aoimplica que a sua estrutura seja desorganizada. O seu funcionamento deve em todas as situa¸c˜oesrespeitar o de uma mem´oriaRAM real, contextualizada no ˆambito do processo de simula¸c˜ao.

Uma vez implementados os dois componentes principais ´enecess´ariocriar um elo de comunica¸c˜aoentre ambos. Surge assim a necessidade de criar a base na qual todos os componentes se ir˜aoligar, `asemelhan¸cado que acontece com uma motherboard real. E´ aqui que todos os componentes ser˜aoinstanciados, mapeados e interligados entre si de forma a possibilitar o seu funcionamento. E´ igualmente neste m´oduloque ser´afeito o controlo externo sobre os programas a correr internamente no simulador. Note-se que uma vez estabelecidos os canais ´enecess´ariovalidar e testar a integra¸c˜aoe comunica¸c˜ao dos m´odulos. Um exemplo destas situa¸c˜oess˜aoas instru¸c˜oesacima referidas Load e Store.

Na quarta fase o simulador est´aapto para correr instru¸c˜oesaritm´eticas,l´ogicas,saltos condicionais e incondicionais, mas n˜aose encontra apto para executar um subconjunto de instru¸c˜oesde controlo e administra¸c˜aodo fluxo de execu¸c˜ao.Assim, algumas instru¸c˜oes n˜aoforam totalmente implementadas uma vez que se encontra em falta o mecanismo de excep¸c˜oes. E´ nesta fase que este mecanismo ´eimplementado de forma a possibilitar ao processador a utiliza¸c˜aodas chamadas ao sistema, controlo do mecanismo de tradu¸c˜ao de endere¸cos TLB e utiliza¸c˜aode entry points definidos pela arquitectura, entre outros aspectos.

A gest˜aode mem´oria´eum dos aspectos mais importantes na constru¸c˜aode um sistema operativo uma vez que a mem´oriatem limite e o sistema deve de ser capaz de se orga- nizar internamente de forma a manter a informa¸c˜aoprotegida e coerente. Para tal, a arquitectura MIPS disponibiliza trˆesmecanismos para auxiliar a gest˜aoe manuten¸c˜ao da mem´oria,sendo eles: Translation Lookaside Buffer (TLB), Fixed Mapping Transla- tion (FMT) e Block Address. Assim nasceu a necessidade de escolher qual o mecanismo mais adequado para se simular e introduzir no simulador. Dado que este dever´acorrer um pequeno Kernel que possibilitar´aa demonstra¸c˜aodo funcionamento e da gest˜aoda mem´oria,optou-se pela implementa¸c˜aoe integra¸c˜aona MMU do processador uma TLB. Desta forma ser´aposs´ıvel tamb´emdemonstra¸c˜aodo funcionamento de um mecanismo de gest˜aode mem´oriacomplexo e a sua interac¸c˜aocom o processador. 30 CAP´ITULO 3. SISTEMA PROPOSTO

Na sexta fase decidiu-se que o funcionamento do simulador n˜aopoderia ser est´atico,isto ´e,a declara¸c˜aode estruturas e chamada de fun¸c˜oesn˜aoeram mapeadas, sendo utili- zados os nomes espec´ıficosde cada implementa¸c˜ao. Assim, procedeu-se `aoptimiza¸c˜ao do sistema modularizando todos os componentes e mapeando todas as estruturas de dados e fun¸c˜oesde forma a permitir a utiliza¸c˜aode outros componentes no simulador. Atrav´esdos mapeamentos o simulador permitir´aque sejam utilizados componentes de- senvolvidos por terceiros. Outro aspecto relevante ´ea possibilidade de parametriza¸c˜ao do simulador, permitindo a modifica¸c˜aode estados do processador, estados da mem´oria ou mapeamentos da MMU, assim como a introdu¸c˜aode funcionalidades de interac¸c˜ao entre o utilizador, o simulador e o programa em execu¸c˜aointernamente.

No plano de desenvolvimento do simulador, a s´etimafase ´eprecisamente a ´ultima,uma vez que ´enesta fase que se adicionam funcionalidades extra ao processador, claramente desej´aveis, sem comprometer as camadas que j´ase encontram implementadas. Na sua grande maioria, as funcionalidades extra possuem neste estado os requisitos m´ınimos preenchidos para a sua implementa¸c˜ao.Em certas situa¸c˜oespode surgir a necessidade de implementa¸c˜aode instru¸c˜oesdestinadas ao uso de um mecanismo concreto ou com- ponente como a cache. Pegando como exemplo o mecanismo de interrup¸c˜oesou o co- processador de virgula flutuante (CP1), note-se que ambos n˜aos˜aoobrigat´oriospara o funcionamento base do simulador uma vez que o primeiro ´eutilizado para comu- nica¸c˜aocom perif´ericos(opcional) e o segundo para c´alculosde v´ırgula flutuante. No primeiro caso existe uma dependˆenciado mecanismo de excep¸c˜oeso que implica que o mecanismo de interrup¸c˜oesn˜aofuncionar´asem que o primeiro se encontre a funcionar. Relativamente ao segundo exemplo, o coprocessador um, este apenas tem dependˆencia do coprocessador zero que ´eo respons´avel pelo fluxo de execu¸c˜ao.

Conclu´ıdaa implementa¸c˜aodo simulador e de todos os seus mecanismos de execu¸c˜ao, encontramo-nos na altura indicada para se criar exemplos preparados que demonstrem o funcionamento correcto dos v´arioscomponentes e mecanismos da arquitectura MIPS.

Por ´ultimotemos a fase de utiliza¸c˜aodo sistema, na qual se poder´adesenvolver c´odigo bin´arioMIPS e correr no simulador, dispondo de todas as funcionalidades de interac¸c˜ao oferecidas pelo mesmo. Todos os exemplos ser˜aodemonstrados em detalhe no cap´ıtulo 5 deste trabalho.

3.2 Arquitectura

Em seguida ser´adescrita a arquitectura em que o simulador foi concebido. Para tal ser´a apresentada uma lista de m´oduloschave que demonstram o funcionamento do simulador e a forma como estes m´oduloscomunicam entre si. 3.2. ARQUITECTURA 31

E´ importante referir que este trabalho foi realizado utilizando ferramentas j´adispon´ıveis auxiliadas com outras desenvolvidas inteiramente de raiz. Deste modo, trata-se de um prot´otipo sobre o qual foram realizados testes, descritos ao longo deste documento, n˜ao devendo ser considerado um produto exaustivamente aperfei¸coado.

3.2.1 M´odulosdo Sistema

A arquitectura do sistema ´ebaseado em v´ariosm´oduloscomplementares mas indepen- dentes entre si, formando assim um sistema complexo e funcional. Cada m´odulotem uma fun¸c˜aoespec´ıfica,sendo em alguns casos poss´ıvel que o seu funcionamento interno varie com o tipo de implementa¸c˜ao.

Um exemplo disso ´eo facto de ser poss´ıvel parametrizar o sistema de forma a escolher qual a arquitectura que ser´autilizada no simulador, 32 ou 64 bits, embora apenas a arquitectura de 32 bits se encontre implementada.

A figura 3.2 apresenta um esquema da arquitectura, identificando a forma como os m´odulosest˜aorelacionados.

    15"62 16832 3 4 $    %& 57 " 6 6 84 3(99

1"")2   "   (   

   @ 

D B    #$"  A

   !   BB '( )0 "

   #C" @ 

Figura 3.2: M´odulos do SimuladorUE. 32 CAP´ITULO 3. SISTEMA PROPOSTO

O m´oduloprincipal ´eo processador, descrito no cap´ıtulo 4.1, que implementa os meca- nismos de opera¸c˜ao,controlo e fluxo de execu¸c˜aoda arquitectura MIPS 32 e 64 bits. A unidade de gest˜aoMMU, interna ao processador, recebe pedidos de acesso ao m´oduloda mem´oriaprincipal pelo processador. E´ sua responsabilidade, atrav´esdo mecanismo de tradu¸c˜aoactivo, proceder `atradu¸c˜aodos endere¸cosvirtuais para endere¸cosf´ısicosque ser˜aoutilizados para aceder `amem´oriaprincipal, como est´adesmonstrado nos cap´ıtulos 4.2e 4.3.

Indexado ao funcionamento do m´odulo MMU est˜aoos mecanismos de tradu¸c˜aode en- dere¸c˜osTLB, FMT e Block Address, no qual apenas o primeiro se encontra implemen- tado. Estes s˜aoos trˆesformatos de resolu¸c˜aode endere¸cossuportados pela arquitectura MIPS. A TLB ´eo modelo indicado para sistemas que exijam uma complexidade elevada por parte da gest˜aode mem´oria,uma vez que permite mapear endere¸cosvirtuais nos segmentos USEG, KSEG2 e KSEG3 dinamicamente. O modelo FMT ´eoptimizado para sistemas que exijam uma complexidade baixa de gest˜aode recursos como os microcon- troladores. O terceiro modelo consiste numa tabela com mapeamentos, semelhante ao que acontece com o mecanismo TLB, uma vez que utiliza um subconjunto dos registos do coprocessador central igualmente utilizados pela TLB. Neste mecanismo n˜aoexis- tem endere¸cospr´edefinidos como acontece no mecanismo TLB ou FMT, sendo todos os endere¸cosmapeados manualmente.

A mem´oriado simulador ´ecomposta pelas componentes RAM e ROM. A primeira possui trˆestipos de representa¸c˜oesposs´ıveis, sendo o modelo com listas ligadas escolhido para implementa¸c˜ao. Esta mem´oria´eutilizada pelo simulador como ´areade trabalho para o processador assim como armazenamento de dados e c´odigobin´ario. Optou-se pela implementa¸c˜aosimples de uma mem´oriaROM, com o objectivo de simular o processo de arranque o mais pr´oximoposs´ıvel da realidade.

O m´odulode parametriza¸c˜oes,´ecomposto por um ficheiro header de configura¸c˜oes hard- coded, que moldar´ao sistema e permitir´ao mapeamento de estruturas e fun¸c˜oesno simu- lador em tempo de compila¸c˜ao.Incialmente pensou-se na utiliza¸c˜aode ficheiros parame- triz´aveis, mas uma vez que o sistema ainda se encontra em desenvolvimento decidiu-se pela parametriza¸c˜ao hardcoded. Desta forma o simulador criar´auma camada de abs- tra¸c˜aocom os componentes utilizados, permitindo que a programa¸c˜aodo simulador seja gen´ericae n˜aocontenha detalhes de implementa¸c˜oesespec´ıficas.

Assim, o simulador ´erespons´avel pela instancia¸c˜aoe mapeamento, segundo as parame- triza¸c˜oes hardcoded, das estruturas internas necess´ariasao funcionamento dos dispositi- vos. E´ igualmente sua responsabilidade a cria¸c˜aoe atribui¸c˜aodos canais de comunica¸c˜ao entre os perif´ericosacima citados, assim como o lan¸camento da execu¸c˜aode cada com- ponente num novo processo. No cap´ıtulo4 ser´aapresentado o modelo e a forma como ´e 3.2. ARQUITECTURA 33 feita a comunica¸c˜aoentre os simulador e os m´odulosdo sistema.

Por ´ultimotemos o m´oduloDispatcher, controlado pelo o simulador e cuja fun¸c˜aocon- siste em controlar os canais de comunica¸c˜ao,assim como mapear os pedidos do proces- sador para os dispositvos ligados na placa m˜ae. Em motherboards reais este m´odulo ´e composto por um chip que controla tanto o Northbridge como o Southbridge. Ambos funcionam como hubs onde se ligam v´ariosdispositivos, sendo o primeiro respons´avel pela comunica¸c˜aoentre o processador, a RAM e placa gr´afica.O segundo ´erespons´avel por mapear os restantes dispositivos, nomeadamente: PCI, USB, ISA, IDE, ROM ou Legacy.

3.2.2 Plataforma de desenvolvimento

Todo o trabalho foi desenvolvido utilizando o sistema operativo Linux. A produ¸c˜aodo c´odigodo simulador foi desenvolvida na linguagem ANSI C atrav´esdo IDE CodeBlocks1, que por sua vez possui internamente os compiladores GCC, G++ e GDB (Debugger)2.

A utiliza¸c˜aodo debuger (gdb) foi uma pe¸cafundamental na constru¸c˜aoe depura¸c˜aodos processos filhos, uma vez que estes s˜aogerados pelo simulador. Atrav´esde flags3 como o set follow-fork-mode ou set detach-on-fork foi poss´ıvel modificar o caminho utilizado pelo debuger, de forma a permitir a depura¸c˜aodos componentes ligados ao simulador.

Para o desenvolvimento de m´odulose programas de teste em assembly MIPS, utilizou-se o Sourcery CodeBench4 disponibilizado pela MIPS Inc5.

Este Workbench disponibiliza um leque de ferramentas que auxiliam o desenvolvimento do c´odigoMIPS atrav´esda linguagem ANSI C ou assembler MIPS directamente, o que facilita em muito a tarefa de programa¸c˜ao. Com este Workbench ´eposs´ıvel, atrav´esdo processo de compila¸c˜aocruzada, produzir c´odigobin´arioespecificamente para a arquitectura MIPS32.

Do conjunto de ferramentas disponibilizadas, tamb´emconhecidas como binutils, destacam- se as seguintes:

• Compilador cruzado para a arquitectura MIPS32 (GNU C Compiler) para a lin- guagem ANSI C (mips-linux-gnu-gcc);

1P´aginaweb para o IDE CodeBlocks - http://www.codeblocks.org 2P´aginaweb para o GDB - http://www.gnu.org/software/gdb/ 3P´aginaoficial GDB - http://sourceware.org/gdb/onlinedocs/gdb/Forks.html 4P´aginaweb para o Workbench MIPS - http://developer.mips.com 5P´aginaweb da MIPS Inc - http://www.mips.com 34 CAP´ITULO 3. SISTEMA PROPOSTO

• Compilador para assembler MIPS as (mips-linux-gnu-as);

• Objdump para reconstru¸c˜aodo c´odigobin´ario (mips-linux-gnu-objdump);

• Readelf para obten¸c˜aode informa¸c˜aode ficheiros bin´ariosELF (mips-linux-gnu-readelf);

• Elfedit para modifica¸c˜aodos cabe¸calhosdos mesmos (mips-linux-gnu-elfedit);

• Ld para linkagem de ficheiros objectos e bin´aros (mips-linux-gnu-ld);

• Objcopy para manipula¸c˜aoe gera¸c˜aode ficheiros bin´arios (mips-linux-gnu-objcopy);

• Debuger para linguagem ANSI C gdb (mips-linux-gnu-gdb);

• Pr´e-processador para a linguagem ANSI C cpp (mips-linux-gnu-cpp).

Embora o compilador GCC disponibilizado para a arquitectura MIPS seja a ferramenta ideal para desenvolvimento de c´odigo,mostrou-se demasiado sofisticado para a primeira fase de desenvolvimento e testes no simulador, for¸candoa utiliza¸c˜aodo assembler as da arquitectura MIPS para a gera¸c˜aode c´odigobin´ario.

De forma a tornar o simulador robusto e v´alido,em ambiente de desenvolvimento, definiu-se que apenas seriam suportados ficheiros bin´ariosque sigam a norma ELF, uma vez que ´eo formato standard para ficheiros execut´aveis em sistemas operativos da fam´ıliaLinux. Cap´ıtulo4

M´odulos

Este cap´ıtulodescreve os v´ariosm´odulosbase constituintes do simulador, nomeadamente o processador na sec¸c˜ao 4.1, a unidade de gest˜aode mem´oriana sec¸c˜ao 4.2, mecanismo de tradu¸c˜aode endere¸cosda TLB na sec¸c˜ao 4.3, mem´oriaRAM e a mem´oriaROM na sec¸c˜ao 4.4.

Nas seguintes sec¸c˜oesanalisa-se em detalhe a estrutura e o funcionamento de um proces- sador gen´ericopara arquitectura MIPS32, abordando a ordena¸c˜aodos bytes em 4.1.2, a forma como o c´odigoobjecto ´einterpretado em 4.1.3 e posteriormente representado na mem´oriado simulador. Ser˜aoabordados os casos de utiliza¸c˜aodos pipelines em 4.1.4eo desenho do coprocessador de controlo na sec¸c˜ao 4.1.5, tamb´emconhecido como coproces- sador zero, sendo seus respectivos registos internos e gen´ericosdescritos nas sec¸c˜oes 4.1.6 e 4.1.7. Ser˜aoigualmente explanados na sec¸c˜ao 4.1.1 os modos de execu¸c˜ao User e Kernel do processador e seu funcionamento dentro do simulador. Os mecanismos de excep¸c˜oes e interrup¸c˜oesda arquitectura MIPS32, essenciais para a execu¸c˜aoe comunica¸c˜aodo sistema com perif´ericos,ser˜aoabordados detalhadamente na sec¸c˜ao 4.1.8.

Uma vez que o processador usufrui do mecanismo de mem´oriavirtual, ´enecess´arioemular uma mem´oriaf´ısicaque ter´aos seus endere¸cosmapeados pela mem´oriavirtual. Esta organiza¸c˜aoencontra-se descrita na sec¸c˜ao 4.4 deste cap´ıtulo.As sec¸c˜oes 4.2e 4.3 ser˜ao dedicadas `aexplana¸c˜aodas estruturas utilizadas para suportar a unidade de gest˜aode mem´oria(MMU) e a forma como a arquitectura MIPS faz a tradu¸c˜aode endere¸coscom a TLB.

35 36 CAP´ITULO 4. MODULOS´

Os cap´ıtulosseguintes exp˜oemdetalhadamente os procedimentos adoptados em cada fase do trabalho.

4.1 Processador

No processo de constru¸c˜aode um simulador para uma arquitectura, independentemente da sua finalidade, o passo principal ´eo desenho e constru¸c˜aodo motor de execu¸c˜ao, mormente, o processador. Este ´eo mecanismo principal que receber´aa informa¸c˜aono seu estado “bruto”, e ap´ossua interpreta¸c˜aoa executar´a.

A fam´ıliaMIPS cont´emv´ariasimplementa¸c˜oesdiferentes para processadores, que po- dem: variar no tamanho das instru¸c˜oes(32 bits, 64 bits ou codifica¸c˜aode 16 bits para microcontroladores); possuir um ou v´ariosn´ucleosde execu¸c˜ao;permitir a utiliza¸c˜aode threads; variar no mecanismo de tradu¸c˜aode endere¸cos,entre muitas outras funcionali- dades.

Dadas as referidas condi¸c˜oes, optou-se pela implementa¸c˜aogen´ericade um processador MIPS, com apenas um n´ucleode execu¸c˜ao,onde a ISA ser´aessencialmente a MIPS32 (ver. 2)1 e o mecanismo de tradu¸c˜aoutilizado a TLB. Assim, o primeiro passo na cons- tru¸c˜aodo processador ´ea defini¸c˜aode uma estrutura base que represente o processador. typedef struct CPU 32{

/∗ Unidade de Gestao de Memoria ∗/ MMU ∗mmu;

/∗ Canais de comunicacao ∗ Tx − Transmissor MMU −−> RAM ∗ Rx − Receptor MMU <−− RAM ∗/

int Tx ; int Rx ;

/∗ Re gis tos do Coprocessador0 ∗ 32 Registos de 32 bits ∗/ GPR CP0R[ CP0 Registos ] ;

1A ISA MIPS32r2 ´ea evolu¸c˜aodas suas antecessoras (nomeadamente MIPS I, MIPS II, MIPS III e MIPS IV) mantendo actualmente retro compatibilidade em grande parte da arquitectura, tendo algumas instru¸c˜oessido eliminadas, outras adicionadas, e algumas altera¸c˜oesefectuadas na unidade de controlo. 4.1. PROCESSADOR 37

/∗ Re gis tos especiais ∗ ∗ PC − Program Counter,HI, LO ∗ I n s t(actual) ∗/

GPR HI ; GPR LO;

int PC;//Proxima Instrucao int I n s t ;//Instrucao Actual int PC Delay ;//Program Counter(Jump’se Branch’s)

int State ;//Estado do CPU //Normal, Delay Branch ou Idle

/∗ Re gis tos do Coprocessador0 ∗/ CP0 Entry ∗CP0 Reg [ 3 2 ] ;

} CPU 32 ; Listing 4.1: Representa¸c˜aodo processador gen´ericoMIPS.

E´ atrav´esdesta estrutura que s˜aodefinidas as vari´aveis necess´ariaspara simular o com- portamento de um processador real. No bloco de c´odigo 4.1, pode-se observar as de- fini¸c˜oes:da unidade de gest˜aode mem´oria(MMU) e seus respectivos canais de comu- nica¸c˜ao,dos registos gen´ericos,dos registos internos, dos registos especiais HI e LO para opera¸c˜oesaritm´eticasde multiplica¸c˜aoe divis˜ao,do PC (Program Counter) e um registo especial concebido apenas para o processo de simula¸c˜ao,o registo “Inst”.

Numa abordagem inicial, foquemo-nos exclusivamente nas vari´aveis: “State”, “Inst”, “PC” e “PC Delay”. Relativamente `asrestantes estruturas mencionadas acima, estas ser˜aoabordadas mais `afrente neste cap´ıtulo,uma vez que n˜aos˜aonecess´ariaspara a constru¸c˜aoda m´aquinade estados principal do processador.

O registo Inst cont´emo endere¸coda instru¸c˜aoactual no processador enquanto que o registo PC indica qual a instru¸c˜aoseguinte (Inst + 4 bytes). O mesmo se aplica ao registo PC Delay, cujo objectivo ´eguardar o endere¸co para o qual o processador dever´amodificar o PC, ap´osser executada a instru¸c˜aoseguinte a uma instru¸c˜aode salto. Associado a este comportamento encontra-se o registo State no processador, cujo objectivo consiste em identificar o estado actual em que se encontra o processador a executar instru¸c˜oes.

S´oa estrutura em si n˜aopermite a execu¸c˜aode c´odigobin´ario,sendo necess´arioa 38 CAP´ITULO 4. MODULOS´

 



#$%&" %&$%&'(" #) $012#3" 4 )2#) 3" !"



#$%&" %&$%&" #) $012#3" 4 )2#) 3" &%5$" !"



!"

Figura 4.1: M´aquina de estados da execu¸c˜aono processador. defini¸c˜aode uma m´aquinade estados2 que far´aa gest˜aode toda a execu¸c˜aode instru¸c˜oes no processador. Desta forma, optou-se pela cria¸c˜aoda fun¸c˜ao: void executa (CPU ∗cpu ) ; Listing 4.2: Fun¸c˜aorespons´avel pela execu¸c˜aodo processador.

E´ atrav´esdesta fun¸c˜aoque ser´aefectuado o controlo interno do fluxo de execu¸c˜ao3 no processador. A cada chamada desta fun¸c˜ao,ser´agerada uma nova itera¸c˜aono proces- sador, for¸candoa execu¸c˜aode uma nova instru¸c˜aoproveniente da RAM assim como a actualiza¸c˜aodo estado do processador. Como identificado anteriormente, o processador possui internamente trˆesestados no qual pode funcionar: “Normal”, “Delay Branch” e “Idle”.

O modo Normal ´eo estado inicial do funcionamento do processador, sendo que todas as instru¸c˜oess˜aoexecutadas neste estado. Devido a limita¸c˜oesf´ısicasdo hardware em

2Esta m´aquinade estados ´enecess´ariapara implementar o comportamento Branch Delay existente nos pipelines (ver sec¸c˜ao 4.1.4). 3Dado que as fases de execu¸c˜aodo processo de pipelining n˜aos˜aosimuladas, a sua representa¸c˜ao´e feita atrav´esda fun¸c˜aoexecuta. 4.1. PROCESSADOR 39 determinadas situa¸c˜oes,nomeadamente a execu¸c˜aode instru¸c˜oesde salto, a instru¸c˜ao seguinte a um salto ´eexecutada antes da instru¸c˜aode salto, levando a uma mudan¸ca de estado no processador para “Delay Branch”. Esta situa¸c˜ao´edescrita em detalhe em 4.1.4. O ´ultimoestado ´eutilizado pelo software controlador do motor de execu¸c˜ao, neste caso o simulador, para enviar um sinal ao processador para entrar em estado “Idle”(espera). Normalmente utilizado para iniciar a sequˆenciade encerramento no processador e no simulador. Na figura 4.1 pode-se visualizar a m´aquinade estados respons´avel pelos estados internos do processador.

Chama-se no entanto `aaten¸c˜aoque a m´aquinade estados de execu¸c˜aono processa- dor ´eutilizada meramente para representar o funcionamento dos pipelines (ver 4.1.4) e n˜aoos estados internos do processador representados pelo PRA (Privileged Resource Architecture) da arquitectura MIPS32.

4.1.1 Modos de Execu¸c˜ao

O PRA (Privileged Resource Architecture) da arquitectura MIPS disponibiliza quatro modos de execu¸c˜ao,nomeadamente, Kernel, User, SuperUser e Debug, sendo apenas os dois primeiros obrigat´oriospara o seu funcionamento. Os modos de Debug e SuperUser definidos pelo PRA s˜aoopcionais, e para o primeiro ´enecess´arioa implementa¸c˜aodo mecanismo de depura¸c˜aode hardware EJTAG. Este mecanismo adiciona funcionalidades de depura¸c˜ao debug ao sistema e ´eum caso especial de execu¸c˜aopois, assim como o modo Kernel tamb´emtem acesso total aos recursos do sistema. O modo SuperUser ´edestinado para implementa¸c˜oesespec´ıficasdos arquitectos de sistemas operativos utilizarem. As flags no registo Status do coprocessador zero4 que controlam os modos de execu¸c˜aodo processador s˜ao:KSU (modo Kernel, SuperUser, User), EXL (Exception Level), ERL (Error Level) e o registo Debug, caso o mecanismo EJTAG esteja implementado. Segue- se uma pequena descri¸c˜aodos modos de opera¸c˜aodo processador:

• Modo Kernel Quando o processador se encontra em modo Kernel, este tem acesso total `asfun- cionalidades do processador, incluindo acesso total ao espa¸code endere¸camento na mem´oriavirtual, permiss˜aopara modifica¸c˜oesnos mapeamentos da mem´oriavir- tual nos mecanismos de tradu¸c˜aode endere¸cos,controlo sobre os registos gen´ericos, registos internos ou mecanismos de excep¸c˜oes. O processador encontra-se em modo Kernel se as seguintes condi¸c˜oesforem ver- dade:

4Os registos do coprocessador zero ser˜aoabordados na sec¸c˜ao 4.1.7. 40 CAP´ITULO 4. MODULOS´

– A flag DM no registo Debug ´e0 – A flag KSU no registo Status ´e0b00 – A flag EXL no registo Status ´e1 – A flag ERL no registo Status ´e1

Este modo ´eobrigat´orioe encontra-se implementado no simulador.

• Modo User Caso o processador se encontre a correr em modo User, este tem acesso5 aos regis- tos gen´ericose ao coprocessador um (v´ırgula flutuante). Caso os bits StatusCU3..0 se encontrem activos, o processador disp˜oede acesso aos registos internos do co- processor cujo bit se encontre activo. Possui tamb´emacesso limitado ao espa¸co de endere¸camento na mem´oriavirtual variando o seu dom´ınioentre 0x0000.0000 e 0x7FFF.FFFF. O processador encontra-se em modo User se as seguintes condi¸c˜oes forem verdade:

– A flag DM no registo Debug ´e0 – A flag KSU no registo Status ´e0b10 – A flag EXL no registo Status ´e0

Este modo ´eobrigat´orioe encontra-se implementado no simulador.

• Modo SuperUser Este modo de execu¸c˜ao´eopcional e a sua implementa¸c˜aodepende exclusivamente dos arquitectos do sistema. O processador encontra-se em modo Super User se as seguintes condi¸c˜oesforem verdade:

– A flag DM no registo Debug ´e0 – A flag KSU no registoStatus ´e0b01 – A flag EXL no registo Status ´e0 – A flag ERL no registo Status ´e0

Este modo ´eopcional e n˜aose encontra implementado no simulador.

• Modo Debug Para o processador entrar em modo de execu¸c˜ao Debug ´enecess´arioter implemen- tado o mecanismo EJTAG e conter a flag DM do registo Debug do coprocessador zero a 1. Neste modo de execu¸c˜aoo processador cont´emos mesmos atributos de execu¸c˜aoque o modo Kernel. Este modo ´eopcional e n˜aose encontra implemen- tado no simulador. 5Apenas em determinadas situa¸c˜oes,ver sec¸c˜ao 4.1.7 para uma descri¸c˜aodetalhada dos registos internos do coprocessador zero. 4.1. PROCESSADOR 41

Simula¸c˜aoem Software

Os modos acima referidos encontram-se implementados dentro do n´ucleode execu¸c˜ao do processador, mais propriamente na estrutura que representa os registos internos no ficheiro “Mips32 core.h”. O bloco de c´odigoseguinte apresenta a estrutura de dados utilizada para representar os registos internos respons´aveis pela gest˜aodos modos de opera¸c˜aodo processador. typedef struct CP0 Entry{ int Numero ;// Numero do Registo GPR S e l [ 8 ] ;// Sel − Re gis tos com Informacao char Comp [ 3 2 ] ;// Nivel de obrigatoriedade }CP0 Entry ; Listing 4.3: Representa¸c˜aodos registos internos do CP0.

Toda a estrutura assim como os registos internos, existentes e implementados, da ar- quitectura MIPS32, encontram-se devidamente explanados em 4.1.7, uma vez que nos iremos focar em apenas um registo, Status. Segue-se a defini¸c˜aodos registos do copro- cessador zero dentro da estrutura do processador: /∗ Re gis tos do Coprocessador0 ∗/ CP0 Entry ∗CP0 Reg [ 3 2 ] ; Listing 4.4: Conjunto de registos internos do CP0.

Dado que o modo de opera¸c˜ao debug n˜aose encontra implementado, o ´unicoregisto in- terno respons´avel pelos modos de opera¸c˜aono processador ´eo registo Status. O controlo ´efeito atrav´esdos bits KSU, EXL e ERL, sendo os primeiros dois bits do KSU utilizados para identificar qual o modo de execu¸c˜aose encontra activo caso os bits EXL e ERL se encontrem desligados. Nos casos em que os bits EXL ou ERL se encontrem activos, os bits KSU s˜aoignorados for¸candoo processador a entrar em modo kernel.

A sua manipula¸c˜ao´efeita atrav´esde aplica¸c˜aode m´ascarasde bits, uma vez que os restantes bits dentro da mesma word devem ser preservados. Desta forma definiu-se um conjunto de m´ascaras,que juntamente com opera¸c˜oesl´ogicasbitwise permitem a modifica¸c˜aodos bits.

A t´ıtulode facilitar o acesso aos registos e o debug do simulador, optou-se igualmente pela defini¸c˜aode macros para acesso aos valores dos bits espec´ıficos. //Status #define Status cpu−>CP0 Reg[12]−> S e l [ 0 ] #define StatusKSU (Status & (bit 3 | b i t 4 ) ) >> 3 42 CAP´ITULO 4. MODULOS´

#define StatusERL (Status & bit 2 ) >> 2 #define StatusEXL (Status & bit 1 ) >> 1 Listing 4.5: Macros para o registo interno Status e respectivos bits (flags).

Desta forma a manipula¸c˜aodos bits torna-se bastante simples uma vez que a sua ex- trac¸c˜ao´efeita atrav´esde macros simplificando o processo de compara¸c˜aoe valida¸c˜ao dos mesmos. Por exemplo, para se modificar o modo de opera¸c˜aode kernel para User ´enecess´ariodesligar os bits ERL, EXL e introduzir a m´ascara correspondente nos bits KSU. Para tal basta correr o seguinte c´odigo: //Activar padrao0x10 no KSU Status = ( Status & zbit 3 ) | ( Status & bit 4 ) ;

//Desligar bits EXLe ERL Status = Status & zbit 2 & z b i t 1 ; Listing 4.6: Exemplo de mudan¸cade modo Kernel para modo User.

4.1.2 Endianness

Inicialmente na arquitectura MIPS, os processadores utilizavam apenas a ordena¸c˜aode bytes Little Endian. Mais tarde, passaram a possibilitar a escolha como ´efeita a inter- preta¸c˜aoda informa¸c˜aona mem´oria,nomeadamente, Little Endian ou Big Endian. Esta diferencia¸c˜ao´ede extrema importˆancia para o sistema pois influenciar´aa forma como o processador ir´aguardar e interpretar informa¸c˜aoproveniente da mem´oria. Alerta-se para o facto que, em sistemas com a mesma arquitectura, se o c´odigocompilado e a endianness configurada no processador n˜aocorresponderem, o sistema n˜aofuncionar´a.

Por defeito, ser´asempre utilizada a nota¸c˜ao Little Endian na referˆencia`ainforma¸c˜ao existente no simulador, uma vez que este suporta exclusivamente a ordena¸c˜ao Little Endian.

Na figura 4.2 pode-se ver a forma como o simulador representa a informa¸c˜aode 32 e 64 bits. Como se pode ver, os bytes est˜aoordenados utilizando a ordena¸c˜ao Little Endian, desta forma, todos os tipos de dados possuem o byte zero mais `adireita. De modo a haver uma maior compatibilidade com os sistemas alvo onde o simulador ir´a correr, s˜aosuportados os seguintes tipos de dados: DWORD, WORD, HWORD e BYTE. Sendo estes representados no ficheiro ”TypeDefs.h”, na linguagem C, por int64 t, int32 t, int16 t e int8 t respectivamente, como demonstra o bloco de c´odigoem 4.7.

Todos os tipos de dados das instru¸c˜oess˜aoextra´ıdose representados sem sinal (unsigned), sendo convertidos posteriormente para uma representa¸c˜aocom sinal (signed). 4.1. PROCESSADOR 43

 ' '' ! & % (      ' ! & %

  "#$& "#$ "#$' "#$ "#$ "#$ "#$ "#$%        !      ' ! & %

"#$ "#$ "#$ "#$% 

' ! & %

"#$ "#$% 

& %

&  '     % "#$% 

! 

Figura 4.2: Tipos de dados no SimuladorUE.

#i f n d e f TYPES #d e f i n e TYPES

/∗ Tipos de Dados ∗/ typedef i n t 6 4 t DWORD; typedef i n t 3 2 t WORD; typedef i n t 1 6 t HWORD; typedef i n t 8 t BYTE;

#e n d i f

Listing 4.7: Tipos de dados.

Segue-se um exemplo para cada tipo de ordena¸c˜aoe respectiva interpreta¸c˜aoutilizada pela arquitectura MIPS. 44 CAP´ITULO 4. MODULOS´

Little Endian

Nos casos em que a ordena¸c˜aoseja Little Endian, o primeiro byte ´eo byte mais `adireita na WORD, tamb´emconhecido por LSB (Least Significant Byte). Imagine-se o n´umero 0x12345678 guardado algures na mem´oria.A sua representa¸c˜aonuma arquitectura com ordena¸c˜aode bytes Little Endian encontra-se representada na figura 4.3.

C01)&DC (2$001)   3       456%89@AB6 

    (")001) !"#$!%&'

Figura 4.3: Little Endian.

Big Endian

Se o byte zero ´eo byte mais `aesquerda, tamb´emconhecido por MSB (Most Significant Byte), ent˜aoencontramo-nos a utilizar a ordena¸c˜aode bytes Big Endian. Imagine-se o mesmo caso da figura anterior, mas utilizando agora a ordena¸c˜aode bytes Big Endian, ficaremos com a representa¸c˜aoapresentada na figura 4.4.

C01)&DC (2$001)   3       456%89@AB6 

    (")001) !"#$!%&'

Figura 4.4: Big Endian. 4.1. PROCESSADOR 45

4.1.3 Interpreta¸c˜aode c´odigom´aquina

De forma a permitir que o processador consiga executar c´odigobin´ario, ´enecess´ario em primeiro lugar compreender o seu conte´udo. Para tal, ´enecess´ariointerpretar a informa¸c˜aoproveniente da mem´oria.Desta forma, o processador lˆeblocos de 32 bits da mem´oriae extrai os bits necess´ariospara entender qual a opera¸c˜aoque deve executar. Estes bits s˜aoconhecidos como opcode e encontram-se nos seis bits mais significativos da WORD lida da mem´oria.

E´ atrav´esde tabelas de codifica¸c˜aode instru¸c˜oesdefinidas pela arquitectura MIPS32, que ´eposs´ıvel identificar a instru¸c˜aoe os seus argumentos para que o processador consiga executar. Na arquitectura MIPS32 (ver.2), a interpreta¸c˜aopode ser feita de duas formas: directamente ou indirectamente. Se os seis bits mais significativos apontarem para uma instru¸c˜ao,como ´eo caso da instru¸c˜aoADDI, encontramo-nos no primeiro caso. Se os seis bits mais significativos apontarem para um subconjunto de instru¸c˜oes,como exemplo a instru¸c˜aoADD, ´enecess´arioextrair os seis bits menos significativos de forma a identificar a instru¸c˜ao.

Veja-se o exemplo da instru¸c˜aoADDI cuja codifica¸c˜ao´e:

Bits 31 .. 26 25 .. 21 20 .. 16 15 .. 0 Nomenclatura ADDI arg. 1 destino valor imediato Codifica¸c˜ao 001000 rs rt valor imediato

Tabela 4.1: Codifica¸c˜aopara a instru¸c˜aoADDI.

Como se pode ver no quadro acima, os seis bits mais significativos identificam a instru¸c˜ao ADDI directamente, sendo os dezasseis bits menos significativos utilizados para identi- ficar o valor imediato passado como terceiro argumento da instru¸c˜ao.Os restantes bits ser˜aoutilizados para identificar os registos gen´ericosno coprocessador central, segundo demonstra a tabela 4.13 na p´agina57.

Pegue-se agora como exemplo a instru¸c˜aoADD, cuja codifica¸c˜ao´e:

Bits 31 .. 26 25 .. 21 20 .. 16 15 .. 11 10 .. 6 5 .. 0 Nomenclatura SPECIAL arg. 1 arg. 2 destino - ADD Codifica¸c˜ao 000000 rs rt rd 00000 100000

Tabela 4.2: Codifica¸c˜aopara a instru¸c˜aoADD.

Em oposi¸c˜ao`ainstru¸c˜aoADDI, a instru¸c˜aoADD necessita de duas compara¸c˜oesat´eque o processador consiga identificar a instru¸c˜aoque ir´aexecutar. Assim, ´enecess´arioextrair 46 CAP´ITULO 4. MODULOS´ os seis bits mais significativos e em seguida utilizar os seis bits menos significativos na sub tabela de codifica¸c˜aopara encontrar a instru¸c˜ao. Existem no entanto codifica¸c˜oesque necessitam de mais compara¸c˜oesat´eque o processador consiga descodificar a instru¸c˜ao. Um exemplo disso s˜aoas instru¸c˜oesdo subconjunto COP0, nomeadamente as instru¸c˜oes: MFC0 e MTC0.

Pegue-se nas instru¸c˜oesMFC0 e TLBR, uma vez que ambas pertencem `asduas tabelas de codifica¸c˜aodo sub conjunto COP0.

Bits 31 .. 26 25 .. 21 20 .. 16 15 .. 11 10 .. 3 2 .. 0 Nomenclatura COP0 MF RG RCP0 - sel Codifica¸c˜ao 010000 00000 rt rd 00000000 -

Tabela 4.3: Codifica¸c˜aopara a instru¸c˜aoMFC0.

Bits 31 .. 26 25 24 .. 6 5 .. 0 Nomenclatura COP0 CO - TLBR Codifica¸c˜ao 010000 1 000 0000 0000 0000 0000 000001

Tabela 4.4: Codifica¸c˜aopara a instru¸c˜aoTLBR.

Nestes casos em particular, a primeira opera¸c˜aono processo de descodifica¸c˜ao´ea ex- trac¸c˜aodos seis bits mais significativos de forma a saber se os bits identificam uma instru¸c˜aoou um sub conjunto. Uma vez identificado o sub conjunto COP0, o passo seguinte ´eidentificar qual ser´aa tabela consultada para identifica¸c˜aoda instru¸c˜ao.

Para tal, ´eneces´ariointerpretar a informa¸c˜aoda ´areaRS da instru¸c˜ao,nomeadamente os bits 25 a 21. Na tabela 4.10 pode-se ver a codifica¸c˜aoutilizada para o campo RS. Em seguida, compara-se o bit 25 (CO) do campo RS e caso este seja um utiliza-se a segunda tabela de codifica¸c˜ao 4.11, no qual o processador utilizar´aos seis bits menos significativos para identificar a instru¸c˜aono sub conjunto, neste caso a instru¸c˜aoTLBR. Caso o bit 25 (CO) do campo RS seja zero, ent˜aoser´autilizada a primeira tabela de codifica¸c˜aodo sub conjunto COP0, no qual ser˜aocomparados os bits 25 a 21 para identificar a instru¸c˜ao como se pode ver na tabela 4.11.

Tabelas de Codifica¸c˜aode Opcodes

Em seguida ser˜aoapresentados os quadros com as codifica¸c˜oesdas instru¸c˜oese respec- tivos sub conjuntos, de acordo com a especifica¸c˜aoda arquitectura MIPS32 (ver. 2) segundo [MT10b]. 4.1. PROCESSADOR 47

OPCODE bits 28..26 0 1 2 3 4 5 6 7 bits 31..29 000 001 010 011 100 101 110 111 0 000 SPECIAL REGIMM J JAL BEQ BNE BLEZ BGTZ 1 001 ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI 2 010 COP0 COP1 COP2 COP1X BEQL BNEL BLEZL BGTZL 3 011 * * * * SPECIAL2 JALX * SPECIAL3 4 100 LB LH LWL LW LBU LHU LWR * 5 101 SB SH SWL SW * * SWR CACHE 6 110 LL LWC1 LWC2 PREF * LDC1 LDC2 * 7 111 SC SWC1 SWC2 * * SDC1 SDC2 *

Tabela 4.5: Tabela de codifica¸c˜aoOPCODE.

SPECIAL bits 2..0 0 1 2 3 4 5 6 7 bits 5..3 000 001 010 011 100 101 110 111 0 000 SLL MOVCI SRL SRA SLLV * SRLV SRAV 1 001 JR JALR MOVZ MOVN SYSCALL BREAK * SYNC 2 010 MFHI MTHI MFLO MTLO * * * * 3 011 MULT MULTU DIV DIVU * * * * 4 100 ADD ADDU SUB SUBU AND OR XOR NOR 5 101 * * SLT SLTU * * * * 6 110 TGE TGEU TLT TLTU TEQ * TNE * 7 111 * * * * * * * *

Tabela 4.6: Tabela de codifica¸c˜aoSPECIAL.

Todas as codifica¸c˜oesrepresentadas por (*) encontram-se reservadas para futuras imple- menta¸c˜oes. Note-se no entanto, que a codifica¸c˜aodo sub conjunto COP0 divide-se em duas tabelas, dependendo do estado do RS, nomeadamente uma para os bits 25 a 21 e outra tabela para os bits 5 a 0. 48 CAP´ITULO 4. MODULOS´

SPECIAL2 bits 2..0 0 1 2 3 4 5 6 7 bits 5..3 000 001 010 011 100 101 110 111 0 000 MADD MADDU MUL * MSUB MSUBU * * 1 001 * * * * * * * * 2 010 * * * * * * * * 3 011 * * * * * * * * 4 100 CLZ CLO * * * * * * 5 101 * * * * * * * * 6 110 * * * * * * * * 7 111 * * * * * * * SDBBP

Tabela 4.7: Tabela de codifica¸c˜aoSPECIAL2.

RGIMM bits 18..16 0 1 2 3 4 5 6 7 bits 20..19 000 001 010 011 100 101 110 111 0 00 BLTZ BGEZ BLTZL BGEZL * * * * 1 01 TGEI TGEIU TLTI TLTIU TEQI * TNEI * 2 10 BLTZAL BGEZAL BLTZALL BGEZALL * * * * 3 11 * * * * * * * SYNCI

Tabela 4.8: Tabela de codifica¸c˜aoRGIMM.

SPECIAL3 bits 2..0 0 1 2 3 4 5 6 7 bits 5..3 000 001 010 011 100 101 110 111 0 000 EXT * * * INS * * * 1 001 * * * * * * * * 2 010 * * * * * * * * 3 011 * * * * * * * * 4 100 BSHFL * * * * * * * 5 101 * * * * * * * * 6 110 * * * * * * * * 7 111 * * * RDHWR * * * *

Tabela 4.9: Tabela de codifica¸c˜aoSPECIAL3. 4.1. PROCESSADOR 49

COP0 (rs) bits 23..21 0 1 2 3 4 5 6 7 bits 25..24 000 001 010 011 100 101 110 111 0 00 MFC0 * * * MTC0 * * * 1 01 * * RDPGPR MFMC0 * * WRPGPR * 2 10 3 11 Campo CO

Tabela 4.10: Tabela de codifica¸c˜aoCOP0 (rs).

COP0 bits 2..0 0 1 2 3 4 5 6 7 bits 5..3 000 001 010 011 100 101 110 111 0 000 * TLBR TLBWI * * * TLBWR * 1 001 TLBP * * * * * * * 2 010 * * * * * * * * 3 011 ERET * * * * * * DERET 4 100 WAIT * * * * * * * 5 101 * * * * * * * * 6 110 * * * * * * * * 7 111 * * * * * * * *

Tabela 4.11: Tabela de codifica¸c˜aoCOP0. 50 CAP´ITULO 4. MODULOS´

Simula¸c˜aoem Software

O processo de interpreta¸c˜aode instru¸c˜oes,embora n˜aoaparente, ´ede suma importˆancia para o desempenho do simulador, uma vez que para todas as instru¸c˜oes´enecess´ario proceder `asua descodifica¸c˜ao,independentemente de a mesma j´ater sido executada anteriormente.

Inicialmente pensou-se na utiliza¸c˜aode um swich para comparar cada instru¸c˜aoem tempo de execu¸c˜ao,o que levou a um n´ıvel de performance terrivelmente baixo dado que ´enecess´arioefectuar muitas compara¸c˜oespara executar uma ´unicainstru¸c˜ao.Este modelo foi rapidamente substitu´ıdopor um novo, cujo principal objectivo ´etirar partido de apontadores de fun¸c˜oesna linguagem ANSI C. Com este novo formato, ´eposs´ıvel que ocorra apenas uma compara¸c˜aoem instru¸c˜oesdirectas e no m´aximotrˆescompara¸c˜oesem instru¸c˜oesque possuam at´etrˆesn´ıveis de codifica¸c˜ao,como acontece com as instru¸c˜oes do coprocessador zero MTC0, MFC0, TLBP, TLBR, TLBWI, TLBWR, WAIT, ERET ou DERET.

Para este modelo funcionar, ´enecess´arioque existam as tabelas de codifica¸c˜aoapresenta- das na sec¸c˜aoanterior. Segue-se um excerto da implementa¸c˜aoda tabelas de codifica¸c˜ao utilizando a linguagem ANSI C:

Fun¸c˜oespara conjunto opcode void SPECIAL(CPU 32 *cpu); void SPECIAL3(CPU 32 *cpu); void REGIMM(CPU 32 *cpu); void LB(CPU 32 *cpu); void J(CPU 32 *cpu); void LH(CPU 32 *cpu); void JAL(CPU 32 *cpu); void LWL (CPU 32 *cpu); void BEQ(CPU 32 *cpu); void LW(CPU 32 *cpu); void BNE(CPU 32 *cpu); void LBU(CPU 32 *cpu); void BLEZ(CPU 32 *cpu); void LHU(CPU 32 *cpu); void BGTZ(CPU 32 *cpu); void LWR(CPU 32 *cpu); void ADDI(CPU 32 *cpu); void SB(CPU 32 *cpu); void ADDIU(CPU 32 *cpu); void SH(CPU 32 *cpu); void SLTI(CPU 32 *cpu); void SWL(CPU 32 *cpu); void SLTIU(CPU 32 *cpu); void SW(CPU 32 *cpu); void ANDI(CPU 32 *cpu); void SWR(CPU 32 *cpu); void ORI(CPU 32 *cpu); void CACHE(CPU 32 *cpu); void XORI(CPU 32 *cpu); void LL(CPU 32 *cpu); void COP2(CPU 32 *cpu); void RESERVD(CPU 32 *cpu); void COP1X(CPU 32 *cpu); void LDC1(CPU 32 *cpu); void BEQL(CPU 32 *cpu); void LDC2(CPU 32 *cpu); void BNEL(CPU 32 *cpu); void SC(CPU 32 *cpu); 4.1. PROCESSADOR 51

void BLEZL(CPU 32 *cpu); void SWC1(CPU 32 *cpu); void BGTZL(CPU 32 *cpu); void SWC2(CPU 32 *cpu); void SPECIAL2(CPU 32 *cpu); void SDC1(CPU 32 *cpu); void JALX(CPU 32 *cpu); void SDC2(CPU 32 *cpu); void SPECIAL2(CPU 32 *cpu); void SDC1(CPU 32 *cpu); void JALX(CPU 32 *cpu); void SDC2(CPU 32 *cpu);

Tabela 4.12: Representa¸c˜aointerna das instru¸c˜oesdo conjunto opcode.

O primeiro passo consiste na declara¸c˜aode todas as fun¸c˜oesque representar˜aoas ins- tru¸c˜oesinternamente no motor de execu¸c˜ao.

O segundo passo consiste na cria¸c˜aode um array de apontadores para as fun¸c˜oescriadas definindo tamb´emo tipo de argumento passado, mormente a estrutura que guardar´aa informa¸c˜aorelativa ao processador. E´ importante referir que todas as fun¸c˜oesdevem utilizar o mesmo tipo de argumento. static void (∗ opcodes[64]) (CPU 32 ∗cpu ) = { SPECIAL, REGIMM, J , JAL, BEQ, BNE, BLEZ, BGTZ, ADDI, ADDIU, SLTI , SLTIU , ANDI, ORI , XORI, LUI , COP0, COP1, COP2, COP1X, BEQL, BNEL, BLEZL, BGTZL, RESERVD, RESERVD, RESERVD, RESERVD, SPECIAL2 , JALX, RESERVD, SPECIAL3 , LB, LH, LWL, LW, LBU, LHU, LWR, RESERVD, SB , SH, SWL, SW, RESERVD, RESERVD, SWR, CACHE, LL , LWC1, LWC2, PREF, RESERVD, LDC1, LDC2, RESERVD, SC, SWC1, SWC2, RESERVD, RESERVD, SDC1, SDC2, RESERVD } ; Listing 4.8: Mapeamento de fun¸c˜oesOPCODE em C.

Uma vez declaradas as fun¸c˜oese as tabelas de codifica¸c˜ao,o sistema j´ase encontra pronto para descodificar instru¸c˜oes.Assim, o processo de descodifica¸c˜ao´efeito atrav´es do seguinte c´odigo: instrucao = LoadMemory (cpu, sizeof (WORD) , cpu−>I n s t ) ; (∗ opcodes[ bit 3 1 26(instrucao) ])(cpu); Listing 4.9: Descodifica¸c˜aode instru¸c˜oesem C.

No bloco de c´odigoacima pode-se ver a forma como os apontadores para fun¸c˜oesfunci- onam. A fun¸c˜ao bit_31_26(instru¸c~ao) ´erespons´avel por extrair o valor dos bits 31 a 26 no formato unsigned, “shiftando” o seu resultado 26 bits para a direita, formando assim um valor inteiro com seis bits. Como se pode observar no quadro 4.5, a tabela dos opcodes possui 64 entradas que correspondem exactamente aos 26 bits. Este valor ser´a 52 CAP´ITULO 4. MODULOS´ utilizado em seguida como ´ındiceno array de apontadores opcode, de forma a criar uma instru¸c˜aoexecut´avel na linguagem C, formando assim um apontador para uma fun¸c˜ao concreta que pode ser executada como por exemplo ADD(cpu).

Nos casos em que seja necess´arioefectuar mais compara¸c˜oes,o processo ´emuito se- melhante. Os bits extra´ıdos ser˜aoescolhidos de acordo com as tabelas de resolu¸c˜ao utilizadas, nomeadamente: SPECIAL, SPECIAL2, REGIMM ou SPECIAL3.

4.1.4 Pipelines

A arquitectura MIPS foi concebida para tirar partido da t´ecnicade pipelining. Esta ´e implementada a n´ıvel de hardware de modo a que se consiga optimizar o throughput do processador. Actualmente, a arquitectura MIPS utiliza um pipeline de 5 andares, ou seja, todas as instru¸c˜oesest˜aodivididas em 5 fases. Com o pipeline consegue-se tirar maior partido das instru¸c˜oesuma vez que o processador em cada ciclo do rel´ogioexecuta 5 passos em 5 instru¸c˜oesdiferentes.

O objectivo do pipeline ´eque cada passo da instru¸c˜aodemore no m´aximo1 ciclo de rel´ogio do processador para que a cada ciclo do rel´ogiose possa iniciar uma nova instru¸c˜ao.O tempo de cada fase n˜ao´efixo podendo este variar. Para efeitos de melhor compreens˜ao ser˜aodemonstrados casos de uso do “4 staged pipeline” e do “5 staged pipeline”.

5-Staged Pipeline

O“5 staged pipeline” consiste em dividir cada instru¸c˜aoem 5 fases, sendo elas:

IF - Instruction Fetch Carregamento da pr´oximainstru¸c˜aoa ser executada.

RD - Read Registers Leitura do conte´udo dos registos do processador cujo os n´umeross˜aoapontados pelos campos da instru¸c˜ao.Tamb´emconhecido por descodifica¸c˜aoda instru¸c˜aoe verifica¸c˜aode dependˆencias.

ALU - Arithmetic Logic Unit Execu¸c˜aode opera¸c˜oesaritm´eticase l´ogicasem um ciclo de rel´ogio.As opera¸c˜oes de v´ırgulaflutuante necessitam de mais que um ciclo de rel´ogioe s˜aoexecutadas num coprocessador adicional (opcional). 4.1. PROCESSADOR 53

MEM - Memory Nesta fase, a instru¸c˜aopode ler e escrever vari´aveis na mem´oria. Chama-se a aten¸c˜aoque os acessos `amem´orias˜aoopera¸c˜oeslentas. Em m´edia,3 de 4 opera¸c˜oes n˜aofazem nada nesta fase, dado que a maior parte das opera¸c˜oess˜aoefectuadas sobre os registos gen´ericos,internos ou da cache.

WB - Write Back Esta fase serve para guardar os valores obtidos da opera¸c˜aofeita no registo de destino.

Em alguns livros o estado IF e o estado RD s˜aoconsiderados um s´ouma vez que estes ocupam menos de 1 ciclo de rel´ogio.

Tipos de Pipelining

Inicialmente o processador MIPS foi projectado para ser utilizado com pipelines de 5 estados. E´ de notar que a grande maioria dos CPUs mant´emeste formato, o que n˜aoimplica que n˜aoexista evolu¸c˜aonas t´ecnicasde pipelining. Veja-se a fam´ıliado processador 1074K como exemplo, que possui um pipeline supercalar de 15 estados! E´ uma diferen¸caabismal de desempenho. Em seguida demonstraremos 4 categorias de pipelining existentes onde se integram uma grande variedade de processadores, onde ´e poss´ıvel que varie o n´umerode estados do pipeline.

Pipeline de instru¸c˜ao´unicacom profundidade 1 Como se pode ver no pi- peline exemplificado na figura 4.5, o desempenho n˜ao´e´optimouma vez que cada instru¸c˜aonecessita de 5 ciclos do rel´ogio.O Fetch da nova instru¸c˜ao´efeito quando a ´ultimainstru¸c˜aoacabar de executar.

Pipeline paralelo Na figura 4.6 temos um pipeline com profundidade 5, no qual se consegue obter um throughtput 5 vezes superior ao pipeline da figura 4.5. Em cada ciclo do rel´ogio´eposs´ıvel executar 5 estados diferentes.

Super pipeline Existem outros tipos de pipelines, pensados para melhorar ainda mais o desempenho da m´aquina. O super pipeline consegue executar duas fases em um ciclo de rel´ogiocomo se pode ver na figura 4.7.

Superscalar ou Pipeline com Profundidade N Pode-se sempre ir um pouco mais al´empara aumentar o desempenho como mostra a figura 4.8, no qual se tˆem um pipeline de 5 fases com 4 vias. Isto ´e,em cada ciclo o processador pode executar at´e4 instru¸c˜oesem simultˆaneo.Assim, o desempenho aumenta drasticamente, mas aumenta igualmente a probabilidade de dependˆencias e de “stalls” no pipeline. 54 CAP´ITULO 4. MODULOS´

Figura 4.5: Pipeline de instru¸c˜ao´unicacom profundidade 1.

Figura 4.6: Pipeline paralelo com profundidade 5. 4.1. PROCESSADOR 55

   ' (         

  #$  %&% !"

  #$ %&%  !"

  #$ %&%  !"

'  #$ %&%  !"

(  #$  %&%  !"

)  #$ %&%   !"

Figura 4.7: Super pipeline com profundidade 5.

         &' !"# ()( $%    &' !"# ()( $%    &' !"# ()( $%    &' !"# ()( $%    &' !"# ()( $%    &' !"# ()( $%  0  &' !"# ()( $%  1  &' !"# ()( $%

Figura 4.8: Pipeline Superescalar. 56 CAP´ITULO 4. MODULOS´

Simula¸c˜aoem Software

Uma vez que o pipelining ´euma t´ecnicade hardware concebida para acelerar a velocidade de execu¸c˜aode instru¸c˜oes,no contexto de simula¸c˜ao,a sua utiliza¸c˜ao´etransparente.

O simulador cont´emuma representa¸c˜aoda informa¸c˜ao,que ser´aposteriormente conver- tida e optimizada para c´odigoobjecto da arquitectura da m´aquinaanfitri˜ao,que por sua vez utilizar´at´ecnicasde acelera¸c˜aoem hardware. Devido a isso, a divis˜aodas instru¸c˜oes em software, n˜aomelhora o desempenho de execu¸c˜aodo simulador.

Um dos aspectos a ter em considera¸c˜aorelativamente ao pipelining, em ambiente de simula¸c˜ao,s˜aoos hazards gerados quando s˜aoexecutadas instru¸c˜oesde salto ou branches, criando assim um estado especial do funcionamento do processador.

A este estado d´a-seo nome de “Delay Slot”, que ocorre exactamente ap´osa execu¸c˜ao de uma instru¸c˜aode salto, obrigando o processador a executar a instru¸c˜aoseguinte ao salto primeiro que a instru¸c˜aopara onde o salto deveria mudar a execu¸c˜ao.Observe-se o seguinte exemplo:

.text main : .... j l a b e l 1 addi $t0 , $t0 , 1 ....

l a b e l 1 : add $t0, $t1, $t0 .... Listing 4.10: Demonstra¸c˜aodo comportamento do Delay Branch.

Segundo o exemplo acima, para a arquitectura MIPS de 32 bits, quando a instru¸c˜ao“j label1” estiver no segundo estado, Read Registers (RD), a instru¸c˜aoseguinte estar´ano primeiro estado, Instruction Fetch (IF).

Assim, a instru¸c˜ao addi $t0, $t0, 1 ser´aexecutada antes da instru¸c˜ao add $t0, $t1, $t0 uma vez que o processador n˜aotem uma pol´ıticade remover instru¸c˜oesque j´atenham feito “fetch”. No terceiro estado da instru¸c˜ao j label1 o Program Counter (PC) ´ealterado para o endere¸coda label “label1” onde a execu¸c˜aocontinuar´a.

E´ bastante comum os geradores de c´odigode linguagens de m´edio/alton´ıvel fazerem optimiza¸c˜oesno c´odigoou apenas introduzirem a instru¸c˜ao nop, cuja fun¸c˜ao´eocupar um 4.1. PROCESSADOR 57 ciclo de rel´ogiono processador, depois de um salto, seja ele condicional ou incondicional, de forma a ultrapassar o problema do “Delay Slot”.

4.1.5 Coprocessadores

Os processadores MIPS possuem internamente quatro n´ucleosde execu¸c˜aoconhecidos como coprocessadores. Deste conjunto, apenas o coprocessador zero, apelidado de co- processador central, ´eobrigat´oriopara o funcionamento do processador, embora o co- processador um seja necess´ariopara opera¸c˜oesde v´ırgulaflutuante.

Os dois ´ultimoscoprocessadores s˜aoopcionais, sendo o terceiro livre para implementa¸c˜oes espec´ıficasdo processador e o quarto tamb´emdedicado para opera¸c˜oesde v´ırgulaflutu- ante.

4.1.6 Registos Gen´ericos

Todos os coprocessadores possuem um conjunto de registos gen´ericose um conjunto de registos de controlo. Desta forma, o coprocessador central possui internamente 32 registos de 32 bits para utiliza¸c˜aogen´erica. Os programadores possuem ao seu dispor um sub conjunto destes registos para tratadores do Kernel do sistema operativo, como exemplo os registos $k0, $k1 ou $at, que ´ereservado para o assembler em opera¸c˜oesde c´alculode endere¸cos.Na tabela 4.13 encontra-se o conjunto de registos gen´ericose uma breve discri¸c˜ao.

Nome do Registo N´umerodo Registo Descri¸c˜ao $0 (zero) 0 Valor sempre zero $at 1 Reservado ao Assembler $v0, $v1 2,3 Valores de retorno ou resultados $a0 . . . $a3 4 . . . 7 Argumentos de fun¸c˜oes $t0 . . . $t7 8 . . . 15 Tempor´arios $s0 . . . $s7 16 . . . 23 Tempor´ariossalvaguardados $t8, $t9 24 e 25 Tempor´ariosque podem ser salvaguardados $k0 e $k1 26 e 27 Reservado ao Kernel $gp 28 Global Pointer $sp 29 Stack Pointer $fp ou $s8 30 Frame Pointer $ra 31 Return Address

Tabela 4.13: Tabela com registos gen´ericosdo coprocessador zero. 58 CAP´ITULO 4. MODULOS´

Al´emdos 32 registos gen´ericoso coprocessador zero possui mais 3 registos especiais, respectivamente: Program Counter (PC), HI e LO.

O registo PC aponta para a pr´oximainstru¸c˜aoa ser executada e n˜aopermite acesso directo por parte do programador. A ´unicaforma de modificar o seu valor ´ea atrav´es de instru¸c˜oesde salto definidas na ISA. Os registos HI e LO s˜aoutilizados sempre que ´e executada uma instru¸c˜aode divis˜aoou multiplica¸c˜ao.Na multiplica¸c˜aoentre um n´umero de 32 bits com outro n´umero de 32 bits, para valores grandes, obt´em-seno m´aximoum valor de 64 bits, sendo o resultado dividido em dois registos. Caso o resultado seja inferior ao maior n´umerode 32 bits, este ´eguardado no registo LO, caso contr´arioser´a dividido pelos dois registos. Na divis˜ao,o quociente ´eguardado no registo LO e o resto da divis˜aoguardado no registo HI.

Da mesma forma, o coprocessador um possui 32 registos de 32 bits para executar as suas opera¸c˜oesinternas. Para implementa¸c˜oesde 32 bits os registos s˜aoutilizados em pares, dois a dois. Um registo ´eutilizado para guardar a parte inteira (32 bits) e o registo seguinte para guardar a parte decimal (32 bits)6.

Simula¸c˜aoem Software

Os registos gen´ericosencontram-se implementados dentro da estrutura que representa o processador ou coprocessador central. A sua representa¸c˜ao´ebastante simples uma vez que estes s˜aocompostos por words de 32 bits. Assim optou-se pela cria¸c˜aode um array de words, guardando em cada ´ındice,de acordo com o quadro 4.13, a informa¸c˜aocorrespondente ao registo. Segue-se a estrutura que representa os registos gen´ericos:

#d e f i n e CP0 Registos 32 CP0R[ CP0 Registos ] ; Listing 4.11: Defini¸c˜aodos registos gen´ericosna estrutura do processador em C.

O acesso a cada registo ´efeito sempre atrav´esdo seu n´umero,utilizado como ´ındiceno array de registos. A raz˜aopela qual os n´umeros dos registos s˜aoutilizados como ´ındice deve-se ao facto de, no processo de interpreta¸c˜aodas instru¸c˜oes,os bits extra´ıdospara identifica¸c˜aodos registos gen´ericos,conhecidos como “rs”, “rd” ou “rt”, possuem sempre 5 bits (25 = 32 bits).

6O formato dos registos gen´ericosdo coprocessador um pode variar com o tipo de implementa¸c˜ao. 4.1. PROCESSADOR 59

4.1.7 Registos do Coprocessador Central

Al´emdos registos gen´ericos,os coprocessadores possuem internamente um conjunto de registos internos utilizados para descrever e manter configura¸c˜oes,estados dos coproces- sadores, assim como: servir de interface entre os mesmos, gerir mecanismos de excep¸c˜oes, gest˜aoda comunica¸c˜aocom perif´ericosatrav´esdos mecanismos de interrup¸c˜oes,entre outros.

Do conjunto de registos internos existentes na arquitectura MIPS32, apenas um subcon- junto det´emobrigatoriedade de implementa¸c˜ao,podendo variar conforme as funcionali- dades e mecanismos implementados no processador.

Ao contr´ariodo que acontece com os registos gen´ericosque possuem um tamanho fixo de 32 bits, os registos internos podem variar o tamanho, sempre em incrementos de 32 bits. Assim os registos internos disp˜oemde uma vari´avel Select que identifica qual o sub registo apontado pelo registo do coprocessador zero. Desta forma, todos os registos internos s˜aocompostos pelo n´umeroe o SEL.

Segue-se a lista dos registos do coprocessador zero cuja obrigatoriedade de implementa¸c˜ao deve ser respeitada.

Registo No Select Registo N´ıvel de conformidade Estado 0 0 Index Obrigat´oriopara TLB MMU Implementado 1 0 Random Obrigat´oriopara TLB MMU Implementado 2 0 EntryLo0 Obrigat´oriopara TLB MMU Implementado 3 0 EntryLo1 Obrigat´oriopara TLB MMU Implementado 4 0 Context Obrigat´oriopara TLB MMU Implementado 4 1 ContextConfig Obrigat´oriopara TLB MMU N˜aoutilizado 4 2 UserLocal Recomendado para Ver. 2 Implementado 5 0 Pagemask Obrigat´oriopara TLB MMU Implementado 5 1 PageGrain Opcional para Ver. 2 N˜aoutilizado 6 0 Wired Obrigat´oriopara TLB MMU Implementado 7 0 HWREna Obrigat´oriopara Ver. 2 Implementado 8 0 BadVAddr Obrigat´orio Implementado 9 0 Count Obrigat´orio Implementado 10 0 EntryHi Obrigat´oriopara TLB MMU Implementado 11 0 Compare Obrigat´orio Implementado 12 0 Status Obrigat´orio Implementado 12 1 IntCtl Obrigat´oriopara Ver. 2 N˜aoutilizado 12 2 SRSCtl Obrigat´oriopara Ver. 2 N˜aoutilizado 60 CAP´ITULO 4. MODULOS´

Registo No Select Registo N´ıvel de conformidade Estado 12 3 SRSMap Obrigat´oriopara Ver. 2 (SSI) N˜aoutilizado 13 0 Cause Obrigat´orio Implementado 14 0 EPC Obrigat´orio Implementado 15 0 PRId Obrigat´orio N˜aoutilizado 15 1 EBase Obrigat´oriopara Ver. 2 Implementado 16 0 Config Obrigat´orio Implementado 16 1 Config1 Obrigat´orio Implementado 16 2 Config2 Obrigat´orio Implementado 25 0 PerfCnt Recomendado N˜aoutilizado 30 0 ErrorEPC Obrigat´orio Implementado

Tabela 4.14: Tabela com registos internos do coprocessador zero.

NOTA: Todos os registos encontram-se implementados e a funcionar correctamente. Os registos com o estado ’N˜aoutilizado’ encontram-se igualmente implementados, apenas n˜aos˜aoutilizados uma vez que os mecanismos associados n˜aose encontram a funcionar correctamente.

Segue-se a descri¸c˜aodos registos do coprocessador zero necess´ariosa para implementa¸c˜ao da arquitectura MIPS32 revis˜ao2.

CP0 Registo 4, Select 2 (UserLocal)

O UserLocal ´eum registo que n˜ao´einterpretado pelo hardware, dispondo de permiss˜oes de leitura e escrita por software. Atrav´esdeste registo ´eposs´ıvel que software privilegiado passe informa¸c˜aopara software n˜aoprivilegiado atrav´esda instru¸c˜aoRDHWR. Para tal ser poss´ıvel, ´enecess´arioque o bit 29 do registo HWREna se encontre activo.

31 0 Informa¸c˜aode utilizador

Tabela 4.15: Registo interno UserLocal.

CP0 Registo 7, Select 0 (HWREna)

O registo HWREna cont´emuma m´ascaraque indica quais os registos internos que podem ser lidos atrav´esda instru¸c˜aoRDHWR pelo registo UserLocal, sempre que o coproces- sador zero n˜aose encontre acess´ıvel. 4.1. PROCESSADOR 61

A m´ascarade bits guarda no registo informa¸c˜aode acesso referente aos seguintes conte´udos: CPUNum do registo EBase, SYNCI Step relativa `a Cache, contador do ciclo do rel´ogio do registo Count, CCRes para n´umerode ciclos utilizados entre cada actualiza¸c˜aodo registo Count, ULR para acesso ao registo UserLocal.

31 30 29 0 Implementado? M´ascarade bits

Tabela 4.16: Registo interno HWREna.

CP0 Registo 8, Select 0 (BadVAddr)

O registo BadVAddr possui car´acterobrigat´orioe ´eutilizado para guardar o endere¸co virtual da ´ultimainstru¸c˜aogeradora de uma excep¸c˜aodo tipo: Address error (AdEL ou AdES), TLB Refill, TLB Invalid (TLBL ou TLBS) ou TLB Modified.

Sempre que ocorre uma das excep¸c˜oesacima indicadas, o processador ´erespons´avel por actualizar o valor do registo BadVAddr.

31 0 Endere¸covirtual que gerou a excep¸c˜ao(BadVAddr)

Tabela 4.17: Registo interno BadVAddr.

CP0 Registo 9, Select 0 (Count)

O registo Count actua como um rel´ogiointerno, que incrementa o seu valor de forma constante, sendo o seu funcionamento dependente da implementa¸c˜aodo processador. Este registo permite a leitura e escrita por software, sendo a segunda utilizada para efeitos de diagn´ostico,reinicializa¸c˜aoou sincroniza¸c˜aode processadores. O mecanismo de pipeline no processador utiliza o registo Count como rel´ogiopara sincroniza¸c˜aodas instru¸c˜oes.

31 0 Count

Tabela 4.18: Registo interno Count. 62 CAP´ITULO 4. MODULOS´

CP0 Registo 11, Select 0 (Compare)

O registo Compare ´eutilizado em conjunto com o registo Count de forma a criar um rel´ogioe uma interrup¸c˜aopara esse mesmo rel´ogio. Desta forma, o registo Compare mant´emum valor que assim que for igual ao valor do registo Count o processador gerar´a um pedido de interrup¸c˜ao.

Na revis˜ao1 o pedido de interrup¸c˜aodo rel´ogioseria gerido em conjunto com a inter- rup¸c˜aode hardware 5, nos bits CauseIP. Na revis˜ao2 isto j´an˜aoacontece sendo o pedido de interrup¸c˜aovisto no bit CauseTI.

31 0 Compare

Tabela 4.19: Registo interno Compare.

CP0 Registo 12, Select 0 (Status)

O Status ´eum registo obrigat´oriocom permiss˜oes de leitura e escrita, tanto por hardware como por software, que guarda o modo de opera¸c˜ao,assim como estados internos no processador ou tratamento de interrup¸c˜oes.

A sua composi¸c˜aoencontra-se dividida em v´ariosblocos, como podemos ver no quadro abaixo, sendo que cada bit ou conjunto de bits representa uma funcionalidade ou estado do processador.

31 28 27 26 25 24 23 22 21 20 19 18 17 16 15 10 9 8 7 6 5 4 3 2 1 0 CU3..0 RP FR RE MX 0 BEV TS SR NMI ASE Impl IM7..2 IM1..0 0 KSU ERL EXL IE

Tabela 4.20: Registo interno Status.

Os 4 bits mais significativos s˜aoCU3..0 (Coprocessor Usable) e servem para identificar se os coprocessadores se encontram acess´ıveis ou n˜ao.Por defeito, independentemente do bit CU0, o coprocessador zero encontra-se sempre acess´ıvel se o processador se encontrar a correr em modo Kernel ou modo Debug.

O bit RP representa a funcionalidade Reduced Power e ´eopcional, sendo a sua imple- menta¸c˜aoem hardware dependente do processador. O bit FR (Floating point register) tem car´acterobrigat´orioe ´eutilizado para identificar, caso o processador implemente FPU, o tamanho dos registos internos do coprocessador um. Caso o bit se encontre activo os registos tem tamanho 64bits, caso contr´arioos registos s˜aoguardados em pa- res de 32 bits. Nos casos em que o processador n˜aoimplemente FPU este bit deve ser 4.1. PROCESSADOR 63 ignorado.

O bit RE (Reverse Endianness) ´eutilizado para activar/desactivar a funcionalidade de interpreta¸c˜aodos dados na mem´oria.Esta funcionalidade ´eapenas v´alidapara o modo de User, o restantes modos de execu¸c˜aoignoram este bit.

O bit seguinte, MX ´eopcional e ´eutilizado para activar as funcionalidades de MDMX e DSP em processadores que implementem ASE.

O bit BEV (Bootstrap Exception Vector) ´eutilizado para modificar os vectores dos pontos de entrada das excep¸c˜oesquando o sistema se encontra na sua inicializa¸c˜ao.O seu estado inicial ´esempre 1 sendo que, ap´osa inicializa¸c˜aodo sistema, o bit se mant´em sempre a 0.

O bit TS ´eutilizado pela TLB sempre que ocorrem m´ultiplasocorrˆenciasna tabela de mapeamentos. De forma a evitar que o hardware fique danificado, a TLB activa este bit gerando em seguida a excep¸c˜ao Machine Check para corrigir o erro. A correc¸c˜aodo erro pode ser feita por software ou hardware sendo a mesma dependente da implementa¸c˜ao do processador. Caso a correc¸c˜aoseja feita por software o bit TS deve ser limpo antes de se retomar a execu¸c˜ao.Alerta-se para o facto que o processador ter´aum funcionamento indefinido caso o bit seja modificado de 0 para 1 por software.

O bit SR indica se o processador se encontra em Soft Reset (activo) ou Non Maskable Interrupt (NMI) (desligado) quando entra no vector de excep¸c˜ao Reset, Soft Reset, NMI, 0xBFC0.0000. Da mesma forma, o bit NMI indica se o processador se encontra em NMI (activo) ou Not NMI (desligado). Em ambos os casos, os bits s˜aoactivados por hardware e n˜aodevem ser modificados por software sob pena de funcionamento imprevis´ıvel.

O bit ASE ´ereservado para o MCU ASE, sendo ignorado caso a funcionalidade n˜aose encontre implementada. Os bits 17 e 16 do registo Status s˜aoreservados para imple- menta¸c˜oesespecificas do processador, sendo ignorados caso n˜aosejam utilizados.

Os bits 15 at´e10 (IM7 at´eIM2) s˜aoutilizados para controlar as interrup¸c˜oespor hardware sendo que, caso o bit se encontre activo, os pedidos de interrup¸c˜aoencontram-se activos, caso contr´arioencontram-se desligados. Este funcionamento apenas ´ev´alidocaso o EIC (External Interrupt Controller) se encontre desligado. Nos casos em que EIC se encontre activo, estes bits s˜aointerpretados de forma diferente, sendo considerados uma IPL (Interrupt Priority List). Para informa¸c˜oesdetalhadas sobre o funcionamento do mecanismo de interrup¸c˜oesver [MT10c]. Os bits IM1 e IM0 s˜aoutilizados para controlar as interrup¸c˜oespor software sendo o seu valor ignorado caso o EIC se encontre activo.

Os bits KSU s˜aoutilizados para identificar o modo base de opera¸c˜aodo processador, sendo os seus valores: 0b00 para modo Kernel, 0b01 para modo Super User, 0b10 para 64 CAP´ITULO 4. MODULOS´ modoUser e 0b11 para modo Debug. Para mais informa¸c˜oessobre os modos de opera¸c˜ao, ver sec¸c˜ao 4.1.1.

O bit ERL (Error Level) identifica o estado de erro no processador, sendo o mesmo activado sempre que ocorra um excep¸c˜aodo tipo Reset, Soft Reset, NMI ou Cache error. Quando este bit se encontra activo, o processador encontra-se a correr em modo Kernel, as interrup¸c˜oess˜aodesligadas e a instru¸c˜aoERET utiliza o registo ErrorEPC em vez do registo EPC para retomar a execu¸c˜aodo c´odigobin´ario.

O bit EXL (Exception Level) ´eactivado sempre que ´egerada uma excep¸c˜aodiferente de Reset, Soft Reset, NMI ou Cache error. Nestas situa¸c˜oes,o processador encontra-se a correr em modo Kernel, as interrup¸c˜oesencontram-se desligadas e os registos EPC, CauseBD e SRSCtl n˜aos˜aoactualizados. Nos casos em que ocorra uma excep¸c˜aoe o bit j´ase encontre activo, o vector da excep¸c˜ao da TLB Refill ´emodificado para o vector TLB Refill, General Exception.

Por ´ultimotemos o bit IE (Interrupt Enabled) que funciona como um interruptor princi- pal, que permite ligar e desligar todas as interrup¸c˜oesno sistema. Na revis˜ao2 surgiram duas novas instru¸c˜oesDI (Disable Interrupts) e EI (Enable Interrupts), que permitem a modifica¸c˜aodeste bit para uso dos programadores.

CP0 Registo 13, Select 0 (Cause)

O registo Cause identifica e descrimina a excep¸c˜aomais recente que ocorreu no processa- dor. E´ atrav´esdeste registo que o sistema operativo consegue identificar qual a excep¸c˜ao gerada, os seus atributos e a causa da sua ocorrˆencia.

Na figura seguinte podemos ver a divis˜aodos bits do registo Cause.

31 30 29 28 27 26 25 24 23 22 21 20 18 17 16 15 10 9 8 7 6 2 1 0 DB TI CE DC PCI ASE IV WP FDCI 000 ASE IP9..2 IP1..0 0 ExcCode 0

Tabela 4.21: Registo interno Cause.

O bit BD (Delay Branch) indica se a ´ultimaexcep¸c˜aoque ocorreu se encontrava a ser executada em modo normal ou Delay Branch.

O bit TI (Timer Interrupt) ´eutilizado pela arquitectura MIPS revis˜ao2 para validar se existem pedidos de interrup¸c˜aodo rel´ogiopor atender.

Os bits CE (Coprocessor Enabled) guarda o valor do coprocessador que gerou a excep¸c˜ao Coprocessor Unusable. 4.1. PROCESSADOR 65

O bit DC ´eutilizado para ligar/desligar o mecanismo utilizado pelo registo Count, uma vez que a dissipa¸c˜aode energia ´enot´avel em aplica¸c˜oessens´ıveis ao consumo de energia. O bit PCI ´eutilizado para activar/desligar a interrup¸c˜aogerada pelo registo Performance Counter.

O bit IV (Interrupt Vector) define qual o vector de excep¸c˜oesusado pelo mecanismo de interrup¸c˜oes,0x180 caso desligado, 0x200 caso se encontre activo.

Os bits IP7..2 (Interrupt Pending) indicam se existe alguma interrup¸c˜aode hardware pendente. O mesmo acontece com os bits IP1..0 que identificam se existem pedidos de interrup¸c˜aopendentes por software. Assim como acontece com o registo Status, se o EIC se encontrar implementado e activo, os bits CauseIP s˜aointerpretados de forma diferente.

Os bits ExcCode guardam o c´odigoidentificativo da ´ultimaexcep¸c˜aoque ocorreu no processador. No quadro seguinte podemos a codifica¸c˜aodas excep¸c˜oesexistentes na arquitectura MIPS32 Revis˜ao2.

Decimal Hexadecimal C´odigo Descri¸c˜ao 0 0x00 Int Interrupt 1 0x01 Mod Excep¸c˜ao TLB Modified 2 0x02 TLBL Excep¸c˜ao TLB Load 3 0x03 TLBS Excep¸c˜ao TLB Store 4 0x04 AdEL Excep¸c˜ao Address Error on Load 5 0x05 AdES Excep¸c˜ao Address Error on Store 6 0x06 IBE Bus error exception on instruction fetch 7 0x07 DBE Bus error exception on load or store 8 0x08 Sys Excep¸c˜ao Syscall 9 0x09 Bp Excep¸c˜ao Break Point 10 0x0A RI Excep¸c˜ao Reserved Instruction 11 0x0B CpU Excep¸c˜ao Coprocessor Unsusable 12 0x0C Ov Excep¸c˜ao Arithmetic Overflow 13 0x0D Tr Excep¸c˜ao Trap 14 0x0E - Reservado 15 0x0F FPE Excep¸c˜ao Floating Point 16 0x10 - Reservado 17 0x11 - Reservado 18 0x12 C2E Excep¸c˜aoreservada para o Coprocessador 2 19 0x13 TLBRI Excep¸c˜ao TLB Read-Inhibit 20 0x14 TLBXI Excep¸c˜ao TLB Execution-Inhibit 21 0x15 - Reservado 66 CAP´ITULO 4. MODULOS´

Decimal Hexadecimal C´odigo Descri¸c˜ao 24 0x18 MCheck Excep¸c˜ao Machine Check 25 0x19 Thread Excep¸c˜oesreservadas para MIPS MT ASE 26 0x1A DSPDis Excep¸c˜ao DSP ASE State Disabled 27 0x1B - Reservado 28 0x1C - Reservado 29 0x1D - Reservado 30 0x1E CacheErr Excep¸c˜oesde Cache error 31 0x1F - Reservado

Tabela 4.22: Tabela de c´odigospor execp˜aopara a arquitectura MIPS32.

CP0 Registo 14, Select 0 (EPC)

O Exception Program Counter (EPC) ´eum registo com permiss˜oesde leitura e escrita que o processador utilizar´a,ap´oso tratamento de todas as excep¸c˜oes,para retomar a sua execu¸c˜ao.

Nos casos em que o valor do StatusEXL se encontre a 1 e surja uma excep¸c˜ao,o processa- dor n˜aomodificar´ao valor do EPC, dado que se encontra a executar c´odigodo tratador de uma excep¸c˜aoe ser´autilizado o vector geral de excep¸c˜oes.Nestes casos, o EPC ser´a igual em ambas as excep¸c˜oesdado que ap´oso seu tratamento, a instru¸c˜aogeradora da excep¸c˜aoser´aexecutada novamente e o c´odigodo tratador ser´aigualmente executado, agora com a correc¸c˜aoda segunda excep¸c˜ao.

Alerta-se para o facto de as interrup¸c˜oespor hardware e software serem desligadas assim que o bit StatusEXL ´eactivado, n˜aopermitindo a modifica¸c˜aodo EPC por parte das interrup¸c˜oes.

Para excep¸c˜oesdo tipo s´ıncronasou precisas, o valor do EPC pode variar conforme o valor do bit CauseBD. Se este bit se encontrar desligado o valor do EPC aponta para o endere¸coda instru¸c˜aogeradora da excep¸c˜ao;caso contr´arioeste apontar´apara o endere¸co da instru¸c˜aoanterior `ainstru¸c˜aoque se encontra no Branch Delay.

Em excep¸c˜oesass´ıncronas,caso das interrup¸c˜oes,o registo EPC cont´emo endere¸coda instru¸c˜aopara onde o processador dever´aretomar a sua execu¸c˜ao.

31 0 EPC

Tabela 4.23: Registo interno EPC. 4.1. PROCESSADOR 67

CP0 Registo 15, Select 0 (PRId)

O registo PRId (Processor Identification) ´eum registo apenas de leitura, escrito por hardware, com informa¸c˜aorelativa `aidentifica¸c˜aoe n´ıvel de revis˜aodo processador.

Para informa¸c˜aodetalhada sobre os modelos dispon´ıveis, fabricante ou revis˜ao,ver [MT10c].

31 24 23 16 15 8 7 0 Op¸c˜oesda empresa ID da empresa ID do processador Revis˜ao

Tabela 4.24: Registo interno PRId.

CP0 Registo 15, Select 1 (EBase)

O EBase ´eum registo que surgiu na implementa¸c˜oesda revis˜ao2 da arquitectura MIPS32 com car´acterobrigat´orio.Este guarda a base utilizada no c´alculodo endere¸code entrada dos tratamentos das excep¸c˜oes.Nos casos em que o bit StatusBEV se encontre activo, inicializa¸c˜aodo processador, o registo EBase cont´emos bits mais significativos com o valor 0xBFC0.xxxx de forma a manter os endere¸cosbase gerados na zona alta do segmento KSEG1, podendo os valores para xxxx variar em fun¸c˜aodo tipo de excep¸c˜ao.

Nos casos em que o bit StatusBEV se encontre desligado, o endere¸cobase ´ecalculado uti- lizando os bits 31 e 30, sempre com o valor 0b10, for¸cando o endere¸cogerado ao dom´ınio do KSEG0 (0x8000.0000), mantendo assim compatibilidade com vers˜oesanteriores da arquitectura MIPS32. Sempre que ocorra uma excep¸c˜aodo tipo cache error o bit 29 ´e obrigatoriamente 1 for¸candoo seu valor ao dom´ıniodo KSEG1 (0xA000.0000), segmento n˜aomapeado e sem utiliza¸c˜aode cache. Para os restantes casos, o EBase possui o valor 0b10 || 0x000, gerando o endere¸co0x8000.0000. Se o registo EBase for modificado com o StatusBEV desligado, o processador ter´aum funcionamento indefinido uma vez que, por defeito e em ambientes com um ´unicoprocessador, os bits EBase 29...12 encontram-se a zero.

Os 10 bits menos significativos s˜aoutilizados para identificar o processador em execu¸c˜ao em ambientes com multiprocessadores. Nestes casos, o valor dos bits EBase 29...12 pode variar, permitindo a existˆenciade vectores de excep¸c˜oesdistintos para os v´ariosproces- sadores presentes. 68 CAP´ITULO 4. MODULOS´

31 30 29 12 11 10 9 0 1 0 Base da Excep¸c˜ao 0 0 N´umerodo CPU

Tabela 4.25: Registo interno EBase.

CP0 Registo 16, Select 0 (Config)

O registo Config possui um conjunto de configura¸c˜oesrelativas `asfuncionalidades e mecanismos implementados no processador. A grande maioria dos bits s˜aocarregados por hardware no arranque no processador sendo os restantes configur´aveis atrav´esda excep¸c˜ao Reset.

31 30 28 27 25 24 16 15 14 13 12 10 9 7 6 4 3 2 0 M K23 KU Impl BE AT AR MT 0 VI K0

Tabela 4.26: Registo interno Config.

Segue-se a lista de parˆametrosconfigur´aveis no processador para o registo Config0 :

Atributo Fun¸c˜ao M Indica se o registo Config1 se encontra implementado e configurado. K23 Dedicado para MMU’s com mapeamentos fixos como o FMT. KU Atributos de cache para MMU com mapeamentos fixos. Impl Reservado para implementa¸c˜oesdo processador. BE Big Endian (1) ou Little Endian (0) AT Tipo de arquitectura: MIPS32, MIPS64 com e sem restri¸c˜oesde acesso `amem´oria. AR N´ıvel de revis˜aoda arquitectura. MT Tipo de MMU: TLB, BAT, FMT ou Dual VTLB e FTLB. VI Cache de instru¸c˜oesvirtuais. K0 Atributos de cache para segmento KSEG0.

Tabela 4.27: Tabela de atributos do registo Config0.

CP0 Registo 16, Select 1 (Config1)

O registo Config1 funciona em conjunto com o registo Config0 com a diferen¸caque todos os seus campos s˜aoescritos por hardware, sendo de leitura exclusiva para software. 4.1. PROCESSADOR 69

31 30 25 24 22 21 19 18 16 15 13 12 10 9 7 6 5 4 3 2 1 0 M MMU Size-1 IS IL IA DS DL DA C2 MD PC WR CA EP FP

Tabela 4.28: Registo interno Config1.

Segue-se a lista de parˆametrosexistentes no registo Config1 :

Atributo Fun¸c˜ao M Indica se o registo Config2 se encontra implementado e configurado. MMU Size-1 N´umerode entradas na TLB -1. IS Configura¸c˜oes de cache IL Configura¸c˜oes de cache IA Configura¸c˜oes de cache DS Configura¸c˜oes de cache DL Configura¸c˜oes de cache DA Configura¸c˜oes de cache C2 Coprocessador 2 implementado? MD Processador contem suporte para MDMX? PC Registos Performance Counter implementados? WR Registos Watch implementados? CA Compress˜aode c´odigo?(MIPS16e) EP M´oduloEJTAG implementado? FP Unidade FPU Floating Point Unit implementada?

Tabela 4.29: Tabela de atributos do registo Config1.

CP0 Registo 16, Select 2 (Config2)

Os registos Config2 e Config3 cont´emas codifica¸c˜oese configura¸c˜oesespecificas da cache no processador.

O bit mais significativo M indica se o registo Config3 se encontra implementado no processador, caso contr´arioeste retornar´a0. Sendo os restantes bits utilizados para configura¸c˜oesda cache.

31 30 28 27 24 23 20 19 16 15 12 11 8 7 4 3 0 M TU TS TL TA SU SS SL SA

Tabela 4.30: Registo interno Config2. 70 CAP´ITULO 4. MODULOS´

CP0 Registo 30, Select 0 (ErrorEPC)

O ErrorEPC ´eum registo que permite a escrita, por software e hardware, e cujo funci- onamento ´esimilar ao registo EPC, com a diferen¸caque ´eutilizado exclusivamente em situa¸c˜oesde erro ou excep¸c˜oesdo tipo Reset, Soft Reset, NMI (Nonmaskable Interrupt) e Cache errors.

Sempre que ocorre uma das excep¸c˜oesacima citadas, o bit StatusERL encontra-se activo e o valor do ErrorEPC, lido pela instru¸c˜aoERET no seu retorno, aponta para o endere¸co virtual da instru¸c˜aogeradora da excep¸c˜aoou o endere¸coanterior da instru¸c˜aono Branch Delay Slot.

31 0 ErrorEPC

Tabela 4.31: Registo interno ErrorEPC.

Os registos directamente relacionados com a utiliza¸c˜aoe interface com a TLB ser˜ao abordados no cap´ıtulo 4.3.1.

Simula¸c˜aoem Software

Em oposi¸c˜aoao funcionamento dos registos gen´ericos, os registos internos possuem uma representa¸c˜aoum pouco diferente uma vez que estes s˜aodinˆamicospodendo o seu tama- nho variar. Pegue-se no seguinte bloco de c´odigoutilizado para representar os registos internos, descritos em 4.1.7, na estrutura do processador:

/∗ Re gis tos do Coprocessador0 ∗/ CP0 Entry ∗CP0 Reg [ 3 2 ] ;

//Estrutura de dados CP0 Entry typedef struct CP0 Entry{

//Numero do Registo int Numero ;

//Sel − Re gis tos com Informacao GPR S e l [ 8 ] ;

//Nivel de obrigatoriedade char Comp [ 3 2 ] ; 4.1. PROCESSADOR 71

} CP0 Entry ;

Listing 4.12: Defini¸c˜aodos registos internos na estrutura do processador em C.

Do conjunto de registos existentes no coprocessador zero, apenas um sub conjunto possui caracter obrigat´orio de implementa¸c˜ao.Esta necessidade varia conforme os mecanismos implementados ou dispon´ıveis pelo hardware. Um exemplo deste caso s˜aoos registos que controlam o funcionamento do mecanismo TLB, nomeadamente os registos: Index, Random, EntryHi, EntryLo0, EntryLo1 ou Pagemask. Cuja obrigatoriedade varia com a presen¸cado m´odulono processador, caso contr´arioestes registos s˜aoopcionais.

A necessidade de definir uma estrutura para estes registos nasce do facto de que o seu tamanho pode variar, existindo assim registos com tamanho superior a 32 bits7. Por defini¸c˜ao,a arquitectura MIPS32 permite que existam registos compostos por um ou mais sub registos de 32 bits. Desta forma existe um n´umeropara identificar o registo no coprocessador zero e um campo apelidado de “SEL” para identificar o registo associado a esse n´umero. Existe tamb´emum n´ıvel de obrigatoriedade associada a cada registo, que de acordo com os mecanismos implementados e a revis˜aoda arquitectura utilizada, actualizar´aestaticamente na inicializa¸c˜aodo processador o seu valor para: “Opcional”, “Obrigat´orio”,“Recomendado”, “Obrigat´orioVer. 2” ou “Obrigat´orioMMU/TLB”.

De modo a simplificar os exemplos, ser´autilizada a nomenclatura (Num:Sel) para iden- tificar o par: n´umerode registo do coprocessador zero e respectivo sub registo associado. O registo zero do coprocessador ´eo registo Index (0:0), que ´eutilizado pelo mecanismo TLB, cuja obrigatoriedade de implementa¸c˜aodepende do facto de a mesma se encontrar presente e implementada no processador. Este registo ´ecomposto por apenas um sub registo.

Em oposi¸c˜aoao registo zero, o registo doze do coprocessador zero ´ecomposto por quatro sub registos: Status (12:0), IntCtl (12:1), SRSCtl (12:2) e SRSMap (12:3), todos com tamanho 32bits.

Com a estrutura definida no bloco de c´odigoanterior (4.12), ´eposs´ıvel abranger e imple- mentar todos os registos internos necess´ariosao funcionamento da arquitectura MIPS32.

7O tamanho dos registos varia em incrementos de 32 bits uma vez que cada sub registo possui um tamanho de 32 bits. 72 CAP´ITULO 4. MODULOS´

4.1.8 Mecanismo de Excep¸c˜oes

Com o decorrer normal da execu¸c˜ao,podem surgir situa¸c˜oesque obriguem o processador a interromper o seu fluxo de execu¸c˜ao. Tais eventos s˜aoconhecidos como excep¸c˜oese podem ser de dois tipos: excep¸c˜oesgeradas pela execu¸c˜aode instru¸c˜oesno processador ou por pedidos que n˜aose encontram directamente relacionados com o funcionamento do processador, como por exemplo os pedidos de interrup¸c˜oesdos perif´ericos.

Desta forma, existem excep¸c˜oesdo tipo s´ıncronasou ass´ıncronas.As excep¸c˜oess´ıncronas ocorrem exactamente no momento de execu¸c˜aoda instru¸c˜aono processador, sendo asso- ciadas `ainstru¸c˜aoactual no processador. No caso das excep¸c˜oesass´ıncronas,a excep¸c˜ao n˜ao´egerada no momento em que ´edetectada mas sim posteriormente, quando o pro- cessador pode atender o pedido. Nestes casos, a excep¸c˜aon˜aose encontra directamente associada `ainstru¸c˜aoexecutada no processador. S˜aogeralmente associados a pedidos de interrup¸c˜aoexternas, pedidos de Reset ou valida¸c˜aode inconsistˆenciasno processador.

As prioridades das excep¸c˜oesn˜aos˜aoiguais, variando com a categoria onde se inse- rem, respectivamente por relevˆancia: Ass´ıncronaReset, Ass´ıncronaDebug, Ass´ıncrona, S´ıncronaDebug e S´ıncrona.No quadro 4.32 podemos ver os tipos de excep¸c˜oesassocia- das aos modos s´ıncronose ass´ıncronos.

Sempre que ocorre uma excep¸c˜ao,o processador entra em modo Kernel, guarda um conjunto de dados relativos ao seu estado de execu¸c˜aoe salta para um endere¸copr´e calculado com o objectivo de executar c´odigobin´ariodesignado para aquela excep¸c˜ao. O endere¸coutilizado pelo processador para tratar a excep¸c˜ao´econhecido como ponto de entrada (EntryPoint). Este ponto de entrada ´ecalculado utilizando um conjunto de vectores previamente definidos para a arquitectura MIPS32. Desta forma, os endere¸cos s˜aocalculados utilizando duas componentes, a base e o seu deslocamento.

Na revis˜ao2 da arquitectura MIPS32, o c´alculoda base pode ser definido por software atrav´esdo registo EBase de forma permitir a customiza¸c˜aodos vectores de excep¸c˜oes.O valor do EBase pode ser modificado caso o StatusBEV se encontre a zero, caso contr´ario a opera¸c˜aon˜ao´epermitida uma vez que no arranque do sistema os vectores de excep¸c˜oes s˜aofixos. No quadro 4.33 pode-se visualizar a forma como ´egerado a base para os pontos de entrada.

As excep¸c˜oes Reset, Soft Reset e NMI s˜aoum caso especial, uma vez que n˜aoutilizam deslocamento no c´alculodo seu endere¸cosendo o seu valor sempre, independentemente do estado do StatusBEV, 0xBFC00000. 4.1. PROCESSADOR 73

Excep¸c˜ao Tipo Prioridade Reset Ass´ıncrona(Reset) 1 Soft Reset Ass´ıncrona(Reset) 1 Debug Single Step S´ıncrona(Debug) 4 Debug Interrupt Ass´ıncrona(Debug) 2 Imprecise Data Break Ass´ıncrona(Debug) 2 NMI Ass´ıncrona 3 Machine Check Ass´ıncrona 3 Interrupt Ass´ıncrona 3 Deferred Watch Ass´ıncrona 3 Debug Instruction Break S´ıncrona(Debug) 4 Watch S´ıncrona 5 Address Error S´ıncrona 5 TLB Refill S´ıncrona 5 TLB Invalid S´ıncrona 5 TLB Execute S´ıncrona 5 Cache Error S´ıncrona 5 Bus Error S´ıncrona 5 SDBBP S´ıncrona(Debug) 4

Tabela 4.32: Quadro de excep¸c˜oess´ıncronase ass´ıncronascom respectivas prioridades. (1 maior prioridade, 5 menor prioridade)

Excep¸c˜ao StatusBEV 0 1 Reset, Soft Reset e NMI 0xBFC00000 EJTAG Debug (ProbTrap=0) 0xBFC00480 EJTAG Debug (ProbTrap=1) 0xFF200200 Para a revis˜ao1: 0xA0000000 Cache Error Para a revis˜ao2: 0xBFC00200 EBase 31..30 || 1 || EBase 28..12 || 0x000 Para a revis˜ao1: Restantes 0x80000000 0xBFC00200 Excep¸c˜oes Para a revis˜ao2: EBase 31..12 || 0x000 Note-se que o valor de EBase 31..30 = 0b10.

Tabela 4.33: C´alculodo endere¸cobase para os pontos de entrada. 74 CAP´ITULO 4. MODULOS´

Nos restantes casos, se o StatusBEV se encontrar activo, o endere¸cobase utilizado ´e 0xBFC00 sendo os 12 bits menos significativos utilizados como deslocamento. Se o bit StatusBEV se encontrar desactivado, para excep¸c˜oesdo tipo cache, na revis˜ao2, o endere¸co´ecalculado utilizando a express˜ao:

Endere¸coBase = EBase 31..30 || 1 || EBase 28..12 || 0x000

Os bits 31 e 30 s˜aoest´aticos(0x10) de forma a manter compatibilidade com a revis˜ao 1, uma vez que o seu endere¸co base era o 0x80000000. O bit 29 tem de estar obriga- toriamente activo para for¸caro endere¸co ao dom´ıniodo segmento KSEG1, que ´eum segmento n˜aomapeado e sem utiliza¸c˜aode cache. Relativamente aos bits EBase 28..12, estes s˜aoresponsabilidade do sistema operativo de forma a criar os vectores base para cada excep¸c˜ao,sendo os ´ultimosdoze bits escritos com zeros.

Para todas as restantes excep¸c˜oes,o c´alculodo endere¸co´eigual com a excep¸c˜aoque o bit 29 n˜aose encontra activo, respectivamente:

Endere¸coBase = EBase 31..30 || EBase 29..12 || 0x000

Relativamente aos 12 bits menos significativos, utilizados para o deslocamento dos vec- tores de excep¸c˜ao,estes podem ser dos seguintes tipos.

Excep¸c˜ao Vector Deslocamento TLB Refill (StatusEXL = 0) 0x000 Cache error 0x100 Gen´erica 0x180 Interrup¸c˜ao(CauseIV=1) 0x200 Reset, Soft Reset, NMI N˜aoaplic´avel

Tabela 4.34: Quadro com deslocamentos utilizados no c´alculode pontos de entrada.

Os vectores de deslocamento s˜aofixos, podendo variar em fun¸c˜aode determinados bits no processador. Um exemplo destes casos ´ea excep¸c˜ao TLB Refill, cujo o deslocamento varia em fun¸c˜aodo StatusEXL e endere¸cobase em fun¸c˜aodo StatusBEV.

No quadro 4.35 pode-se ver o conjunto de pontos de entrada definidos para a arquitec- tura MIPS32 Revis˜ao2 em fun¸c˜aodos bits StatusEXL, StatusBEV, CauseIV e EJTAG ProbTrap, assumindo que o valor do registo EBase encontra-se no seu estado inicial. 4.1. PROCESSADOR 75

Excep¸c˜ao StatusBEV StatusEXL CauseIV EJTAG Vector de ProbTrap entrada Reset, Soft Reset e NMI x x x x 0xBFC00000 EJTAG Debug x x x 0 0xBFC00480 EJTAG Debug x x x 1 0xFF200200 TLB Refill 0 0 x x 0x80000000 TLB Refill 0 1 x x 0x80000180 TLB Refill 1 0 x x 0xBFC00200 TLB Refill 1 1 x x 0xBFC00380 Cache Error 0 x x x 0xA0000100 Cache Error 1 x x x 0xBFC00300 Interruption 0 0 0 x 0x80000180 Interruption 0 0 1 x 0x80000200 Interruption 1 0 0 x 0xBFC00380 Interruption 1 0 1 x 0xBFC00400 Outras excep¸c˜oes 0 x x x 0x80000180 Outras excep¸c˜oes 1 x x x 0xBFC00380 Note-se que o valor ”x”indica n˜aointeressa e o EBase possui o valor inicial.

Tabela 4.35: C´alculodo endere¸cobase para os pontos de entrada.

Tratamento de excep¸c˜oes

Como abordado anteriormente, sempre que ocorre uma excep¸c˜aoo processador suspende o fluxo de execu¸c˜ao,calcula o endere¸coque possui o respectivo tratador da excep¸c˜aoe modifica o PC para o endere¸cocalculado. Em seguida, ser´aabordado a metodologia utilizada pela arquitectura MIPS para resolu¸c˜aodas excep¸c˜oesgeradas.

Segundo [Swe06] o processo de execu¸c˜aode uma excep¸c˜ao´ecomposto por seis fases, sendo elas:

1. Arranque Assim que o processador salta para o tratador da excep¸c˜ao,pouco ou nenhuma in- forma¸c˜aorelativa ao programa interrompido se encontra resguardada. Desta forma, o primeiro passo ´esalvaguardar esta informa¸c˜aoem mem´oria. Na arquitectura MIPS32 revis˜ao1 esta tarefa ´eexclusiva do sistema operativo, sendo que na revis˜ao2 da arquitec- tura tenha sido introduzida uma funcionalidade conhecida como Shadow Set Registers, totalmente em hardware, que guarda c´opiasdos registos gen´ericossempre que ocorre uma interrup¸c˜aoou excep¸c˜ao,com o objectivo de preserva¸c˜ao.

Por conven¸c˜ao,apenas os registos $k0 e $k1 podem/ devem ser utilizados nos tratamen- tos de excep¸c˜oesde baixo n´ıvel, sendo utilizados por software para copiar os registos 76 CAP´ITULO 4. MODULOS´ gen´ericospara a mem´oriade forma a permitir a utiliza¸c˜aototal dos mesmos registos.

A utiliza¸c˜aodos Shadow Set Registers ´euma poderosa funcionalidade com grande im- pacto no desempenho total do sistema, uma vez que a ocorrˆencia de excep¸c˜oes e inter- rup¸c˜oesnum sistema ´emuito elevada. Al´emdeste facto, o resguardo dos registos ´efeito automaticamente por hardware, libertando assim a necessidade de execu¸c˜aode blocos de c´odigoest´aticoscomo: “guardar registos gen´ericosna mem´oria”e “repor registos gen´ericosda mem´oria”,tanto no inicio como no fim do tratamento de cada excep¸c˜ao.

2. Identifica¸c˜aoda excep¸c˜ao O processo de identifica¸c˜aoda excep¸c˜ao´efeito atrav´esdos bits CauseExcCode, que podem ser consultados na tabela 4.22. E´ atrav´esdestes bits que o sistema operativo consegue identificar qual a excep¸c˜aoque ocorreu, assim como as causas do seu aconteci- mento e em seguida determinar o tratador adequado.

3. Constru¸c˜aodo ambiente de processamento O desenvolvimento de sistemas operativos, assim como o tratamento de excep¸c˜oes,´e feito utilizando linguagens de alto n´ıvel, que por sua vez possuem um conjunto de bibli- otecas standard necess´ariaspara a sua utiliza¸c˜ao. De forma a possibilitar a utiliza¸c˜ao destas bibliotecas, ´enecess´arioque o sistema operativo reserve espa¸cona mem´oriacomo STACK, a fim de preservar registos internos ou gen´ericos das bibliotecas que possuam permiss˜oesde modifica¸c˜ao.

Em sistemas Linux [Lov10], cada processo, possui internamente um descritor de processo, composto pela estrutura thread_info, que ´earmazenado em duas p´aginasconsecutivas em mem´oria. Estas p´aginaspossuem 8KBytes (4K + 4K) de tamanho e partilham o mesmo espa¸code endere¸camento para guardar informa¸c˜aorelativa `aestrutura do processo, assim como a STACK para o modo de execu¸c˜ao Kernel, como se pode ver na figura 4.9.

Desta forma, os processos podem correr em modo Kernel e em modo User, sendo a STACK para o primeiro modo composta exclusivamente por estas duas p´aginasf´ısicas, e no segundo modo podendo variar com o restante dom´ıniode endere¸cosdispon´ıveis para o processo. E´ esta STACK no processo interrompido que ser´autilizada pelo sis- tema operativo para resguardar os registos gen´ericosque poder˜aoser sobrepostos com a utiliza¸c˜aode bibliotecas standard, independentemente do tipo de excep¸c˜ao:s´ıncrona ou ass´ıncrona.

4. Processamento da excep¸c˜ao Nesta fase, o tratador da excep¸c˜aoencontra-se pronto para correr o c´odigobin´arioade- quado ao tipo de excep¸c˜aoidentificada nas fases anteriores, sem restri¸c˜oesde acesso aos registos gen´ericosdo coprocessador zero. 4.1. PROCESSADOR 77

Figura 4.9: STACK para modo de execu¸c˜aoKernel em sistemas Linux.

5. Prepara¸c˜aopara retorno Uma vez que o espa¸copara cada tratador ´elimitado, as fun¸c˜oesde alto n´ıvel s˜aochama- das em sub-rotinas retornando para baixo n´ıvel no seu retorno. No fim do tratamento da excep¸c˜ao,´eobrigat´oriorepor os valores dos registos gen´ericose dos registos de controlo no processador, podendo estes variar em fun¸c˜aodo tipo de excep¸c˜aocomo abordado mais `afrente neste cap´ıtulo.

6. Retorno da excep¸c˜ao A ´ultima fase no tratamento de excep¸c˜oes ´eexecutar o seu retorno, que ´efeito atrav´es da execu¸c˜aoda instru¸c˜aoERET.

Esta instru¸c˜ao´erespons´avel por identificar qual o endere¸code retorno, guardado nos registos EPC e ErrorEPC, dependendo do estado do bit StatusERL. Na sua execu¸c˜ao,os bits StatusEXL e StatusERL s˜aodesligados em fun¸c˜aodo registo de retorno utilizado, sendo o modo de opera¸c˜aodefinido com o valor dos bits StatusKSU. Para a revis˜ao2 da arquitectura MIPS32, os registos gen´ericose internos guardados no Shadow Set Registers s˜aorepostos por hardware automaticamente. 78 CAP´ITULO 4. MODULOS´

Excep¸c˜oesaninhadas (Nested Exceptions)

O conceito de excep¸c˜oesaninhadas surgiu do facto de ser poss´ıvel ocorrer uma excep¸c˜ao dentro do c´odigode outra excep¸c˜ao. Esta pode ser gerada de forma s´ıncrona,directa- mente pela execu¸c˜aode uma instru¸c˜ao,ou ass´ıncronaatrav´esde dispositivos externos. Em ambos os casos, este acontecimento geraria caos no sistema uma vez que os registos Status, Cause, EPC e ErrorEPC s˜aomodificados com a gera¸c˜aode uma excep¸c˜ao.

De forma a ultrapassar este problema, ´enecess´arioter em considera¸c˜aocuidados adi- cionais que consistem em resguardar um conjunto de registos, gen´ericose internos, na mem´oria. De forma a permitir que uma excep¸c˜aosobreviva `aocorrˆenciade outra ex- cep¸c˜ao,´enecess´arioguardar os registos de forma estruturada na STACK do processo interrompido. Esta estrutura ´econhecida como Exception Frame e a cada nova excep¸c˜ao ´einstanciada uma nova estrutura e guardada na STACK, criando assim um ambiente de execu¸c˜aopara a nova excep¸c˜ao. Os recursos existentes na STACK s˜aoconsumidos e destru´ıdos`amedida que as excep¸c˜oess˜aotratadas, uma vez que o crescimento do aninhamento de excep¸c˜oes descontrolado n˜ao´etolerado.

E´ bastante comum os sistemas operativos atribu´ıremum n´ıvel de prioridade para ex- cep¸c˜oes, permitindo ou n˜ao, a gera¸c˜aode novas excep¸c˜oesdentro de excep¸c˜oesem execu¸c˜ao.Desta forma, as frames alocadas na STACK s´ocrescer˜aoat´eum n´ıvel m´aximo de prioridades definidas. Um exemplo deste funcionamento ´eo tratamento de inter- rup¸c˜oes,no qual podem ser gerados v´ariostipos excep¸c˜oesna sua execu¸c˜ao,nomeada- mente syscalls uma vez que o sistema ´econstru´ıdoutilizando linguagens de alto n´ıvel.

Relembro que no caso das interrup¸c˜oes´eposs´ıvel por software, ligar e desligar as mesmas, atrav´esdas instru¸c˜oesDI e EI, introduzindo assim um n´ıvel de controlo maior para o sistema operativo.

Funcionamento das Excep¸c˜oes

Como abordado anteriormente neste cap´ıtulo, a arquitectura MIPS32 disp˜oede um conjunto de excep¸c˜oesque s˜aogeradas em situa¸c˜oesespec´ıficas. Em seguida, ser˜ao identificados os tipos de excep¸c˜oesexistentes e a suas respectivas descri¸c˜oesassim como o seu funcionamento particular.

1. Excep¸c˜aoEJTAG Debug As excep¸c˜oesdeste tipo s˜aogeradas quando uma das condi¸c˜oesassociadas ao mecanismo EJTAG se encontrar activo. Para mais informa¸c˜oes,ver a especifica¸c˜aodo mecanismo EJTAG em http://www.mips.com. 4.1. PROCESSADOR 79

O vector de excep¸c˜aoutilizado ´e0xBFC00480, caso o ProbTrap bit do registo “EJ- TAG Control Register” se encontrar desligado. Se o bit se encontrar activo, o vector de excep¸c˜aoutilizado ´e0xFF200200.

2. Excep¸c˜aoReset A excep¸c˜ao Reset ocorre quando ´eintroduzido o sinal de “Cold Reset” no processador, levando a uma reinicializa¸c˜aototal do mesmo, abortando todas as m´aquinasde estados internos e repondo os registos do coprocessador zero com o seu valor inicial.

O registo CauseExcCode n˜ao´eactualizado uma vez que n˜aoexiste nenhum c´odigopr´e definido para este tipo de excep¸c˜ao. Os seguintes registos do coprocessador zero s˜ao modificados com valores pr´e-definidos:

Estados actualizados Bits Valor Cause DC 0 EBase ExceptionBase 0 Random - Tamanho da TLB - 1 Wired - 0 Config - Estado de arranque Config1 - Estado de arranque Config2 - Estado de arranque Config3 - Estado de arranque Status RP 0 Status BEV 1 (Bootstrap) Status TS 0 Status SR 0 Status NMI 0 Status ERL 1 Registos Watch - 0 Performance Counter IE 0 ErrorEPC - PC de reinicializa¸c˜ao PC - 0xBFC0 0000

Tabela 4.36: Estados modificados pela excep¸c˜aoReset.

Para informa¸c˜oesespec´ıficasda opera¸c˜aode Reset no processador, ver [MT10c]. O vector de excep¸c˜aoutilizado ´eo 0xBFC0 0000.

3. Excep¸c˜aoSoft Reset A excep¸c˜ao Soft Reset, da mesma forma que a excep¸c˜ao Reset, ocorre quando ´eenviado por hardware um sinal de Reset no processador. Este n˜aorealiza todo o processo de rei- nicializa¸c˜aodo processador, apenas um sub conjunto das opera¸c˜oes.Assim o processador 80 CAP´ITULO 4. MODULOS´

´ereinicializado num estado no qual possa correr instru¸c˜oesda mem´orian˜aomapeada e sem utiliza¸c˜aode cache, uma vez que opera¸c˜oesde bus ou cache foram interrompidas, levando a que alguns estados internos no processador possam estar inconsistentes.

A grande diferen¸caentre os dois tipos de Reset, ´eque o “Cold Reset” ´eutilizado na inicializa¸c˜aodo hardware, “Power Up”, enquanto o Soft Reset ´eutilizado em situa¸c˜oes em que o processador fique bloqueado ou n˜aoresponda, conhecido como “hung”. Uma vez que o sinal ´eintroduzido por hardware, o CauseExcCode n˜ao´eactualizado. Os seguintes registos do coprocessador zero s˜aomodificados com valores pr´e-definidos:

Estados actualizados Bits Valor Status RP 0 Status BEV 1 (Bootstrap) Status TS 0 Status SR 1 Status NMI 0 Status ERL 1 Registos Watch - 0 Performance Counter IE 0 ErrorEPC - PC de reinicializa¸c˜ao PC - 0xBFC0 0000

Tabela 4.37: Estados modificados pela excep¸c˜aoSoft Reset.

Para informa¸c˜oesespec´ıficasda opera¸c˜aode Soft Reset no processador, ver [MT10c]. O vector de excep¸c˜aoutilizado ´eo 0xBFC0 0000.

4. Excep¸c˜aoNon Maskable Interrupt (NMI) Este tipo de excep¸c˜aoocorre sempre que ´eintroduzido o sinal de NMI por hardware no processador. O seu funcionamento ´emuito semelhante ao das interrup¸c˜oescom a diferen¸ca que esta n˜aopode ser mascarada, uma vez que a sua natureza obriga que a resposta a um determinado evento seja efectuado sem demora, como erros de hardware n˜aorecuper´aveis (bloqueios internos).

Ao contr´ariodo que acontece com as duas excep¸c˜oesanteriores, esta n˜aotem car´acter de reinicializa¸c˜ao,sendo as m´aquinasde estados no processador, cache ou mem´oria mantidos sem modifica¸c˜oes,`aexcep¸c˜aodos seguintes registos: 4.1. PROCESSADOR 81

Estados actualizados Bits Valor Status BEV 1 (Bootstrap) Status TS 0 Status SR 0 Status NMI 1 Status ERL 1 ErrorEPC - PC de reinicializa¸c˜ao PC - 0xBFC0 0000

Tabela 4.38: Estados modificados pela excep¸c˜aoNMI.

O vector de excep¸c˜aoutilizado ´eo 0xBFC0 0000.

5. Excep¸c˜aoMachine Check

A excep¸c˜ao Machine Check ocorre sempre que o processador detecte inconsistˆenciasna sua execu¸c˜aointerna por hardware. Para processadores que implementem o mecanismo de tradu¸c˜aode endere¸cosTLB, nos casos em que sejam detectadas m´ultiplasentradas na TLB atrav´esda instru¸c˜aoTLBP, o processador gerar´aa excep¸c˜ao Machine Check por hardware e activar´ao bit StatusTS.

Estados actualizados Bits Valor Cause ExcCode MCheck

Tabela 4.39: Estados modificados pela excep¸c˜aoMachine Check.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

6. Excep¸c˜aoAddress Error Este tipo de excep¸c˜aoocorre nas seguintes circunstˆancias:

1. E´ efectuada a introdu¸c˜aode uma instru¸c˜aono processador, fase instruction fetch, cujo endere¸con˜aose encontre alinhado num limite de word.

2. E´ executada uma instru¸c˜aodo tipo LOAD ou STORE, com um endere¸con˜ao- alinhado ao limite de uma word ou half word.

3. Referˆenciaa zonas de Kernel feitas com o processador em modo de execu¸c˜ao User ou Super User. 82 CAP´ITULO 4. MODULOS´

4. Referˆenciaa zonas de Super User feitas com o processador em modo de execu¸c˜ao User.

Se a opera¸c˜aofor um LOAD, o CauseExcCode ´eactualizado para AdEL, caso seja uma opera¸c˜aode STORE o registo ´emodificado para AdES.

Estados actualizados Bits Valor Cause ExcCode AdEL ou AdES BadVAddr - Endere¸coque falhou o acesso Context VPN2 Imprevis´ıvel EntryHi VPN2 Imprevis´ıvel EntryLo0 - Imprevis´ıvel EntryLo1 - Imprevis´ıvel

Tabela 4.40: Estados modificados pela excep¸c˜aoAddress Error.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

7. Excep¸c˜aoTLB Refill A excep¸c˜ao TLB Refill ocorre quando, em processadores que implementem o mecanismo TLB, o endere¸covirtual pedido pela MMU n˜aose encontra mapeado na TLB. Sempre que a excep¸c˜aoocorre, independentemente do estado do StatusEXL, o Cause- ExcCode ´epreenchido com TLBS para pedidos de STORE ou com TLBL para pedidos de LOAD.

Estados actualizados Bits Valor Cause ExcCode TLBS ou TLBL

Tabela 4.41: Estados modificados pela excep¸c˜aoTLB Refill.

Se o StatusEXL se encontrar desligado na altura da excep¸c˜ao,o vector utilizado ser´a o TLB Refill Vector com o deslocamento 0x000. Caso o StatusEXL se encontrar ac- tivo na altura da excep¸c˜ao,o vector utilizado ser´ao General Exception Vector com o deslocamento 0x180.

Para informa¸c˜oesdetalhadas sobre o funcionamento da TLB Refill ver 4.3.4.

8. Excep¸c˜aoExecute-Inhibit Esta excep¸c˜aoocorre sempre que um endere¸covirtual pedido pela MMU se encontre mapeado na TLB mas possua o bit XI activo. A excep¸c˜ao Execute-Inhibit s´o´ev´alida para processadores que implementem os bits XI activos no registo PageGrainXIE. 4.1. PROCESSADOR 83

Estados actualizados Bits Valor Cause ExcCode TLBL ou TLBXI

Tabela 4.42: Estados modificados pela excep¸c˜aoTLB Execute-Inhibit.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. Para informa¸c˜oesdetalhadas sobre o funcionamento da Execute-Inhibit, ver 4.3.4.

9. Excep¸c˜aoRead-Inhibit Esta excep¸c˜aoocorre sempre que um endere¸covirtual pedido pela MMU se encontre mapeado na TLB mas possua o bit XI activo. A excep¸c˜ao Read-Inhibit s´o´ev´alidapara processadores que implementem os bits RI activos no registo PageGrainRIE.

Estados actualizados Bits Valor Cause ExcCode TLBL ou TLBRI

Tabela 4.43: Estados modificados pela excep¸c˜aoTLB Read-Inhibit.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. Para informa¸c˜oesdetalhadas sobre o funcionamento da Read-Inhibit, ver 4.3.4.

10. Excep¸c˜aoTLB Invalid A excep¸c˜ao TLB Invalid ocorre sempre que o endere¸covirtual pedido pelo MMU se en- contre mapeado na TLB e a p´aginaf´ısica(PFN) referenciada, respectivamente EntryLo0 ou EntryLo1, possui o bit V (Valid) desligado.

Estados actualizados Bits Valor Cause ExcCode TLBL ou TLBS

Tabela 4.44: Estados modificados pela excep¸c˜aoTLB Invalid.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. Para informa¸c˜oesdetalhadas sobre o funcionamento da TLB Invalid, ver 4.3.4.

11. Excep¸c˜aoTLB Modified Da mesma forma que acontece com a TLB Invalid, a excep¸c˜ao TLB Modified ocorre sempre que o endere¸covirtual pedido pela MMU se encontre mapeado na TLB mas a p´aginaf´ısicareferenciada possua o bit D (Dirty) activo.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. Para informa¸c˜oesdetalhadas sobre o funcionamento da TLB Modified, ver 4.3.4. 84 CAP´ITULO 4. MODULOS´

Estados actualizados Bits Valor Cause ExcCode Mod

Tabela 4.45: Estados modificados pela excep¸c˜aoTLB Modified.

12. Excep¸c˜aoCache Error Este tipo de excep¸c˜oesocorrem sempre que a execu¸c˜aode uma instru¸c˜aodetecte erros nos r´otulosda cache, cache miss ou sejam detectados problemas na paridade dos bits. Nestes casos, o vector de excep¸c˜oesaponta para uma zona de mem´orian˜aomapeada e sem utiliza¸c˜aode cache para resolu¸c˜aodos erros.

Estados actualizados Bits Valor Cause ExcCode CacheErr Status ERL 1 Status NMI 0 Status SR 0 CacheErr - Estado de erro ErrorEPC - PC de retorno

Tabela 4.46: Estados modificados pela excep¸c˜aoCache.

O vector de excep¸c˜aoutilizado ´eo Cache Exception Vector com o deslocamento 0x100. Se o StatusBEV se encontrar activo, o PC ´emodificado para 0xBFC0 0200 + 0x0100. Caso contr´ario,PC ´ecalculado utilizando as regras descritas anteriormente como pode- mos ver no quadro 4.33. Se a revis˜aoda arquitectura for a 2, o PC ´ecalculado atrav´es da express˜ao:

PC = EBase 31 .. 30 || 1 || EBase 28 .. 12 || 0x100

Caso contr´ario,o PC ´emodificado para 0xA000 0000 + 0x0100 de forma a manter retro compatibilidade.

13. Excep¸c˜aoBus Error A excep¸c˜aoBus Error ocorre quando uma instru¸c˜ao,informa¸c˜aoou introdu¸c˜aode ins- tru¸c˜oesno processador gera um pedido (atrav´esdos mecanismos de cache) que termina em erro.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. 4.1. PROCESSADOR 85

Estados actualizados Bits Valor Cause ExcCode IBE ou DBE

Tabela 4.47: Estados modificados pela excep¸c˜aoBus Error.

14. Excep¸c˜aoInteger Overflow Esta excep¸c˜aoocorre sempre que ocorre um overflow em instru¸c˜oesaritm´eticascomo o ADD, ADDI ou SUB.

Estados actualizados Bits Valor Cause ExcCode Ov

Tabela 4.48: Estados modificados pela excep¸c˜aoInteger Overflow.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

15. Excep¸c˜aoTrap Este tipo de excep¸c˜oesocorre sempre que seja verdade a condi¸c˜aode valida¸c˜aodas instru¸c˜oesque gerem TRAP, como exemplo: TEQ, TEQI, TGE,TGEI, TGEI, TGEIU, TGEU, TLT, TLTI, TLTIU, TLTU, TNE ou TNEI.

Estados actualizados Bits Valor Cause ExcCode Tr

Tabela 4.49: Estados modificados pela excep¸c˜aoTrap.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

16. Excep¸c˜aoSystem Call Este tipo de excep¸c˜aoocorre apenas se a instru¸c˜aoSYSCALL for executada.

Estados actualizados Bits Valor Cause ExcCode Sys

Tabela 4.50: Estados modificados pela excep¸c˜aoSystem Call.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

17. Excep¸c˜aoBreakpoint Sempre que a instru¸c˜aoBREAK ´eexecutada ´egerada a excep¸c˜aoBreakpoint.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180. 86 CAP´ITULO 4. MODULOS´

Estados actualizados Bits Valor Cause ExcCode Bp

Tabela 4.51: Estados modificados pela excep¸c˜aoBreak Point.

18. Excep¸c˜aoReserved Instruction Sempre que ´eexecutada uma instru¸c˜aocuja codifica¸c˜ao(opcode) se encontre marcada como reservada para implementa¸c˜oesfuturas, o processador ´erespons´avel pela gera¸c˜ao por hardware da excep¸c˜ao Reserved Instruction. Para mais informa¸c˜oessobre as codi- fica¸c˜oesreservadas para a arquitectura MIPS32 Revis˜ao2, ver [MT10b].

Estados actualizados Bits Valor Cause ExcCode RI

Tabela 4.52: Estados modificados pela excep¸c˜aoReserved Instruction.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

19. Excep¸c˜aoCoprocessor Unusable Esta excep¸c˜aoocorre sempre que uma das seguintes condi¸c˜oesseja verdade:

1. Execu¸c˜aode instru¸c˜oesdo subconjunto da codifica¸c˜aoCOP0 ou a instru¸c˜ao Cache, com o processador a correr em modo User ou Super User com o StatusCU0 bit a zero.

2. Execu¸c˜aode instru¸c˜oesdo subconjunto da codifica¸c˜aoCOP1, COP1X, LWC1, SWC1, LDC1, SDC1 ou MOVCI com o StatusCU1 desligado.

3. Execu¸c˜aode instru¸c˜oesdo subconjunto da codifica¸c˜aoCOP2, LWC2, SWC2, LDC2 ou SDC2 com o StatusCU2 desligado.

Estados actualizados Bits Valor Cause ExcCode CpU Cause CE N´umerodo coprocessador gerador da excep¸c˜ao

Tabela 4.53: Estados modificados pela excep¸c˜aoCoprocessor Unusable.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

20. Excep¸c˜aoFloating Point Este tipo de excep¸c˜aoocorre quando sucede uma excep¸c˜aona execu¸c˜aodo coprocessador um, sendo em seguida encaminhada para o coprocessador zero. 4.1. PROCESSADOR 87

Estados actualizados Bits Valor Cause ExcCode FPE FCSR - Indica a causa da excep¸c˜aoda unidade de v´ırgulaflutuante

Tabela 4.54: Estados modificados pela excep¸c˜aoFloating Point.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

21. Excep¸c˜aoCoprocessor 2 Este tipo de excep¸c˜aoocorre quando sucede uma excep¸c˜aona execu¸c˜aodo coprocessador dois, sendo posteriormente sinalizada para o coprocessador zero.

Estados actualizados Bits Valor Cause ExcCode C2E

Tabela 4.55: Estados modificados pela excep¸c˜aodo Coprocessor 2.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

22. Excep¸c˜aoWatch A excep¸c˜ao Watch faz parte do mecanismo de Debug da arquitectura MIPS32, e ocorre sempre que o endere¸coguardado nos registos WatchHi e WatchLo correspondem ao endere¸coda instru¸c˜aoactual ou da referˆenciaa dados na mem´oria.

Por defeito, a excep¸c˜ao Watch s´opode ocorrer caso ambos os bits StatusEXL e Sta- tusERL se encontrem desactivados, caso contr´ario,atrav´esde hardware o processador activar´ao bit CauseWP indicando que o a excep¸c˜aose encontra pendente.

Estados actualizados Bits Valor Cause ExcCode WATCH Cause WP Indica se o WATCH foi atrasado ou n˜ao

Tabela 4.56: Estados modificados pela excep¸c˜aoWatch.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180.

23. Excep¸c˜aoInterrupt A excep¸c˜ao Interrupt ocorre sempre que ´efeito um pedido de interrup¸c˜aoatrav´esdo mecanismo de interrup¸c˜oes da arquitectura MIPS32. 88 CAP´ITULO 4. MODULOS´

Estados actualizados Bits Valor Cause ExcCode Int Cause IP Indica as interrup¸c˜oesque se encontram pendentes

Tabela 4.57: Estados modificados pela excep¸c˜aoInterrupt.

O vector de excep¸c˜aoutilizado ´eo General Exception Vector com o deslocamento 0x180 se o CauseIV bit se encontrar desligado. Caso contr´ario,o vector de excep¸c˜aoutilizado ´eo Interrupt Vector com o deslocamento 0x200.

Para informa¸c˜oesdetalhadas relativas aos mecanismos de excep¸c˜oesda arquitectura MIPS32, ver [MT10c].

Simula¸c˜aoem Software

O mecanismo de excep¸c˜oes encontra-se implementado dentro do motor de execu¸c˜aodo processador nos ficheiros “Mips32 core.c” e “Mips32 core.h”, sendo que todas as es- truturas associadas utilizadas encontram-se descritas em 4.1. E´ atrav´esdas fun¸c˜oes RaiseException3(CPU *cpu) e RaiseException(CPU *cpu, int ExcCode) que o sis- tema executa todas as rotinas das excep¸c˜oesacima descritas.

A primeira fun¸c˜ao´eutilizada para os trˆescasos especiais, uma vez que n˜aopossuem c´odigono CauseExcCode, nomeadamente: Reset, Soft Reset e NMI. Estes trˆescasos n˜ao podem/devem ser gerados por software sob pena de funcionamento imprevis´ıvel, dado que o seu despertar ´efeito exclusivamente por hardware atrav´esde injec¸c˜aode sinais directamente no processador. Desta forma, optou-se por criar uma fun¸c˜ao,que atrav´es dos estados dos bits StatusNMI e StatusSR consiga deduzir qual a opera¸c˜aoque dever´a ser executada, sem adicionar compara¸c˜oesdesnecess´ariasno tratamento das restantes excep¸c˜oes.Na figura 4.10 pode-se observar o diagrama de actividades para as excep¸c˜oes Reset, Soft Reset e NMI.

Como visto anteriormente, o funcionamento pode variar de excep¸c˜aopara excep¸c˜ao, sendo que em determinados casos, os estados resguardados pela arquitectura em cada excep¸c˜aopodem variar. De forma a resolver este problema, optou-se pela cria¸c˜aoda segunda fun¸c˜aopara o processamento geral das excep¸c˜oesidentificadas atrav´esdo Cau- seExcCode. De forma a entender melhor o funcionamento do mecanismo de excep¸c˜oes, veja-se o diagrama de execu¸c˜aopara o tratamento geral de excep¸c˜oesna figura 4.11.

De forma a simplificar a implementa¸c˜aodo mecanismo, e uma vez que o processamento das excep¸c˜oespossui um tronco comum, `aexcep¸c˜aode Reset, Soft Reset e NMI, decidiu- se criar a fun¸c˜ao RaiseException(CPU *cpu, int ExcCode) para o tratamento global 4.1. PROCESSADOR 89

Figura 4.10: Diagrama de actividade para as excep¸c˜oesReset, Soft Reset e NMI. das excep¸c˜oes.

O processo de tratamento geral de excep¸c˜oesencontra-se dividido em quatro fases:

1. Valida¸c˜aoda excep¸c˜ao;

2. C´alculodo deslocamento

3. Tratamento espec´ıficode cada excep¸c˜ao;

4. C´alculodo endere¸cobase e gera¸c˜aodo ponto de entrada.

A primeira fase consiste em identificar o valor do StatusEXL, uma vez que se o valor se encontrar a zero, o registo EPC ser´amodificado e ser˜aogerados novos ShadowSet’s (apenas para a revis˜ao2). Em seguida, ´enecess´arioidentificar se a instru¸c˜aogeradora da excep¸c˜aose encontra em modo “Delay Slot” ou “Normal”, uma vez que ir´ainfluenciar o valor do registo EPC. Caso contr´ario,n˜aoser˜aocriados novos ShadowSet’s nem ser´a modificado o valor do EPC, for¸candoo tratamento pelo vector geral com deslocamento 0x180.

Na segunda fase ´eefectuado o c´alculodo deslocamento do vector de entrada, sendo o seu valor directamente influenciada pelo tipo de excep¸c˜aoidentificado pelo CauseExcCode e pelo valor do StatusEXL.

Como referido anteriormente, algumas excep¸c˜oesnecessitam modificar o estado do pro- cessador atrav´esde bits espec´ıficos. Assim, a terceira fase consiste no processo de mo- difica¸c˜aodo estado do processador atrav´esdos respectivos bits, ver 4.1.8 90 CAP´ITULO 4. MODULOS´

Por ´ultimotemos a quarta fase, no qual o processador gerar´aatrav´esdo registo EBase, para a revis˜ao2 da arquitectura, o endere¸cobase utilizado para calcular o endere¸codo ponto de entrada. Assim que o endere¸co´ecalculado, este ´eintroduzido no registo PC do processador mudando assim o fluxo de execu¸c˜aopara o novo endere¸co. 4.1. PROCESSADOR 91 6 ! " !  ! ! " ! " ! "                    P@!76  ! "(D)I '()#W 66Y%  6 '()#W 66Y% 666 B3 ($ @ 3 @ !3A9 B#4C@ !3A9 !3A9 !3A9 !3A9 !3A9 !3A9 #G3@  #G3@ &( D EF5C2 D 4 !3AH 4 D  D B #3 F5 & ($ X!0($1 B#B# ( !( 5  5 !3A9@C@A9 B 3@C@ B (()(3SE!3A9 ) 4) !3A9T@3($ 3 $2 #)VW 66 7XX!089($1 #)VW 66WXX XXV7"66 7X Q@RA9 03 345671 03 @ '()'( 0%&1 '()'( (%#) @ 89 4567 QS@ 89 # $ # %& '()'(  '()'( (%#) #)!"089($1 #)!Q0($1   

 Figura 4.11: Diagrama de actividade para as de excep¸c˜oesdiferentes Reset, Soft Reset e NMI. #  

 ! "  #)!#U(7 92 CAP´ITULO 4. MODULOS´

4.2 Unidade de Gest˜aode Mem´oria(MMU)

O m´odulode gest˜aode mem´oria,conhecido por MMU (Memory Management Unit), ´eum circuito integrado no processador respons´avel por efectuar a gest˜aoda mem´oria virtual. Este processo consiste: na valida¸c˜aodos modos de opera¸c˜ao,atributos de cache, permiss˜oesde acesso a segmentos de mem´oriavirtual e tradu¸c˜aode endere¸cosvirtuais em endere¸cosf´ısicos,atrav´esdo mecanismo de tradu¸c˜aoimplementado.

Por defeito, a arquitectura MIPS32 suporta exclusivamente a utiliza¸c˜aode pagina¸c˜ao, sendo o processo de tradu¸c˜aode endere¸cosinfluenciado pelo mecanismo de tradu¸c˜aoe respectivas funcionalidades implementadas no processador. No presente trabalho apenas ser´aabordado o modelo de tradu¸c˜aode endere¸cosutilizando o mecanismo TLB sem suporte a p´aginasf´ısicasde tamanho 1KB.

E´ igualmente sua responsabilidade, a coordena¸c˜aona comunica¸c˜aoentre o processador e a mem´oria RAM, uma vez que todos os pedidos de tradu¸c˜aode endere¸coss˜aoenviados pelos coprocessadores zero e um para o m´oduloMMU internamente. Em seguida ser´a apresentada a forma como se encontra estruturada a mem´oriavirtual, assim como os mecanismos de comunica¸c˜aoentre a MMU e a mem´oriaRAM.

4.2.1 Mem´oria Virtual

A arquitectura MIPS32 disp˜oede um espa¸code endere¸camento virtual com o tamanho 232 bits perfazendo um total de 4GB. Este espa¸code endere¸camento virtual encontra- se dividido em cinco segmentos que podem ser classificados como: Mapped, Unmapped, Cached e Uncached.

Mapped Todos os endere¸cosneste dom´ınios˜aotraduzidos pelo mecanismo de tradu¸c˜aoTLB.

Unmapped Os endere¸cosneste dom´ınion˜aos˜aotraduzidos pela TLB, mas sim mapeados direc- tamente para os primeiros 512 MBytes da mem´oriaRAM come¸candono endere¸co f´ısico0x00000000.

Cached Apenas os segmentos USEG, KSEG0, KSSEG e KSEG3 podem ou n˜aoutilizar os mecanismos de cache.

Uncached Endere¸cos virtuais que n˜aoutilizam o mecanismo de cache. Alerta-se para o facto de a cache ser um componente desej´avel a qualquer processador, sendo n˜aoobri- gat´orio. 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 93

#### ####

!  

 

)### ####

  

( 

'### ####

    

& 

%### ####

  

$ 

"### ####

  

 

Figura 4.12: Estrutura da mem´oriavirtual para arquitecturas de 32 bits. 94 CAP´ITULO 4. MODULOS´

Endere¸co Segmento Espa¸code Modo de Acesso Tamanho Virtual (VA31..29 ) endere¸camento execu¸c˜ao permitido 0xFFFF FFFF 0b111 kseg3 at´e kernel kernel 229 bytes 0xE000 0000 sseg 0xDFFF FFFF 0b110 ksseg at´e supervisor supervisor 229 bytes 0xC000 0000 kernel 0xBFFF FFFF 0b101 kseg1 at´e kernel kernel 229 bytes 0xA000 0000 0x9FFF FFFF 0b100 kseg0 at´e kernel kernel 229 bytes 0x8000 0000 useg 0x7FFF FFFF user 0b0xx suseg0 at´e user superuser 231 bytes kuseg 0x0000 0000 kernel

Tabela 4.58: Zonas de endere¸camento na mem´oria virtual.

Associado a cada segmento encontra-se o modo de opera¸c˜aodo processador, uma vez que existem zonas da mem´oriavirtual que s´opodem ser acedidas em modo privilegiado. Esta t´ecnica´eutilizada para restringir o acesso n˜aoautorizado, por parte de aplica¸c˜oes que corram em modo user a segmentos de mem´oriaassociados ao modo kernel ou super user.

Existem outras t´ecnicaspara evitar o acesso ilegal entre processos a correr no segmento USEG, tais como pagina¸c˜aolinear ou multin´ıvel, abordadas mais `afrente neste cap´ıtulo. No quadro 4.58 ´epossivel visualizar os modos associados a cada segmento, assim como o seu tamanho e respectivos endere¸cosvirtuais de in´ıcioe fim.

Os segmentos KSEG0 e KSEG1 apontam para a mesma zona de mem´oriaf´ısica,nomea- damente os primeiros 512 MBytes da mem´oriaRAM. Esta zona de mem´oriaf´ısicavaria entre 0x00000000 e 0x1FFFFFFF, sobrepondo-se um ao outro, no qual o KSEG0 utiliza o mecanismo de cache e o KSEG1 n˜aoutiliza o mecanismo de cache.

Actualmente as placas m˜ae(motherboard) tiram partido da t´ecnicaMMIO (Memory Mapped Input/ Output) para mapear endere¸cosf´ısicos para componentes ligados na mesma. Desta forma, ´eposs´ıvel a comunica¸c˜aoentre os v´ariosperif´ericos atrav´esde uma arquitectura de LOAD e STORE, como explanado em detalhe no cap´ıtulo 4.5. 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 95

Ac¸c˜aodespoletada a partir do modo de execu¸c˜ao Espa¸code Segmento Modo Modo Modo endere¸camento User Superuser Kernel 0xFFFF FFFF at´e kseg3 Address Error Address Error Mapped 0xE000 0000 0xDFFF FFFF sseg at´e ksseg Address Error Mapped Mapped 0xC000 0000 0xBFFF FFFF at´e kseg1 Address Error Address Error Unmapped, Uncached 0xA000 0000 0x9FFF FFFF at´e kseg0 Address Error Address Error Unmapped 0x8000 0000 0x7FFF FFFF useg StatusERL = 1, Unmapped at´e suseg Mapped Mapped 0x0000 0000 kuseg StatusERL = 0, Mapped

Tabela 4.59: Zonas de endere¸camento em fun¸c˜aodo modo de opera¸c˜aodo processador.

No quadro 4.59 ´eposs´ıvel visualizar o comportamento e respectivas ac¸c˜oestomadas pela MMU no processo de valida¸c˜aodos endere¸cosvirtuais e segmentos relativamente aos modos de opera¸c˜ao. Qualquer tentativa de acesso por parte de um modo de execu¸c˜ao com menos privil´egiosa zonas de mem´oriapriviligiadas, levar´aa MMU a gerar uma excep¸c˜aodo tipo Address Error.

No caso particular, em que o processador se encontre a correr em modo Kernel e o StatusERL se encontrar activo, o mapeamento para o segmento USEG ´emodificado de mapeado pela TLB para n˜aomapeado. Esta mudan¸cadeve-se ao facto do processador se encontrar num estado de erro de cache ou arranque do sistema (Reset, Soft Reset ou NMI), no qual as interrup¸c˜oesse encontram desligadas. Desta forma, o processador pode aceder directamente ao conte´udoda mem´oriaf´ısicaRAM.

4.2.2 Pagina¸c˜ao

Com o surgimento da t´ecnicade pagina¸c˜ao,a mem´oriaf´ısicapassou a ser dividia em blo- cos iguais, podendo o seu tamanho variar, mas sempre numa potˆenciade 2. O tamanho das p´aginassuportado ´edefinido exclusivamente pela implementa¸c˜aodo processador, podendo a sua utiliza¸c˜aoser configur´avel pelo sistema operativo. Cada um destes blocos 96 CAP´ITULO 4. MODULOS´

´echamado de p´aginae ´ecomposto por um n´umerode p´aginae um deslocamento. O seu objectivo ´eoferecer aos programadores um espa¸code endere¸camento virtual cont´ıguo, de forma a transferir a preocupa¸c˜aoda gest˜aoda mem´oriapara o sistema operativo. Assim, o sistema operativo poder´agerir os seus recursos internos, p´aginasf´ısicas, de forma transparente ao programa que se encontra em execu¸c˜ao.

Veja-se o seguinte exemplo: um processador no qual cada p´agina possui 4KBytes (212 = 4096 bytes) e o espa¸code endere¸camento com 32bits. Os 12 bits menos significativos indicam o deslocamento e os 20 bits mais significativos indicam uma dada p´aginavirtual dos 220 bits (mais de um milh˜aode p´aginasposs´ıveis).

Na sec¸c˜aoseguinte, veremos a forma como os endere¸cosvirtuais traduzidos pela TLB variam com o tamanho das p´aginasvirtuais. Ser´aigualmente abordado a forma como o sistema operativo influencia o comportamento da tradu¸c˜aodos endere¸cos,uma vez que a tradu¸c˜aodos endere¸cosna TLB ´emecˆanica.

Numa abordagem superficial, cada processo ´ecomposto por uma tabela de p´aginasque reside em mem´oriae cuja manuten¸c˜ao´eexclusiva do sistema operativo. Dos v´arios tipos de organiza¸c˜oesexistentes para tabelas de p´aginasdos processos, ser˜aoutilizados a pagina¸c˜aolinear e multin´ıvel para explanar a influˆenciado sistema operativo na tradu¸c˜ao dos endere¸cosvirtuais em f´ısicos.

Em ambos os casos, o sistema operativo possui uma ou v´ariastabelas de p´aginaspor processo, que ´ecomposta por v´ariosdescritores de cada p´aginaf´ısica,sendo o descritor apelidado de PTE (Page Table Entry). Cada descritor cont´emo endere¸cof´ısico da p´agina(base) e informa¸c˜oesde protec¸c˜aoe estado da p´aginaem causa, nomeadamente os bits P (Present), V (Valid) e D (Dirty), sendo o deslocamento calculado atrav´esdos bits adequados no endere¸co virtual.

Como se pode ver na figura 4.13, quando o processador emite um pedido para a MMU, o seu primeiro passo ´eaceder `aTLB `aprocura do mapeamento para a p´aginaf´ısica. Caso o mapeamento n˜aoexista, ´eatrav´esdo tratador da excep¸c˜ao TLB Refill que o sistema operativo, de acordo com a t´ecnicade pagina¸c˜aoutilizado, aceder´a`atabela de p´aginasdo processo e introduzir´auma nova entrada na TLB. Em seguida, o processador dever´aexecutar novamente a instru¸c˜aogeradora da excep¸c˜aode forma a prosseguir com a execu¸c˜aodo c´odigobin´ario.

Inerente `autiliza¸c˜aoda t´ecnicade pagina¸c˜aosurge um acontecimento conhecido como Page Fault, que ocorre quando uma p´aginaf´ısican˜aose encontra presente na mem´oria RAM. A gest˜aodas p´aginasf´ısicas´eefectuada exclusivamente pelo sistema operativo sendo este processo transparente `apr´opriaarquitectura. Uma vez que a mem´oriaf´ısica tem limite, assim como o espa¸code endere¸camento virtual, existe a necessidade de 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 97

Figura 4.13: Mecanismo de tradu¸c˜aoem sistemas com pagina¸c˜ao.

remover as p´aginasf´ısicasda mem´oriaRAM para uma zona em disco, conhecida como ´areade SWAP, a fim de libertar espa¸co.

Desta forma, o sistema operativo consegue manter em simultˆaneo,teoricamente com espa¸cointermin´avel, as p´aginasf´ısicasutilizadas pelos processos. O evento Page Fault pode surgir quando h´auma tentativa de acesso a uma entrada na TLB, no qual a PFN correspondente contenha o bit V igual 0. Nestes casos, o sistema operativo (atrav´esda excep¸c˜ao TLB Invalid) alocar´aespa¸cona mem´oriae copiar´aa p´aginada ´areade SWAP para o novo espa¸coalocado, actualizando tamb´emo endere¸cona tabela de p´aginasdo processo em execu¸c˜ao.Nos casos em que n˜aoexiste mapeamentos na TLB, o surgimento de um Page Fault ´etratado na excep¸c˜ao TLB Refill.

Por defeito, a arquitectura MIPS32 disponibiliza o registo Context do coprocessador zero, no qual o sistema operativo registar´ao PTB da tabela de p´aginasdo processo em execu¸c˜ao.Este registo ´eactualizado sempre que haja uma mudan¸cade contexto na execu¸c˜aono processador.

Em sistemas que utilizem pagina¸c˜aolinear, o registo Context aponta para o endere¸cobase da ´unicatabela de p´aginasdo processo. Nos casos em que a pagina¸c˜aoseja multin´ıvel, o registo aponta para o endere¸cobase da tabela de p´aginas global. Segue-se uma breve descri¸c˜aodos m´etodos de pagina¸c˜aolinear e multin´ıvel. 98 CAP´ITULO 4. MODULOS´

Linear

Os sistemas operativos que usufruem da t´ecnica de pagina¸c˜aolinear, utilizam uma ´unica tabela de p´aginaspara mapear as p´aginasf´ısicasde cada processo. Pegando no exemplo anterior, com p´aginasde tamanho 4KBytes e sistema de endere¸camento virtual de 32bits, um processo carregado em mem´oriaocupar´a220 * 4 Bytes = 4MBytes.

O seu deslocamento ´ecalculado utilizando os 12 bits menos significativos do endere¸co virtual. Por defeito, o sistema operativo inicia todos os PTE’s com a flag V e P igual a 0, de forma a evitar ocupa¸c˜aode espa¸coe processamento desnecess´ario,uma vez que das 220 p´aginasf´ısicasposs´ıveis de endere¸car,apenas um pequeno conjunto ser´autilizado para programas relativamente pequenos. Segue-se a disposi¸c˜aode um processo com pagina¸c˜aolinear.

DFGE E HE%& #$ %& @4A%B C@AD E)E

789 '() 012#3  !456

!#    'B ' 



4      

 !"

Figura 4.14: Mecanismo de pagina¸c˜aolinear.

Multin´ıvel

Em sistemas que utilizem a t´ecnica de pagina¸c˜aomultin´ıvel, como exemplo o Linux, utilizam-se v´ariastabelas de p´aginaspara mapear as p´aginasf´ısicasde cada processo, existindo assim por processo uma tabela de p´aginasglobal, no qual cada entrada aponta para outra tabela de p´aginas. A quantidade de sub tabelas de p´aginasutilizada varia com o n´ıvel de profundidade, sendo o ´ultimon´ıvel a tabela p´aginasfinal que aponta para a p´aginaf´ısica. 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 99

Pegando novamente no exemplo anterior, assumindo uma pagina¸c˜aomultin´ıvel de pro- fundidade 2, onde os 10 bits mais significativos definem a tabela de p´aginasglobal, os 10 bits interm´ediosa tabela de p´aginasde 2o n´ıvel e os 12 bits menos significativos o deslocamento dentro da p´agina.

Neste modelo pode-se ver que com p´aginasde 4KBytes, apenas ser˜aoalocados em mem´oria210 (1024 bytes) * 4 bytes = 4096 bytes para a tabela de p´aginasglobal. A este tamanho ´enecess´arioadicionar o espa¸coocupado pela tabela de p´aginas de 2o n´ıvel que perfaz 210 (1024 bytes) * 4 bytes = 4096 bytes. Assim, o espa¸comin´ımoocupado por uma p´aginanum sistema com pagina¸c˜aomultin´ıvel e profundidade 2 ´e(1024 + 1024) * 4 = 8 Kbytes.

Como se pode ver existe um ganho significativo tanto no espa¸coocupado pelo o processo em mem´oria,passando de 4 MB para 8 Kbytes, como no tempo para a resolu¸c˜aodo endere¸cof´ısico uma vez que no pior dos casos ser˜aopercorridas 1024 + 1024 entradas = 2048 entradas de 4 Mbytes. Segue-se a disposi¸c˜aode um processo com pagina¸c˜ao multin´ıvel com profundidade 2.

CEFD D GD%& #$ %& @49 @4 @ABC D)D

789  9 D  @4A!   '()  012#3 !456

    @4A!  'H ' 

  4    

 !"

Figura 4.15: Mecanismo de pagina¸c˜aomultin´ıvel. 100 CAP´ITULO 4. MODULOS´

4.2.3 Simula¸c˜aoem Software

A MMU ´eum m´odulode presen¸caobrigat´oriano processador e a sua implementa¸c˜ao encontra-se dentro do ficheiro “Mips32 core.c” e “Mips32 core.h”. A sua defini¸c˜aocon- siste numa estrutura com um apontador para o mecanismo de tradu¸c˜aodefinido no ficheiro “Config.h”, assim como num conjunto de fun¸c˜oesde valida¸c˜ao,tradu¸c˜aode en- dere¸cose acesso `amem´oriaRAM. Segue-se a defini¸c˜aoda estrutura da MMU: typedef struct MMU{ //Mecanismo de Traducao de Enderecos(TLB) MT ∗mt ; } MMU; Listing 4.13: Representa¸c˜aoda MMU em C.

Segue-se a defini¸c˜aodas fun¸c˜oesb´asicaspara o funcionamento da MMU dentro do pro- cessador: /∗ Arquitectura de LOADe STORE ∗ ∗ (MemElem) <− LoadMemory(CCA, AccessLength, pAddr, vAddr, IorD) ∗ (void) <− StoreMemory(CCA, AccessLength, MemElem, pAddr, vAddr) ∗ ∗ CCA − Cacheability and Coherency Attribute ∗ pAddr − Physical Address ∗ vAddr − v i r t u a l Address ∗ IorD − Instruction or Data ∗ LorS − Load or Store ∗ AccessLength − Tamanho da informacao ∗ ∗/ WORD LoadMemory (CPU ∗cpu, BYTE AcessLength , WORD vAddr) ; void StoreMemory (CPU ∗cpu, BYTE AcessLength , WORD vAddr, WORD MemElem) ;

/∗ ∗ Mecanismo de Traducao de Enderecos ∗ Endereco Virtual para Endereco Fisico ∗ ∗ (pAddr, CCA) <− AddressTranslation(vAddr, IorD, LorS) ∗ ∗/ 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 101

WORD AddressTranslation (MT ∗mt, WORD SegValidCode , WORD vAddr ) ;

/∗ Valida Segmentoe Modo de Execucao ∗ ∗ Return Codes: ∗ ∗ 0 − ADDRESS ERROR ∗ 1 − USER MAPPED ∗ 2 − SUPER USER MAPPED ∗ 3 − KERNEL MAPPED ∗ 4 − KERNEL UNMAPPED ∗ 5 − KERNEL UNMAPPED UNCACHED ∗ ∗/ WORD SegmentValidation(WORD vaddr) ; Listing 4.14: Representa¸c˜aodas fun¸c˜oesde valida¸c˜aoe acesso `amem´oriada MMU.

A fun¸c˜ao SegmentValidation ´eutilizada pela MMU para validar os modos de opera¸c˜ao e endere¸cosvirtuais pedidos pelo processador.

No processo de valida¸c˜ao,a MMU confirmar´ao modo de execu¸c˜aodo processador atrav´es dos bits do registo do coprocessador zero StatusKSU, StatusERL e StatusEXL. Em se- guida, de acordo com o mapa dos segmentos referidos no quadro 4.59, a fun¸c˜aoretornar´a um c´odigoidentificativo do segmento em quest˜aoou um c´odigode erro de endere¸camento (Address Error). Nos casos em que o processador se encontre a correr em modo kernel e o StatusERL se encontre activo, para tradu¸c˜oesno USEG, a fun¸c˜aon˜aoretornar´a KERNEL MAPPED mas sim o c´odigocorrespondente a KERNEL UNMAPPED.

A fun¸c˜ao AddressTranslation ´eutilizada, caso a valida¸c˜aodo segmento da mem´oria virtual se confirme, para chamar a fun¸c˜aode tradu¸c˜aorespectiva do mecanismo de tradu¸c˜aode endere¸cosmapeada no ficheiro “Config.h” como se pode ver no excerto de c´odigoseguinte. #ifndef TRANSLATIONTYPE #define TRANSLATIONTYPE

#i f d e f i n e d ( TRANSLATION TLB ) && d e f i n e d ( TRANSLATION FMT ) #error ”Dois mecanismos de traducao seleccionados!” #e n d i f

#i f d e f TRANSLATION TLB //Mecanismo de Traducao MT #define MT TLB 102 CAP´ITULO 4. MODULOS´

//Nome do Mecanismo de Traducao #d e f i n e MTTYPE ”TLB − Translation Lookaside Buffer”

//Mappeamento de Funcoes da TLB com paginacao Linear #define traduz traduz t l b #e n d i f

#i f d e f TRANSLATION FMT //Mecanismo de Traducao MT #define MT FMT

//Nome do Mecanismo de Traducao #d e f i n e MTTYPE ”FMT − Fixed Mapped translation”

//Mappeamento de Funcoes da FMT #define traduz traduz fmt #e n d i f

#endif Listing 4.15: Mapeamento de fun¸c˜oesda MMU.

As fun¸c˜oes LoadMemory e StoreMemory s˜aoutilizadas pelo m´oduloMMU para ace- der `amem´oriaRAM, funcionando como o ponto de entrada e sa´ıdade informa¸c˜aono processador.

Desta forma o processador deve respeitar o formato de mensagem definida pelo simulador atrav´esdo ficheiro “ConnDef.h”, representado pelo bloco de c´odigoabaixo:

typedef struct mem request { //Load or Store WORD LorS ;

//Access Length WORD Access ;

//Physical Address WORD Physical ;

//Virtual Address WORD Virtual ;

//Data for Store WORD Data ; 4.2. UNIDADE DE GESTAO˜ DE MEMORIA´ (MMU) 103

//RAM //Control Flags exclusivo para utilizacao do Simulador WORD Control ;

//Return Code WORD RC; } mem request ; Listing 4.16: Defini¸c˜aodas mensagens entre o CPU e RAM.

Sempre que a MMU necessita enviar informa¸c˜aopara a RAM, ´enecess´ario criar uma estrutura do tipo struct mem_request e preencher com a respectiva informa¸c˜ao,no- meadamente: tipo de acesso (LOAD ou STORE), tamanho da informa¸c˜ao(BYTE, HALFWORD ou WORD)8, endere¸cof´ısicopreviamente calculado e o endere¸co virtual. Caso a opera¸c˜aoseja do tipo STORE o campo “Data” ´epreenchido com o valor que se deseja enviar para a RAM, caso contr´arioeste campo ´eignorado.

Os campos “Control” e “RC” s˜aoexclusivos para utiliza¸c˜aodo simulador como veremos em 4.5. Uma vez criada a mensagem, o processador necessita encaminhar a informa¸c˜ao para os canais correctos, respectivamente: Tx (Transmissor) e Rx (Receptor). Como vimos na estrutura do processador em2, estas vari´aveis guardam o valor dos descri- tores dos canais estabelecidos previamente pelo simulador, passados como argumento na inicializa¸c˜aodo processador. Desta forma, a cada pedido de LOAD ou STORE o processador envia a estrutura para o canal Tx e aguarda resposta da RAM, lendo a informa¸c˜ao,retornada no mesmo formato, pelo canal Rx.

A raz˜aopelo qual os descritores s˜aopassados do simulador para o processador, deve-se ao facto de existirem v´ariasformas de comunica¸c˜aopor descritores em Linux, mormente: Named Pipes, Unnamed Pipes, Pseudo Terminals ou Network Sockets. Assim, de forma a simplificar a implementa¸c˜aodo simulador, optou-se por atribuir as responsabilidades de escolha e manuten¸c˜aodos formatos de comunica¸c˜aoao simulador. A defini¸c˜aodos canais, assim como os protocolos de comunica¸c˜aosuportados, ser˜aoabordados em detalhe na sec¸c˜ao 4.5.

Todas as instru¸c˜oesdefinidas na ISA para acesso `amem´oriaRAM, como LW, LH, LB, SW, SH, SB, entre outras, utilizam estas duas fun¸c˜oespara enviar informa¸c˜aopara os canais de comunica¸c˜ao.Uma vez que o simulador n˜aosuporta a utiliza¸c˜aode cache os atributos desta funcionalidade n˜aoforam inclu´ıdosnas fun¸c˜oes LoadMemory e StoreMe- mory.

8BYTE = 1 byte, HALFWORD = 2 bytes, WORD = 4 bytes, DWORD = 8 bytes. 104 CAP´ITULO 4. MODULOS´

4.3 Mecanismo de Tradu¸c˜aode Endere¸cos(TLB)

Como visto anteriormente, a mem´oriavirtual encontra-se segmentada em cinco ´areas com diferentes tamanhos e permiss˜oesde acesso. Algumas destas ´areass˜aodesignadas de mapeadas, e necessitam que um mecanismo fis´ıcotraduza os endere¸cosvirtuais para endere¸cosf´ısicos.

Estes mecanismos s˜aoextremamente importantes para a performance do sistema, uma vez que funcionam como uma cache no processador, que guarda temporariamente um conjunto de pares de p´aginasvirtuais e f´ısicas. Desta forma, h´aum ganho significativo no tempo de tradu¸c˜aodos endere¸cosuma vez que o processador conhece os endere¸cos f´ısicos onde quer chegar e n˜aonecessita de aceder `atabela de p´aginasem mem´oria, mantida pelo sistema operativo, para encontrar o endere¸cof´ısicoque deseja aceder. Por norma a sua implementa¸c˜ao´efeita a n´ıvel de hardware, sendo que as mais conhecidas para a arquitectura MIPS s˜aoa TLB (Translation Lookaside Buffer) e o FMT(Fixed Mapping Translation).

Em sistemas operativos complexos ´eobrigat´orioa utiliza¸c˜aode uma TLB n˜aos´opelo aumento do desempenho, mas tamb´empara facilitar e melhorar a gest˜aoda mem´oria. Por outro lado, em sistemas que n˜aoexijam tamanha complexidade, nomeadamente mi- crocontroladores em sistemas embebidos, ´ecomum a utiliza¸c˜aoda t´ecnicaFMT como mecanismo de tradu¸c˜aode endere¸cosuma vez que o conjunto de recursos ´emuito redu- zido assim como a complexidade da sua gest˜ao.

Neste cap´ıtuloapenas ser˜aoabordados a estrutura e o modo de funcionamento da TLB n˜aoabordando assim a organiza¸c˜aoFMT. O objectivo da TLB ´emanter, numa mem´oriainterna do processador, a tradu¸c˜aodos endere¸cosvirtuais em endere¸cosf´ısicos, de forma a acelerar o processo de tradu¸c˜aode endere¸cos.Desta forma, sempre que o processador tentar traduzir um endere¸co,primeiro consultar´aa sua tabela de endere¸cosinterna e, caso n˜aoexista uma correspondˆencia, gerar´auma excep¸c˜aodo tipo TLB Refill no qual o kernel do sistema operativo dever´a descobrir a que endere¸cof´ısico corresponde o endere¸covirtual pedido, sendo o novo mapeamento introduzido na TLB para futura utiliza¸c˜ao.

Em seguida ser´aapresentada a forma como ´efeita a comunica¸c˜aoentre a MMU e a TLB atrav´esdos registos do coprocessador zero e as instru¸c˜oesexistentes na ISA. 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 105

4.3.1 Interface de comunica¸c˜aoMMU/TLB

O mecanismo de tradu¸c˜aode endere¸cosTLB reside dentro do chip do processador, sendo a interface de comunica¸c˜aoentre os dois componentes feita atrav´esde um conjunto de registos do coprocessador zero e um subconjunto de instru¸c˜oes definidas na ISA da arquitectura.

Os registos de comunica¸c˜ao9 base utilizados pela TLB s˜ao: EntryHi, EntryLo0, En- tryLo1, Wired, Index, Random, Context, ContextConfig e Pagemask.

CP0 Registo 0, Select 0 (Index)

O registo Index guarda o ´ındiceda TLB que ser´autilizado pelas instru¸c˜oesTLBWI, TLBR e TLBP. O acesso e a modifica¸c˜aodo valor do ´ındice´epermitida por software dependendo do valor dos bits StatusCU. Para a instru¸c˜aoTLBP, sempre que ocorra uma correspondˆenciao bit 31 (P) ´eescrito por hardware com o valor 0, caso n˜aoexista correspondˆenciao hardware escrever´ao valor 1.

31 30 n n-1 0 P 0 Index

Tabela 4.60: Registo interno Index.

CP0 Registo 1, Select 0 (Random)

O registo Random gera um valor aleat´orioe guarda-o nos primeiros n bits, sendo n o tamanho da TLB. Na realidade a gera¸c˜aodo valor aleat´orio´ebasicamente um contador que est´asempre a correr e ´eutilizado pela instru¸c˜aoTLBWR. Para os primeiros n bits o software detem permiss˜oespara escrita e leitura.

31 n n-1 0 0 Random

Tabela 4.61: Registo interno Random.

9Existem outros registos do coprocessador zero que s˜ao utilizados em configura¸c˜oesmais complexas da TLB, como exemplo duas TLBs a funcionar em conjunto. Estas t´ecnicasn˜aos˜aoabordadas neste documento. 106 CAP´ITULO 4. MODULOS´

CP0 Registo 2 e 3, Select 0 (EntryLo0 e EntryLo1)

Este par de registos cont´ema informa¸c˜aoreferente `alocaliza¸c˜aodas p´aginasf´ısicasna mem´oriaRAM. O registo EntryLo0 guarda as p´aginas pares (even) e o registo EntryLo1 guarda as p´aginas ´ımpares(odd).

31 30 29 6 5 3 2 1 0 Fill PFN C D V G

Tabela 4.62: Registo interno EntryLo0 e EntryLo1.

Campo Descri¸c˜ao Fill Retorna sempre zeros em leitura. Page Frame Number (PFN) Corresponde ao n´umerode p´aginana mem´oriaRAM. Cacheability and Coherency Estes dois bits identificam se a p´aginaencontra-se num Attribute (C) segmento que utiliza a cache no processador. O bit “Dirty” serve para identificar se ´eposs´ıvel escrever Dirty (D) na p´agina.Se o bit estiver a 1 ´eposs´ıvel escrever na na p´agina,caso o bit estiver a 0, processador gerar´a uma excep¸c˜ao“TLB Modified Exception”. Este bit indica se a TLB Entry e a sua respectiva p´agina Valid (V) na mem´orias˜aovalidas. Se o bit for 1 ent˜aoa p´agina´e v´alida,caso contr´arioo sistema ir´agerar uma excep¸c˜ao “TLB Invalid Exception”. Global (G) Se este bit estiver activo todas as compara¸c˜oescom os bits ASID s˜aoignoradas.

Tabela 4.63: Especifica¸c˜aodos bits do registo EntryLo0 e 1.

CP0 Registo 4, Select 0 (Context)

Este registo ´emuito importante em sistemas que utilizem v´ariosprocessos, uma vez que ´eatrav´esdeste mecanismo que se ir´aidentificar o “contexto” ou a tabela de p´aginasdo processo em execu¸c˜ao.

O seu funcionamento ´econdicionado pelo o estado do bit ContextCTXTC que identifica se o registo do coprocessador central (CP0 Registo 4, Select 1) ContextConfig se encontra implementado no processador, sendo este opcional para a arquitectura MIPS32. Assim, se o bit ContextCTXTC se encontrar desligado, valor por defeito, o funcionamento do registo ter´aa seguinte representa¸c˜ao: 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 107

31 23 22 4 3 0 PTE Base BadVPN2 0

Tabela 4.64: Registo interno Context.

Neste modelo, sempre que ocorre uma excep¸c˜aodo tipo TLB Refill, TLB Invalid ou TLB Modified o processador introduzir´aos bits VA 31..13 no campo BadVPN2 do registo Context. O valor do campo PTE (Page Table Entry) ser´apreenchido pelo o sistema operativo com um apontador para um array de PTE’s do processo actual10. Uma vez que os quatro bits menos significativos do registo Context s˜aozero, o registo aponta para uma estrutura em mem´oria(PTE) com tamanho 16 Bytes.

O tamanho e o formato das estruturas PTE s˜aodefinidos pelos sistemas operativos. Na sec¸c˜ao 4.2.2 viu-se que em sistemas com pagina¸c˜aolinear, uma tabela de p´aginasocupa 4 MBytes e em sistemas com pagina¸c˜aomultin´ıvel ocuparia 4 KBytes, isto para estruturas PTE com tamanho 8 Bytes. Em sistemas no qual a estrutura PTE possua um tamanho 16 bytes, a tabela de p´aginasocupar´aquatro vezes o tamanho anterior, 16 MBytes e 16 KBytes, respectivamente.

Pelo facto do registo Context apontar directamente para uma estrutura de 16 Bytes n˜aoimplica que os sistemas operativos sejam obrigados a utilizar este formato. Um procedimento comum ´ea aplica¸c˜aode m´ascarase shifts ao registo Context de forma a criar apontadores para o tamanho do PTE desejado.

Se o bit ContextCTXTC se encontrar activo, o registo Context pode apontar para qual- quer estrutura PTE na mem´oriacujo o endere¸cose encontre alinhado a uma potˆencia de base dois. Dependendo da configura¸c˜aodo registo ContextConfig, ´eposs´ıvel apontar para uma estrutura PTE mais pequena, 8 bytes, numa tabela de p´aginas linear ou tabela de p´aginasglobal em ambientes com pagina¸c˜aomultin´ıvel.

CP0 Registo 5, Select 0 (Pagemask)

Este registo ´eutilizado pela TLB para identificar o tamanho das p´aginas,f´ısicase vir- tuais. O seu conte´udopode ser modificado tanto por hardware como por software.A arquitectura MIPS suporta a utiliza¸c˜aode p´aginas com v´ariostamanhos sendo que o mais comum seja p´aginascom tamanhos de 1KB (1024 bytes) e 4KB (4096 bytes).

10Em sistemas Linux o respons´avel por esta opera¸c˜ao´eo processo scheduler. 108 CAP´ITULO 4. MODULOS´

31 29 28 13 12 11 10 0 0 Mask MaskX 0

Tabela 4.65: Registo interno Pagemask.

A codifica¸c˜aodos campos encontram-se no quadro abaixo.

Tamanho Bits 28..13 Bits 12..11 das p´aginas da m´ascara da m´ascara 1 KByte 0x0 0x0 4 KByte 0x0 0x3 16 KByte 0x3 0x3 64 KByte 0xF 0x3 256 KByte 0x3F 0x3 1 MByte 0xFF 0x3 4 MByte 0x3FF 0x3 16 MByte 0xFFF 0x3 64 MByte 0x3FFF 0x3 256 MByte 0xFFFF 0x3

Tabela 4.66: Codifica¸c˜aodo tamanho das p´aginas.

CP0 Registo 6, Select 0 (Wired)

Este registo tem como fun¸c˜aoguardar o n´umerode entradas na TLB que s˜aoconsideradas fixas, n˜aopodendo ser alteradas. O registo pode ser lido e escrito o que permite que o sistema operativo modifique o n´umerode entradas fixas conforme a sua necessidade. Esta ´euma t´ecnicautilizada pelo sistema operativo para poder manter sempre em mem´oria as p´aginasmais requisitadas ou mapeamentos permanentes.

31 n n-1 0 0 Wired

Tabela 4.67: Registo interno Wired.

CP0 Registo 10, Select 0 (EntryHi)

Este registo cont´ema informa¸c˜aorelativa ao n´umeroda p´aginavirtual (VPN2) e ao seu respectivo ASID. As instru¸c˜oesTLBR, TLBP, TLBWR e TLBWI lˆeem sempre este registo para pesquisar ou inserir entradas novas na TLB. O campo VPN2X s´o´eutilizado caso o sistema dˆesuporte a p´aginasde 1K, caso contrario este campo retorna sempre 0. 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 109

A implementa¸c˜aodo campo ASID (Address Space Identifier) n˜ao´eobrigat´oriomas obvi- amente desej´avel. Em sistemas que utilizem v´ariosprocessos e cuja mudan¸cade contexto seja uma grande necessidade, o que para um sistema operativo minimamente complexo ´emuito alta, a sua utiliza¸c˜ao´eimportante para aumentar o n´ıvel de desempenho.

31 13 12 11 10 8 7 0 VPN2 VPN2X 0 ASID

Tabela 4.68: Registo interno EntryHi.

Para informa¸c˜oesmais detalhadas dos registos do coprocessador zero ver [MT10c].

4.3.2 Instru¸c˜oesde controlo MMU/TLB

O subconjunto de instru¸c˜oesexistentes na ISA MIPS32r2 para comunica¸c˜aoentre a MMU e a TLB s˜ao: TLBWI (TLB Write Index), TLBWR (TLB Write Random), TLBR (TLB Read) e TLBP (TLB Probe). Por si s´oestas instru¸c˜oesn˜aos˜aoo suficiente para escrever v´ariosvalores de 32 bits numa estrutura como a TLB. Desta forma, a arquitectura MIPS32 definiu que estas instru¸c˜oesteriam argumentos fixos sendo o seu valor vari´avel, de forma que atrav´esdos registos do coprocessador zero acima citados, seja feita a interface entre o programador e a estrutura TLB.

As instru¸c˜oesTLBWR e TLBWI tˆemcomo objectivo introduzir uma nova entrada na estrutura que representa a TLB, sendo que a primeira gera um ´ındicealeatoriamente e a segunda utiliza como ´ındiceo valor definido no registo Index.

A instru¸c˜aoTLBP ´eutilizada para verificar se existe uma correspondˆenciada p´agina virtual (VPN) e do espa¸code endere¸camento ASID no registo EntryHi com os valores existentes na TLB. Nos casos em que exista uma correspondˆenciacom a p´aginavirtual mas o bit (G) Global das p´aginasf´ısicasse encontre activo numa chave da TLB, significa que os bits identificadores do ASID ser˜aoignorados na compara¸c˜aoe a instru¸c˜aoTLBP retornar´averdade para correspondˆencia. Por ´ultimotemos a instru¸c˜aoTLBR que em oposi¸c˜ao`asinstru¸c˜oesde escrita, lˆepara os registos EntryLo0 e EntryLo1 os valores correspondentes `ap´aginavirtual existente no registo EntryHi do coprocessador zero.

Das quatro instru¸c˜oesdescritas, a instru¸c˜aoTLBR ´ea que tem menos utiliza¸c˜aoem sistemas que utilizem “TLB Flush” em vez de ASID’s, uma vez que o sistema opera- tivo introduz entradas na TLB at´ehaver uma mudan¸cade contexto. Em sistemas que utilizem ASID, a sua utiliza¸c˜aoj´a´emais importante pois o processo escalonamento ne- cessita de obter informa¸c˜aorelativa ao estado da TLB para gerir a forma como ser˜ao disponibilizados e atribu´ıdosos ASID’s aos novos processos. 110 CAP´ITULO 4. MODULOS´

4.3.3 TLB Flush vs ASID’s

A forma como o sistema operativo controla a TLB ´eum aspecto fundamental para a seguran¸cae o bom funcionamento de todo o sistema. Sempre que a execu¸c˜aode um processo ´etransferida para outro processo, acontece uma mudan¸cade contexto que deve ser actualizada na TLB para que o novo processo possa aceder correctamente `asua informa¸c˜aoe n˜ao`ainforma¸c˜aodo processo anterior.

J´ase sabe que a TLB guarda um conjunto de entradas, sendo cada entrada constitu´ıda por uma VPN, ASID, Pagemask, um par de FPN e seu conjunto de bits relativo ao seu estado. Esta informa¸c˜aoque se encontra na TLB deve ser limpa ou filtrada quando h´a uma mudan¸cade contexto de modo a que um processo n˜aoaceda intencionalmente ou n˜aointencionalmente a zonas de mem´oriade outros processos, o que tornaria todo o sistema inst´avel. Imagine-se um sistema com dois processos a correr e havendo v´arias vezes mudan¸casde contexto.

VPN PFN V´alida Permiss˜ao 0 20 1 r-x - - 0 - 0 43 1 r-x - - 0 -

Tabela 4.69: Exemplo de mapeamento de p´aginasvirtuais para f´ısicas.

Como se pode ver no quadro 4.69 o sistema n˜aoiria funcionar correctamente pois as tradu¸c˜oes para a p´aginavirtual zero dos dois processos carregados na TLB apontam para p´aginasf´ısicasdiferentes, conforme o processo. Tal situa¸c˜ao,iria fazer com que ambos os processos acedessem `ap´aginaf´ısica20, levando a um estado de erro.

Devido a esta situa¸c˜ao,os sistemas operativos criaram v´ariast´ecnicaspara melhorar a gest˜aoda mem´oriae ultrapassar este tipo de problemas, umas mais elaboradas que outras, sendo as mais conhecidas a “TLB Flush on context switch” e a utiliza¸c˜aode ASID - “Address Space Identifier” para identifica¸c˜aode zonas de mem´oriados processos na TLB. Alerta-se para o facto que toda a gest˜aoda mem´oria´efeita pelo sistema operativo e n˜aopela arquitectura do sistema.

Uma forma bastante simples utilizada pelos sistemas operativos para gerir a mudan¸ca de contexto ´elimpando todo o conte´udoda TLB, tamb´emconhecido por “TLB Flush”, assegurando assim que n˜aoexistem entradas inv´alidasna TLB para aquele processo. E´ f´acilde compreender que em todos os processos existe uma queda de desempenho quando come¸cama sua execu¸c˜ao,pois ´enecess´ariogerar uma quantidade de TLB Refill’s at´e 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 111 que existam referˆencias v´alidasna TLB para o processo poder executar fluentemente. Se um sistema se encontrar num estado em que dois processos estejam sempre a comutar a sua execu¸c˜ao,a descida de desempenho ´enot´avel.

Para sistemas que utilizem ASID’s a gest˜ao´eum pouco mais complexa mas, em con- trapartida h´aum aumento consider´avel no desempenho de todo o sistema. O sistema operativo ´erespons´avel por atribuir a cada processo um ASID ´unico,que identificar´ao seu espa¸code endere¸camento. Assim ´eposs´ıvel ter mapeados na TLB v´ariosprocessos ao mesmo tempo sem que haja a necessidade de se fazer um “TLB Flush”.

Nos casos em que haja uma mudan¸cade contexto a probabilidade de o processo novo reutilizar as suas ´ultimasentradas ´ebastante elevado o que por si s´o´eum aumento no desempenho relativamente ao mecanismo “TLB Flush on context switch”. Uma vez que o registo EntryHi da arquitectura MIPS apenas reserva 8 bits para o campo ASID o que acontece quando os ASID’s est˜aotodos atribu´ıdos?

0))1234 $ 567&9@ABCD&EF& GH  $    

   " ()    ) ! !   "  ! # % % $ % %

&' 

Figura 4.16: Escalonamento de processos com ASID.

Como se pode verificar na figura 4.16 o n´umerom´aximode ASID’s esgotar-se-´amais rapidamente que o n´umerode PID’s (Process Identifier) uma vez que s´otemos 8 bits 112 CAP´ITULO 4. MODULOS´ para os ASID’s o que nos d´aum total de 256 ASID’s diferentes na TLB. Nestes casos o sistema operativo tem a obriga¸c˜aode confiscar um ASID’s atribu´ıdoa um processo e atribu´ı-loao novo processo. A forma como ´eescolhido o processo que ter´aos seus mapeamentos removidos depende exclusivamente dos algoritmos utilizados pelo sistema operativo para gerir a mem´oria,sendo os mais conhecidos: FIFO (First In First Out), LIFO (Last In First Out), LRU (Least Recently Used) e Random.

Outro aspecto importante a referir ´ea partilha de p´aginasf´ısicasentre processos. Inde- pendentemente da t´ecnicautilizada para gerir as entradas na TLB, os processos podem manter mapeamentos de p´aginasvirtuais diferentes para a mesma p´agina f´ısicamas o contr´arioj´an˜ao´everdade como se pode ver no quadro 4.70.

VPN PFN V´alida Permiss˜ao Processo 15 66 1 r-x 1 - - 0 - - 24 66 1 r-x 2 - - 0 - - 16 100 1 r-x 1

Tabela 4.70: Exemplo de mapeamentos com p´aginasf´ısicaspartilhadas.

No quadro 4.70 pode-se observar que existem dois processos com VPN’s diferentes que apontam para a mesma PFN, respectivamente o processo 1 cont´emuma p´aginavirtual 15 que aponta para a p´agina f´ısica66, assim como o processo 2 cont´emuma p´agina virtual 24 que aponta para a mesma p´aginaf´ısica. Esta situa¸c˜ao´ev´alidaem sistemas operativos que permitam a partilha de mem´oriaentre processos. Em sistemas Unix existe um conjunto de t´ecnicasapelidadas de IPC (Inter-Process Comunication) que permitem n˜aos´oa comunica¸c˜aoentre processos mas tamb´em a partilha de zonas de mem´oriaassim como a partilha de c´odigobin´arioem Shared library’s. A arquitectura MIPS32 permite a utiliza¸c˜aodas duas t´ecnicaspara a gest˜aoda mem´oria,mas pese o facto que nem todas as arquitecturas permitem a utiliza¸c˜aode ASID’s.

4.3.4 Excep¸c˜oesda TLB

A arquitectura MIPS32 disp˜oede v´ariostipos de excep¸c˜oescriadas com o intuito de interromper o fluxo de execu¸c˜aoe permitir ao sistema correr c´odigobin´ariode forma a resolver problemas ou estados de erro. Deste conjunto de excep¸c˜oesforam criados cinco tipos espec´ıficospara controlar o conte´udoe funcionamento da TLB.

Na sec¸c˜ao 4.3.2 observou-se a forma como o programador pode controlar directamente 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 113 o conte´udoda TLB atrav´esdas instru¸c˜oesdisponibilizadas na ISA. Nesta sec¸c˜aoser˜ao abordados os mecanismos criados pela arquitectura para permitir ao sistema operativo gerir a TLB de forma coerente. Como visto anteriormente, a TLB possui uma tabela com mapeamentos de endere¸cosvirtuais para f´ısicos, utilizada pelo processador para aceder `amem´oria.Assim, surge uma importante quest˜ao:

O que acontece quando o processador tenta aceder a um endere¸covirtual que n˜aose encontra mapeado na TLB?

Por defeito, quando o processador necessita aceder a um endere¸covirtual, ele acede `a MMU que, ap´osvalidar o segmento encaminha para a TLB, caso perten¸caao USEG ou KSEG3. Nestas situa¸c˜oes,a p´aginavirtual associada ao endere¸covirtual ´eprocurada nas entradas da TLB e caso n˜aoexista nenhum mapeamento, o processador lan¸car´auma excep¸c˜aoque suspender´ao fluxo de execu¸c˜ao,alterando o seu PC para um endere¸copr´e- calculado com a finalidade de resolver o endere¸copedido. E´ de notar que h´auma quebra no desempenho do sistema, uma vez que ´enecess´arioefectuar v´ariosacessos `amem´oria at´eque seja poss´ıvel encontrar o respectivo mapeamento.

Assim que o mapeamento ´edescoberto pelo processador, este ´eadicionado na tabela interna da TLB de forma a permitir que futuros acessos, a curto prazo, sejam efectuados com rapidez. A interrup¸c˜aodo fluxo de execu¸c˜aoque falamos acima ´econhecida como TLB Refill e ocorre exactamente quando n˜aoexistem mapeamentos na TLB que per- mitam resolver endere¸cosvirtuais em f´ısicos. O seu funcionamento difere das restantes excep¸c˜oes,dado que pode gerar dois c´odigosde excep¸c˜aoe n˜aoapenas um, respectiva- mente a TLBL ou TLBS.

Independentemente do c´odigode excep¸c˜aoatribu´ıdo, o valor ´eescrito no registo do coprocessador zero StatusExcCode. O primeiro caso ocorre se a instru¸c˜aogeradora da excep¸c˜aofor do tipo LOAD ou uma instruction fetch no processador, sendo a segunda situa¸c˜aon˜aovis´ıvel em contexto de simula¸c˜ao.No segundo caso, o processador encontra- se a executar uma instru¸c˜aodo tipo STORE. Em ambas as situa¸c˜oes,o processador ´e respons´avel por guardar um conjunto de informa¸c˜aorelativa ao seu estado na altura em que ocorre a excep¸c˜aode forma a retomar o seu tratamento. No quadro 4.71 encontram- se os registos do coprocessador zero guardados no momento da excep¸c˜ao.

O tratamento da excep¸c˜ao TLB Refill cont´emum comportamento particular dado que os seus pontos de entrada dependem exclusivamente dos bits StatusBEV e StatusEXL. O primeiro bit indica o estado em que se encontra o processador, nomeadamente se ainda se encontra na fase de arranque (Bootstrap) ou n˜ao. O segundo bit indica se o processador se encontra actualmente a tratar uma excep¸c˜aodado que iremos lan¸caruma nova excep¸c˜aocriando assim uma excep¸c˜aoaninhada ou Nested Exception. 114 CAP´ITULO 4. MODULOS´

Registo Estado do Registo BadVAddr Endere¸co virtual que n˜aotem mapeamento Se Config3CTXTC = 0, ent˜ao ContextBadVPN2 = VA31..13; Context Se Config3CTXTC = 1, ent˜ao´eaplicada a m´ascara Con- textConfigVirtualIndex com o registo Context. EntryHi Guarda o valor do VPN2 e o ASID do endere¸covirtual EntryLo0 Imprevis´ıvel EntryLo1 Imprevis´ıvel

Tabela 4.71: Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Refill.

Nestes casos em particular, ´enecess´arioque existam cuidados adicionais por parte dos programadores devido ao retorno das excep¸c˜oes.

No quadro 4.72 pode-se ver os pontos de entrada para a excep¸c˜ao TLB Refill conforme a configura¸c˜aodos bits controladores.

Excep¸c˜ao StatusBEV StatusEXL Ponto de Entrada TLB Refill Vector 0 0 0x8000.0000 TLB Refill, General Vector 0 1 0x8000.0180 TLB Refill Vector 1 0 0xBFC0.0200 TLB Refill, General Vector 1 1 0xBFC0.0380

Tabela 4.72: Pontos de entrada para a excep¸c˜aoTLB Refill.

Como se pode ver, quando o StatusBEV se encontra activo todos os endere¸coss˜ao redireccionados para a zona alta do segmento KSEG1 que ´euma zona n˜aomapeada e que n˜aoutiliza cache. Neste estado o processador ainda se encontra em fase de arranque e os tratadores da excep¸c˜aoencontram-se mapeados na ROM da placa board. Quando o valor do StatusBEV ´eigual a zero o sistema encontra-se pronto para correr c´odigodo sistema operativo. Como podemos ver, os endere¸costˆemcomo base o in´ıciodo segmento KSEG0 que ´euma zona n˜aomapeada mas que utiliza cache.

O bit StatusEXL influˆenciao valor do deslocamento no ponto de entrada em 0x180 no qual o tratamento da excep¸c˜aopode mudar. Isto acontece, porque o TLB Refill ´e uma excep¸c˜aoque pode ocorrer dentro de outra excep¸c˜ao,no qual o sistema operativo deve ter em considera¸c˜aoalguns aspectos como salvaguardar manualmente os registos do coprocessador zero e executar o c´odigode resolu¸c˜aode mapeamentos de p´aginas.

Caso o bit StatusEXL seja 0 o deslocamento ´e0x0 e ´econsiderado uma excep¸c˜aodo tipo TLB Refill. Mas, caso o bit StatusEXL seja 1 o deslocamento passa a ser 0x180 passando 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 115 a ser tratada como uma General Exception. A grande diferen¸caconsiste no facto de o c´odigobin´ariodo vector TLB Refill correr directamente, enquanto que no caso em que passa pelo vector geral de excep¸c˜oes TLB Refill, General Vector ser´atratada com as restantes excep¸c˜oesexistentes. Assim, ´enecess´arioefectuar v´ariascompara¸c˜oesat´ese encontrar o tratador adequado para a excep¸c˜ao TLB Refill o que torna a resolu¸c˜aoum pouco mais lenta, comparativamente com a primeira forma.

A excep¸c˜ao TLB Modified ocorre apenas em situa¸c˜oesem o processador efectua uma opera¸c˜aodo tipo STORE, no qual exista uma correspondˆenciana TLB e contenha o bit D (Dirty) da p´aginaf´ısicaactivo. Nestes casos, o facto de o bit D da p´aginaf´ısica se encontrar activo, significa que a p´aginaf´ısica foi modificada ou se encontra a ser modificada por outro programa e n˜aopossui permiss˜aopara escrita.

Da mesma forma que acontece com o TLB Refill, ´enecess´ariosalvaguardar os mesmos estados do processador, nomeadamente:

Registo Estado do Registo BadVAddr Endere¸co virtual que n˜aotem mapeamento Se Config3CTXTC = 0, ent˜ao ContextBadVPN2 = VA31..13; Context Se Config3CTXTC = 1, ent˜ao´eaplicada a m´ascara Con- textConfigVirtualIndex com o registo Context. EntryHi Guarda o valor do VPN2 e o ASID do endere¸covirtual EntryLo0 Imprevis´ıvel EntryLo1 Imprevis´ıvel

Tabela 4.73: Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Modified.

Em oposi¸c˜aodo que acontece com a TLB Refill, a TLB Modified apenas cont´em um c´odigode excep¸c˜aoMod que ´eactualizado no registo StatusExcCode. O ponto de entrada do seu tratamento utiliza o deslocamento 0x180, o que significa que ir´apartilhar o mesmo tratador que todas as excep¸c˜oesque passam pelo General Exception Vector, `asemelhan¸ca do que acontece com o TLB Refill (General Vector).

A excep¸c˜ao TLB Invalid ocorre quando existe uma tentativa de acesso a uma p´agina f´ısicapelo processador, cuja correspondˆenciana TLB exista e contenha o bit V (Valid) desactivado. Nos casos em que n˜aoexista mapeamento na TLB e o StatusEXL esteja activo (caso TLB Refill com General Exception Vector) n˜ao´eposs´ıvel distinguir os dois tipos de excep¸c˜oesuma vez que ambos geram os c´odigosTLBS e TLBL no registo StatusExcCode. A ´unica forma de poder identificar inequivocamente o tipo de excep¸c˜ao ´eatrav´esda instru¸c˜aoTLBP, que validar´ase houve uma correspondˆenciaou n˜aona 116 CAP´ITULO 4. MODULOS´

TLB. Caso tenha ocorrido uma correspondˆenciana TLB, ent˜aofoi gerada uma TLB Invalid. Caso contr´arioocorreu uma TLB Refill. Como acontece nas restantes excep¸c˜oes da TLB, ´enecess´ariosalvaguardar os seguintes estados do processador como demonstra a tabela 4.74. Registo Estado do Registo BadVAddr Endere¸co virtual que n˜aotem mapeamento Se Config3CTXTC = 0, ent˜ao ContextBadVPN2 = VA31..13; Context Se Config3CTXTC = 1, ent˜ao´eaplicada a m´ascara Con- textConfigVirtualIndex com o registo Context. EntryHi Guarda o valor do VPN2 e o ASID do endere¸covirtual EntryLo0 Imprevis´ıvel EntryLo1 Imprevis´ıvel

Tabela 4.74: Registos do coprocessador zero salvaguardados quando ocorre a excep¸c˜ao TLB Invalid.

Da mesma forma que acontece com a TLB Modified, o ponto de entrada do processador ´eo 0x180 e a excep¸c˜ao´etratada utilizando o General Exception Vector.

Al´emdas excep¸c˜oesacima abordadas existem mais duas Execute-Inhibit Exception e Read-Inhibit Exception, cuja utiliza¸c˜aodepende da implementa¸c˜aodo registo do co- processador zero PageGrain. Dado que a sua implementa¸c˜ao´eobrigat´oriaapenas em sistemas que suportem p´aginascom tamanho 1k (1024 bytes) e uma vez que o “Simula- dorUE” n˜aosuporta esta funcionalidade, essas excep¸c˜oesn˜aoforam implementadas.

4.3.5 Simula¸c˜aoem Software

A TLB ´eum componente de car´actern˜aoobrigat´orio,sendo poss´ıvel a sua anexa¸c˜ao `aMMU no processador. Este encontra-se implementado como um m´oduloexterno ao processador que funciona como um reposit´oriode mapeamentos.

A sua estrutura consiste num array de estruturas do tipo struct TLB Entry que guarda um mapeamento de mem´oriareferente aos registos do coprocessador zero EntryHi, En- tryLo0 e 1, Pagemask e Wired. N˜aoexiste uma ´unicaforma de implementa¸c˜aopara a TLB uma vez que existem outros tipos de disposi¸c˜oes e implementa¸c˜oesposs´ıveis para a TLB como o array simples, duplo, suportando ou n˜aop´aginasde 1 KB de tamanho por exemplo. No presente trabalho apenas ser´aabordado o modelo de TLB com um array simples sem suporte para p´aginasde tamanho 1 KB.

Uma vez que o sistema foi pensado para ser modularizado, o desenvolvimento de novos 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 117 formatos de implementa¸c˜aopara a TLB podem ser anexadas no processador. Para tal ´e necess´ariorespeitar algumas regras de comunica¸c˜ao,nomeadamente as assinaturas dos m´etodos que se encontram mapeadas no ficheiro “Config.h” do c´odigofonte.

#i f d e f TRANSLATION TLB //Mecanismo de Traducao(MT) //Nome generico paraa estrutura #define MT TLB

//Nome do Mecanismo de Traducao #define MTTYPE ”Translation Lookaside Buffer (TLB)”

//Mapeamento de Funcoes da TLB #define traduz procura endereco

#define tlbp imp probe for match #define tlbwi imp w r i t e i n d e x e d e n t r y #define tlbwr imp write random entry #define tlbr imp r e a d i n d e x e d e n t r y

#d e f i n e m t i n i t i n i t t l b #d e f i n e mt print p r i n t t l b #d e f i n e mt flush f l u s h t l b

#e n d i f Listing 4.17: Mapeamento de fun¸c˜oesda TLB.

No bloco de c´odigoacima pode-se observar os mapeamentos para a TLB que se encon- tram no ficheiro “Config.h”. A` semelhan¸cado que acontece com o processador, o meca- nismo de tradu¸c˜aode endere¸costamb´emdeve ser representado por um nome gen´erico, sendo este mapeado para uma implementa¸c˜aoconcreta, permitindo assim a adi¸c˜aoe mo- difica¸c˜aode novos formatos. Para a implementa¸c˜aoda TLB com array simples definiu-se a seguinte estrutura:

typedef struct TLB{ //Array de entradas na TLB TLB Entry ∗ array [ TLB SIZE];

} TLB;

typedef struct TLB Entry{ /∗ D e f i n i r sea entradae hardwired ∗ ∗ 0 − Not Wired 118 CAP´ITULO 4. MODULOS´

∗ 1 − Wired ∗/ BYTE wired ;

//Virtual Page Numbere ASID WORD entryHi ;

//Physical Page Numbere Flags WORD entryLo0 ; WORD entryLo1 ;

//Pagemask WORD pagemask ; } TLB Entry ; Listing 4.18: Defini¸c˜aode um mapeamento na TLB.

A estrutura TLB Entry guarda um conjunto de informa¸c˜aorepresentado pelos registos do coprocessador zero e consistem num mapeamento da TLB. Cada ´ındiceda TLB ´e respons´avel por guardar um par de endere¸cosvirtuais e f´ısicos,sendo que cada entrada ´e indexada pelo valor da p´aginavirtual, VPN. Em cada entrada pode-se ver os quatro re- gistos necess´ariospara a comunica¸c˜aoe mapeamento da TLB, nomeadamente: EntryHi, EntryLo0, EntryLo1 e Pagemask. Estas vari´aveis guardam os valores necess´ariospara se obter a resolu¸c˜aode um endere¸covirtual em f´ısicosem necessidade de mecanismos adicionais, independentemente do tamanho de p´agina.

E´ verdade que em cada entrada encontra-se um mapeamento, mas a leitura das vari´aveis por si s´on˜aoretorna o valor do endere¸cof´ısico correspondente. Para tal, ´enecess´ario construir o endere¸coatrav´esda figura 4.17.

Sempre que a MMU solicita uma tradu¸c˜ao`aTLB, a primeira ´erespons´avel por dis- ponibilizar o endere¸covirtual assim como o ASID do processo em execu¸c˜ao,sendo a responsabilidade de manter o ASID do processo no registo EntryHi do coprocessador zero exclusiva do sistema operativo. Assim, o primeiro passo na tradu¸c˜aodos endere¸cos consiste, numa fase inicial, na divis˜aodo endere¸covirtual em duas componentes: p´agina virtual e no respectivo deslocamento. O tamanho utilizado para extrair os bits ne- cess´arios,tanto para a VPN como para o deslocamento variam conforme o tamanho definido no valor da vari´avel do mapeamento Pagemask. Desta forma, ´eposs´ıvel que a TLB mantenha em mem´oriamapeamentos de p´aginascom v´ariostamanhos.

Pegue-se como exemplo a tradu¸c˜aopara uma p´agina de tamanho 4K: os 20 bits mais significativos seriam utilizados para representar a VPN, e os 12 bits menos significativos para representar o deslocamento dentro da p´aginaf´ısicaou virtual. Agora, se o tamanho 4.3. MECANISMO DE TRADUC¸ AO˜ DE ENDEREC¸OS (TLB) 119

"('1I3XY1I1 %2I(7(X1F784 90(9(21(1907XY1 I1FA 9    

AY1 AY1

# !$%

AY1 AY1  !"  9  

9 9 &'(%)(012 &(344 562 718!907 7 !907 `aUabcT Q B'4II7('' FQF784II7('' @A%27B1CD@AE @A%27B1D@AE @46'%27B1CDFGG"E @46'%27B1DFGG"E FAQF7846(A89(7 @AQ B'46(A89(7

RSTUVW FQF4I FC Q (4B2I1 (7(2B78( &'(%)(012 "Q"7B !2H4I Q414 F54I1 !2H54I1

&'(%)(012 @A'PPF' " 1I3(I %2I(7(X1@'1 !24(7ID4(2E 1I3ID"7BE

Figura 4.17: Diagrama de sequˆenciapara a tradu¸c˜aode endere¸cosvirtuais em endere¸cos f´ısicos.

das p´aginasfor de 16K ser˜aoutilizados 18 bits para identificar a VPN e 14 bits para identificar o deslocamento. No quadro 4.75 pode-se observar a forma como os tamanhos da VPN e do deslocamento podem variar em fun¸c˜aodo tamanho das p´aginas.O quadro 4.75 n˜aoinclu´ısuporte para PAE (Physical Address Extension) nem p´aginasf´ısicascom tamanho 1K para a revis˜ao2 da arquitectura MIPS32.

Para cada entrada existente na TLB ser´anecess´arioefectuar o processo de descodifica¸c˜ao do endere¸covirtual, de forma a obter-se os valores para a VPN e o respectivo desloca- mento. Desta forma, a TLB percorrer´aa sua tabela interna `aprocura de ocorrˆencias nas quais os valores da VPN e do ASID correspondam com os valores do mapeamento actual. E´ necess´ariocomparar tanto a VPN como o ASID, uma vez que o processo em execu¸c˜aopode tentar aceder a uma zona de mem´oriade outro processo o que n˜ao pode acontecer. Se a VPN e o ASID do endere¸covirtual corresponderem, significa que o mapeamento existe na TLB e pertence ao nosso processo. 120 CAP´ITULO 4. MODULOS´

Tamanho das P´aginas Bit Par/Impar FPN Desloc. Endere¸coF´ısico 4K Bytes VA12 20 bits 12 bits PA = PFN25..6 || VA11..0 16K Bytes VA14 18 bits 14 bits PA = PFN23..6 || VA13..0 64K Bytes VA16 16 bits 16 bits PA = PFN21..6 || VA15..0 256K Bytes VA18 14 bits 18 bits PA = PFN19..6 || VA17..0 1M Bytes VA20 12 bits 20 bits PA = PFN17..6 || VA19..0 4M Bytes VA22 10 bits 22 bits PA = PFN15..6 || VA21..0 16M Bytes VA24 8 bits 24 bits PA = PFN13..6 || VA23..0 64M Bytes VA26 6 bits 26 bits PA = PFN11..6 || VA25..0 256M Bytes VA28 4 bits 28 bits PA = PFN9...6 || VA27..0

Tabela 4.75: Tabela de gera¸c˜aode endere¸cosf´ısicosem fun¸c˜aodo tamanho de p´agina.

Ao mesmo tempo que ocorre a valida¸c˜aodo ASID, ´eigualmente feita uma compara¸c˜ao com o bit (G) Global das p´aginasf´ısicasdo mapeamento EntryLo0 e 1, PFN. Nos casos em que o bit se encontre activo, a compara¸c˜aocom o ASID ´eignorada uma vez que a p´aginaf´ısica´epartilhada no sistema inteiro. Caso contr´arioa entrada n˜ao´ev´alidapara o processo actual e a TLB passa para o mapeamento seguinte.

O passo seguinte consiste em identificar se o endere¸covirtual aponta para uma p´agina f´ısicapar ou impar, EntryLo0 e EntryLo1 respectivamente, atrav´esdo bit EvenOdd que varia com o tamanho das p´aginas,como verific´amosno quadro acima. Se o bit EvenOdd for zero, ent˜aoa p´aginaf´ısica´epar e ser´autilizado o PFN existente no EntryLo0. Caso contrario, a p´agina´eimpar e ser´autilizado o PFN do EntryLo1 no mapeamento da TLB.

Uma vez identificado o PFN correspondente ao endere¸covirtual ´enecess´ariovalidar duas situa¸c˜oes,respectivamente se a p´agina´ev´alidae se n˜aofoi acedida por outro processo. Na primeira valida¸c˜ao,a TLB verifica o valor do bit (V) Valid de forma a confirmar se o mapeamento existente ´ev´alido.Se o bit estiver activo, os acessos `ap´aginas˜aov´alidos caso contr´arioa TLB lan¸car´aa excep¸c˜ao TLB Invalid. Na segunda verifica¸c˜ao,o valor do bit (D) Dirty indica se a p´aginafoi acedida por outro processo. Se o bit n˜aoestiver activo, a p´aginaencontra-se limpa e pode ser acedida caso contr´arioa TLB lan¸car´aa excep¸c˜ao TLB Modified.

Oficialmente, a TLB verifica ainda o bit (C) Cacheability and Coherency Attribute mas, uma vez que a Cache n˜aose encontra implementada, esta verifica¸c˜aon˜aofoi implemen- tada. Neste estado, a TLB encontra-se pronta para gerar o endere¸cof´ısicocorrespondente ao endere¸covirtual pedido pela MMU. Para tal, ´enecess´ariotruncar os bits extra exis- tentes no PFN encontrado e em seguida aplicar a opera¸c˜aol´ogicaOR com o valor do deslocamento da p´aginavirtual. 4.4. MEMORIAS´ RAM E ROM 121

Veja-se o seguinte exemplo para p´aginasde tamanho 4K: como descrito na tabela 4.75, para p´aginasde tamanho 4K o deslocamento utilizado corresponde aos doze bits me- nos significativos do endere¸covirtual. Relativamente aos 24 bits existentes no PFN dos EntryLo0 e 1 do mapeamento, estes ser˜ao’shiftados’ para a esquerda N bits correspon- dentes ao tamanho das p´aginas,neste caso 12 bits. Em seguida ser´aaplicada a opera¸c˜ao l´ogicaOR entre o PFN ’shiftado’ e o deslocamento, formando assim o endere¸cof´ısico correspondente.

A raz˜aopelo qual os bits do PFN ser˜aotruncados nesta implementa¸c˜aodeve-se ao facto de na arquitectura MIPS existir um s´ımbolo PABITS (Physical Address Bits) que corresponde ao n´umerode bits utilizado para representar o espa¸code endere¸camento f´ısico.Desta forma, ´eposs´ıvel utilizar 24 bits + 12 bits = 36 bits, em paginas de 4 KB, o que perfaz aproximadamente 236 bits = 64 GB em endere¸cosf´ısicos, que ´ebastante superior ao convencional 232 bits, 4 GB.

Esta t´ecnica´econhecida como PAE (Physical Address Extention) e ´eexclusiva para arquitecturas de 32bits. Com a utiliza¸c˜aode PAE, os processadores conseguem utili- zar mais 4 bits na gera¸c˜aode endere¸cosf´ısicos permitindo ao sistema operativo utilizar mem´oriaRAM com tamanhos superiores a 4GB em arquitecturas de 32bits. Por de- feito, os sistemas operativos Linux que correm na arquitectura MIPS32 utilizam o valor do PABITS igual a 32bits. Uma vez que o simulador n˜aosuporta a extens˜aoPAE a implementa¸c˜aodesta t´ecnican˜aoser´aabordada no processo de tradu¸c˜aode endere¸cos.

Ultima´ fase na gera¸c˜aodo endere¸cof´ısico consiste em concatenar numa vari´avel de 32 bits o valor do PFN truncado e o respectivo deslocamento, sendo os 4 bits utilizados pelo PAE ignorados. Ap´osa gera¸c˜aodo endere¸cof´ısico a TLB envia o seu valor para a MMU que prosseguir´acom o fluxo de execu¸c˜aode c´odigobin´ario.Nos casos em que n˜aoexista correspondˆenciaem nenhuma entrada da tabela interna da TLB, ser´alan¸cada a excep¸c˜ao TLB Refill. Neste caso, o sistema operativo ´erespons´avel por encontrar e introduzir um mapeamento novo na TLB.

4.4 Mem´orias RAM e ROM

Como em qualquer sistema, ´enecess´arioa utiliza¸c˜aode uma mem´oriapara armazenar dados e instru¸c˜oespedidas pelo processador. Esta ´ea segunda pe¸ca essencial ao funcio- namento de um sistema, sendo a primeira obviamente o processador, uma vez que todos os dados processados ser˜aoguardados temporariamente na mem´oria.Assim, o segundo passo na implementa¸c˜aodo simulador para a arquitectura MIPS32 ´ea cria¸c˜aode um dispositivo que funcione como uma mem´oriaRAM (Random Access Memory), de forma a criar uma ´areade trabalho para o processador. 122 CAP´ITULO 4. MODULOS´

Actualmente existem v´ariostipos de mem´orias, mas no ˆambito do processo de simula¸c˜ao, apenas ser˜aoabordados dois tipos de mem´oria,nomeadamente: mem´oriaprincipal RAM e mem´oriade leitura ROM (Read Only Memory), para simula¸c˜aodo arranque do sistema, como veremos em seguida.

A mem´oriaRAM tem como fun¸c˜aoprincipal o armazenamento de informa¸c˜ao,no qual est´ainclu´ıdotodo o kernel, assim como toda a informa¸c˜aogerada pelos processos exis- tentes no sistema operativo. Sem a RAM n˜ao´eposs´ıvel correr programas simples, ou complexos como sistemas operativos, uma vez que n˜aoexiste uma ´areacom permiss˜oes de leitura e escrita onde se possa guardar informa¸c˜aorelevante para a execu¸c˜aodos programas. O seu funcionamento consiste em manter internamente informa¸c˜aode forma tempor´ariae responder a todos os pedidos efectuados pelo processador. Qualquer pe- dido emitido pelo processador det´empermiss˜oesde leitura e escrita em qualquer endere¸co existente na sua estrutura interna.

Devido `asua natureza, o conte´udo´econsiderado vol´atiluma vez que toda a informa¸c˜ao existente na mem´oriaser´aperdida assim que o sistema for desligado. Em oposi¸c˜aodo funcionamento da mem´oriaRAM, a ROM possui caracter´ısticasexclusivas de leitura n˜aopermitindo a modifica¸c˜aodo seu c´odigointerno. Em sistemas actuais, esta mem´oria guarda a seguinte informa¸c˜ao:BIOS (Basic Input Output System), POST (Power On Self Test) e configura¸c˜ao.

A BIOS ´eum programa que disponibiliza suporte b´asicode acesso ao hardware, enquanto que o programa POST ´eutilizado para validar o estado dos componentes ligados na placa m˜ae.Os modelos mais recentes permitem a parametriza¸c˜aoda BIOS de forma a permitir ao utilizador escolher qual o dispositivo de arranque. Ap´osa valida¸c˜aodo hardware, ´eresponsabilidade da BIOS encaminhar o PC do processador para um dispositivo de arranque, de forma a carregar o c´odigodo sistema operativo para mem´oria,como exemplo um disco r´ıgido ou um CD ROM. Em contexto de simula¸c˜ao,a mem´oriaROM n˜aopossui car´acterobrigat´orio,podendo ser utilizada ou n˜ao.

Pegando em simuladores actuais, temos o software VirtualBox da Oracle, que n˜aoutiliza uma BIOS para arranque das suas m´aquinasvirtuais. Por outro lado pode-se ver que os softwares VMWare ou QEMU disp˜oemde BIOS para arranque dos sistemas instalados. De forma a tornar o comportamento do simulador o mais real poss´ıvel, optou-se por permitir a utiliza¸c˜aode uma BIOS para configura¸c˜aoe arranque do processador. 4.4. MEMORIAS´ RAM E ROM 123

Figura 4.18: Disposi¸c˜aoda mem´oriaRAM.

4.4.1 Simula¸c˜aoem Software

A mem´oriaRAM ´eum componente de car´acterobrigat´oriaem contexto de simula¸c˜ao.A sua representa¸c˜aoencontra-se implementada nos ficheiros “MemoriaPrincipal.c” e “Me- moriaPrincipal.h”. O processo de implementa¸c˜aoda mem´oria RAM n˜aoseguiu uma es- pecifica¸c˜aoem particular, sendo a sua representa¸c˜aofeita utilizando um modelo gen´erico do funcionamento de uma RAM. Assim a componente RAM possui as seguintes carac- ter´ısticas:

1. Toda a informa¸c˜aoarmazenada na RAM encontra-se organizada em blocos de 32 bits;

2. E´ poss´ıvel aceder e armazenar informa¸c˜aoem blocos de 32 bits (WORD), alinhadas com blocos de 16 (HALFWORD) ou 8 bits (BYTE);

3. A comunica¸c˜ao´efeita atrav´esdos canais Tx (Transmissor) e Rx (Receptor) na estrutura RAM;

4. O modelo de mensagens utilizado ´eo struct mem_request, que encontra-se defi- nido no ficheiro “ConnDef.h”;

Na constru¸c˜aoda mem´oriaRAM, o primeiro impulso foi a cria¸c˜aode um array muito grande para guardar a informa¸c˜ao. Esta representa¸c˜aofoi rapidamente abandonada, uma vez que o espa¸coocupado seria muito elevado tornando impratic´avel a manipula¸c˜ao e tratamento da mesma. Desta forma, optou-se pela divis˜aoda mem´oriaem segmen- tos atrav´esda cria¸c˜aode uma estrutura de dados em formato de “lista ligada” como demonstra a figura 4.18. 124 CAP´ITULO 4. MODULOS´

O principal objectivo ´etornar a manipula¸c˜aoda RAM pr´aticae flex´ıvel. Dado que a grande maioria dos sistemas utilizam a t´ecnicade pagina¸c˜aocom p´aginasde tamanho 4K, decidiu-se que a divis˜aodos blocos seria feita `asemelhan¸cado que acontece com a descodifica¸c˜aodos endere¸cosvirtuais11.

Os vinte bits mais significativos ser˜aoutilizados para agrupar um subconjunto de en- dere¸cosnum bloco, sendo os restantes doze bits utilizados como ´ındicedentro do pr´oprio bloco para aceder `ainforma¸c˜ao. Com este mecanismo, a RAM possuir´aum compor- tamento “on demand” uma vez que o espa¸coapenas crescer´aem fun¸c˜aodos pedidos efectuados pelo processador.

Veja-se o seguinte exemplo: se o simulador utilizar uma RAM com tamanho 4 MBytes, com blocos de tamanho 4KBytes e o programa em execu¸c˜aono simulador apenas utilizar endere¸cosno intervalo 0x80000000 e 0x8000400012, a mem´oriaRAM apenas utilizar´a( (0x4000 / 4K) * tamanho de cada bloco) em vez dos 4 MBytes. Desta forma, o espa¸co ocupado ´ereduzido drasticamente, permitindo uma melhor manipula¸c˜aoassim como a depura¸c˜ao do estado da mem´oriae seu conte´udo.

Como se pode observar no quadro 4.18, cada bloco da RAM ´ecomposto por um en- dere¸cobase que identifica o bloco e o subconjunto de endere¸cos,a tabela de conte´udo que consiste num array com tamanho 212 = 4096 e um apontador para o pr´oximobloco. Sempre que ´enecess´arioadicionar um novo bloco, a adi¸c˜aon˜ao´efeita de modo desor- ganizado, isto ´e,o novo bloco ´eadicionado de forma ordenada como demostra a figura 4.19.

Ao contr´ariodo processador, a RAM n˜aofunciona dentro do processo principal, sendo invocada num novo processo. Assim, a RAM possui internamente um tratador de pe- didos, que funciona de forma intermin´avel respondendo aos pedidos efectuados pelo processador. A comunica¸c˜ao´eefectuada atrav´esdas duas vari´aveis Tx (Transmissor) e Rx (Receptor), como demonstra o bloco de c´odigoem 4.19, que representam os canais de comunica¸c˜aoentre a RAM e o processador.

Da mesma forma que o processador, a RAM utiliza a estrutura struct mem_request para receber e enviar os pedidos efectuados pelo processador.

Cada pedido emitido ´edescodificado, identificando primeiro o tipo de opera¸c˜ao,LOAD ou STORE atrav´esdo campo LorS, sendo em seguida preenchido uma estrutura idˆentica com a nova informa¸c˜aorecolhida da mem´oria. Se ocorrer algum erro na execu¸c˜ao,o

11N˜aoconfundir a tradu¸c˜aode endere¸coscom a divis˜aode bits na RAM. Este mecanismo ´eutilizado para reduzir o espa¸coocupado pela RAM no simulador n˜aotendo qualquer liga¸c˜aocom a arquitectura MIPS32. 12Excluindo o endere¸co0x80004000, caso contr´arioseria necess´arioadicionar um novo bloco na RAM. 4.4. MEMORIAS´ RAM E ROM 125

Figura 4.19: Introdu¸c˜aode um novo bloco na RAM. campo RC ser´apreenchido com um c´odigo representativo do erro. O campo Control ´e utilizado exclusivamente pelo o simulador para enviar pedidos de PRINT ao processo respons´avel pela RAM, de forma a imprimir o conte´udoda RAM num ficheiro.

Todas as opera¸c˜oesefectuadas pela RAM s˜aoregistadas localmente, de forma a auxiliar o processo de depura¸c˜aoda mesma. Desta forma, s˜aogerados dois documentos na execu¸c˜ao da RAM: dump da mem´oriae o registo de opera¸c˜oes.O primeiro consiste numa fotografia da RAM num determinado momento da sua existˆencia,enquanto o segundo ´eutilizado para registar todas as opera¸c˜oesefectuadas na RAM, nomeadamente: LOAD, STORE, PRINT e SHUTDOWN.

//Tamanho da RAM em bytes (4 Mb= 4,194,304) #d e f i n e RAM SIZE (4∗1024∗1024)

//Canal de transmissao(RAM Out, CPU In) int Tx ; //Canal de recepcao(RAM In, CPU Out) int Rx ;

typedef struct RAM List { //Endereco Base na RAM WORD endereco base ;

//Tabela com deslocamentos WORD tabela [SIZE];

//Proximo No da Lista(RAM) 126 CAP´ITULO 4. MODULOS´

struct RAM List ∗ next block ; } RAM List ; Listing 4.19: Representa¸c˜aoda estrutura mem´oriaRAM.

Em oposi¸c˜ao`aRAM, a mem´oriaROM n˜aodisp˜oede car´acterobrigat´orio,sendo a decis˜aode utiliza¸c˜aoe implementa¸c˜aoexclusiva do simulador. No presente trabalho, optou-se por dar suporte `autiliza¸c˜aode uma mem´oriaROM, e a sua implementa¸c˜ao encontra-se nos ficheiros “MemoriaROM.c” e “MemoriaROM.h”.

Uma vez que este componente possui relativamente pouca informa¸c˜ao,decidiu-se utilizar um array simples com tamanho pr´edefinido igual a 128 bytes para guardar a sua informa¸c˜ao.

#d e f i n e ROM SIZE 128

typedef struct ROM t { //0 − open //1 − l o c k int l o c k ;

int Tx ; int Rx ;

WORD t a b e l a [ ROM SIZE ] ; } ROM t ; Listing 4.20: Representa¸c˜aoda estrutura mem´oriaROM.

O funcionamento da mem´oriaROM ´emuito semelhante ao funcionamento da RAM, uma vez que em ambos os casos o processo respons´avel pelo simulador, gera um novo processo para a execu¸c˜aoda mem´oria.O processo de comunica¸c˜aofunciona exactamente da mesma maneira que acontece com a mem´oriaRAM, atrav´esda troca de mensagens no formato struct mem_request.

Assim como acontece com a RAM, o processador pode fazer pedidos, com a diferen¸ca que dever˜aoser sempre LOAD’s13, caso contr´arioa ROM n˜aoexecutar´aa instru¸c˜aoe retornar´aum c´odigode erro na vari´avel RC da mensagem, sendo tratado pelo o ’Dispat- cher’ do simulador. A existˆenciada vari´avel lock serve precisamente para n˜aopermitir a execu¸c˜aode um STORE na mem´oriaROM por parte do processador, sendo este gerido pelo o simulador.

13O processo de inicializa¸c˜aoda ROM ´edescrito em detalhe na sec¸c˜ao 4.5 4.5. SIMULADOR UE 127

As vari´aveis Tx e Rx s˜aoutilizadas da mesma forma, representando os canais de comu- nica¸c˜aocriados pelo simulador, no qual a mem´orialˆedo Rx informa¸c˜aoproveniente do processador e o Tx ´eutilizado para enviar a resposta de volta para o processador.

4.5 Simulador UE

Uma vez que todos os componentes e mecanismos utilizados na arquitectura MIPS32 foram devidamente explanados, est´ana altura de introduzir o componente central que possibilita a integra¸c˜aoentre os v´ariosm´odulos.

Nesta sec¸c˜aoser˜aoabordadas a forma como o simulador inicia o seu funcionamento pre- enchendo as suas estruturas de dados internas com informa¸c˜aoem 4.5.1. Ser´atamb´em abordada a forma como o simulador carrega os ficheiros bin´ariosno formato ELF, pas- sados como argumento do simulador.

Nas sec¸c˜oes 4.5.2e 4.5.3 ser˜aodemonstrados o motor de execu¸c˜aodo simulador, assim como os seus mecanismos internos e procedimentos de encerramento.

4.5.1 Carregamento e arranque do sistema

O procedimento de inicializa¸c˜aodo sistema consiste em trˆesfases: valida¸c˜aode argumen- tos, cria¸c˜aoe instancia¸c˜aodas estruturas definidas no ficheiro de configura¸c˜ao”Config.” e carregamento do programa para mem´oria. A primeira fase ´ecomposta pela valida¸c˜ao dos argumentos uma vez que o simulador pode iniciar a sua execu¸c˜aode uma das se- guintes formas:

./SimuladorUE Programa. bin ou ./SimuladorUE Programa. bin ROM. bin

Em ambos os casos o programa passado como argumento dever´arespeitar o formato ELF, caso contr´arioo sistema n˜aocompreender´aa organiza¸c˜aoda sua informa¸c˜aoe abortar´a a execu¸c˜ao.Caso o segundo argumento seja utilizado, este dever´arespeitar igualmente o formato ELF e ser´acarregado para a componente ROM existente no simulador14. Nestes casos o PC n˜ao´einicializado uma vez que o arranque do sistema ser´afeito atrav´esda inser¸c˜aodo sinal Reset directamente no processador, como se de uma sistema real se tratasse. Se o segundo argumento n˜aofor utilizado, ent˜aoo PC do processador

14Os mapeamentos para o dispositivo s˜aoefectuados pelo simulador, como acontece em placas mˆae na actualidade. Por defeito a ROM encontra-se no endere¸covirtual 0xBFC00000, que corresponde ao endere¸cof´ısico0x1FC00000. 128 CAP´ITULO 4. MODULOS´

´einicializado com o endere¸coexistente no Entry Point do ficheiro programa bin´ario.

Quando se iniciar o ciclo de execu¸c˜aodo simulador, o processador come¸car´aa executar as instru¸c˜oesapontadas pelo registo PC, como definido na arquitectura MIPS32. Uma vez conclu´ıdacom sucesso a valida¸c˜aodos argumentos, inicia-se o processo de cria¸c˜aodas es- truturas de dados definidas e mapeadas atrav´esdo ficheiro “Config.h” que dar˜aosuporte ao funcionamento do simulador. Todas as estruturas s˜aodefinidas de forma gen´erica, seria bastante deselegante para o simulador apenas permitir um tipo de processador, ou cada vez que se pretendesse mudar de processador seja necess´ariofazer modifica¸c˜oesno c´odigofonte do simulador.

Para tal situa¸c˜aon˜aoacontecer, optou-se pela utiliza¸c˜aode macros com a finalidade de mapear todas as estruturas existentes, assim, o simulador apenas vˆeum tipo gen´erico de processador, mem´oriaou mecanismo de tradu¸c˜aode endere¸cose n˜aoas suas imple- menta¸c˜oesespec´ıficas. Desta forma ´eposs´ıvel desenvolver um perif´ericonovo customi- zado e integra-lo no simulador sem modifica¸c˜oesno c´odigofonte do mesmo. Embora a implementa¸c˜aoseja livre ´enecess´arioque o programador siga um conjunto de regras de forma a mapear correctamente as fun¸c˜oesgen´ericaspara fun¸c˜oesespec´ıficasdo seu perif´ericono ficheiro de configura¸c˜ao.

No excerto de c´odigoabaixo pode-se visualizar a forma como o simulador mapeia a estrutura do processador.

// MIPS CPUs // MIPS Core 32 #define MIPS32 Core

// MIPS Core 64 //#define MIPS64 Core

//Mapeamento de Variaveise Funcoes #ifndef CORETYPE #define CORETYPE

//ERRO #i f defined( MIPS32 Core ) && defined( MIPS64 Core ) #error ”Nao pode haver dois processadores diferentes a funcionar ao mesmo tempo!” #e n d i f

// Processadores de 32 Bits #ifdef MIPS32 Core

//Definir Revision 4.5. SIMULADOR UE 129

#define ARCH REV 2

//Nome do Core #define CORE ”MIPS 32 bits”

//Nome da Struct CPU #define CPU CPU 32

//Nome do MMU #define MMUTYPE ”MMU para arquitectura de 32Bits”

//Executa #define executa executa32

#elif defined( MIPS64 Core ) // Processadores de 64 Bits

//Nome do Core #define CORE ”MIPS 64 bits”

//Nome da Struct CPU #define CPU CPU 64

//Nome do MMU #define MMUTYPE ”MMU para arquitectura 64Bits”

//Executa #define executa executa64

#e n d i f #endif Listing 4.21: Mapeamento de fun¸c˜oese estruturas do Simulador.

No exemplo acima, pode-se ver a defini¸c˜aoe mapeamento de dois tipos de processadores, um processador para a arquitectura MIPS32 e outro para a arquitectura MIPS64. E´ f´acil de compreender que n˜ao´eposs´ıvel ter dois processadores, de arquitecturas diferentes a funcionar ao mesmo tempo, assim ´enecess´arioconfigurar qual a arquitectura que deve ficar activa.

Veja-se o seguinte exemplo: a estrutura struct CPU_32, representa o nome da estrutura internamente na implementa¸c˜aodo processador de 32 bits. Os nomes utilizados em cada implementa¸c˜aon˜aos˜aoimportantes mas sim o nome utilizado pelo simulador para reconhecer a estrutura. 130 CAP´ITULO 4. MODULOS´

Figura 4.20: Disposi¸c˜aodos canais no simulador.

Desta forma, a estrutura CPU no c´odigodo simulador dever´amapear os nomes das estruturas dos processadores, neste caso, o nome CPU_32.

O mesmo acontece com as fun¸c˜oesque mapeiam a fun¸c˜aorespons´avel pelo controlo do fluxo de execu¸c˜aodo processador, nomeadamente: “executa32” para “executa”. A vantagem da utiliza¸c˜aode macros ´eo facto de esta criar uma camada de abstrac¸c˜aoentre o simulador e os perif´ericosde forma a permitir que os mesmos possam ser utilizados em outros simuladores ou vers˜oesmelhoradas do actual.

O passo seguinte consiste na cria¸c˜aoe instancia¸c˜aodos canais de comunica¸c˜aoutilizado pelos perif´ericosligados no simulador. Para tal, o simulador criar´ae manter´ainter- namente numa tabela de descritores, todos os canais de comunica¸c˜aoentre os v´arios perif´ericos. Na fun¸c˜aode inicializa¸c˜aode cada perif´erico,s˜aopassados adicionalmente dois canais, o Tx e o Rx respectivamente, para que possuam um canal de transmiss˜aoe outro para recep¸c˜aode dados.

Oficialmente, o processador e a RAM n˜aose encontram ligados directamente, mas sim atrav´esda placa m˜ae. Esta placa disp˜oede um chip interno que funciona como hub de dispositivos, no qual todos os perif´ericosse ligam, permitindo o mapeamento e o encaminhamento de endere¸cospara dispositivos diferentes. Em contexto de simula¸c˜ao este chip ´econhecido como “Dispatcher” e a sua representa¸c˜aoencontra-se implementada nos ficheiros “Dispatcher.c” e “Dispatcher.h”. Na figura 4.20 encontra-se demonstrado a disposi¸c˜aodo simulador ap´oso estabelecimento dos canais de comunica¸c˜ao.

O Dispatcher funciona como um m´oduloseparado do simulador, sendo lan¸cadoem um novo processo. A sua principal fun¸c˜ao´eredireccionar pedidos efectuados pelo processa- dor para o perif´erico correspondente, de acordo com a tabela 4.76.

Esta t´ecnicade redirecionamento de endere¸cos´econhecida como MMIO (Memory Map- ped Input/ Output) e ´eutilizada pelos processadores para mapear endere¸cosf´ısicosentre 4.5. SIMULADOR UE 131

Dispositivo Endere¸coin´ıcio Endere¸cofim RAM 1 0x20000000 0xFFFFFFFF ROM 0x1FC00000 0x1FFFFFFC Unused 0x08C00000 0x1FBFFFFC IODEV 0x08400000 0x08BFFFFC Clock 0x08000000 0x083FFFFC RAM 0 0x00000000 0x07FFFFFC

Tabela 4.76: Tabela de mapeamento de endere¸cosfis´ıcospara dispositivos. os diferentes dispositivos. A forma como os endere¸cos s˜aomapeados varia de acordo com a implementa¸c˜aoda placa m˜ae,neste caso do simulador. A tabela de mapeamentos utilizada baseou-se nos mapeamentos utilizados pela placa m˜aeMalta [MT02].

Uma vez criadas as estruturas, mapeamento de fun¸c˜oes,assim como estabelecidos os canais de comunica¸c˜ao,o simulador encontra-se pronto para carregar o c´odigodo pro- grama bin´ariopara mem´oria.No carregamento do programa para a mem´oria,surge uma situa¸c˜ao,apenas em configura¸c˜oesespec´ıficas,que necessitam de inicializa¸c˜aoe suporte por parte do simulador.

Estas situa¸c˜oesocorrem exactamente quando os programas bin´arioscontˆemc´odigoou dados em zona de mem´oriamapeada. Nestes casos o simulador n˜aosabe onde colo- car o c´odigouma vez que n˜aoexistem, pr´eviamente, mapeamentos na TLB, uma vez que essa responsabilidade pertence ao sistema operativo. Em sistemas reais este tipo de problema n˜aoexiste uma vez que o kernel do sistema operativo ´ecarregado para segmen- tos de mem´oria n˜aomapeados, nomeadamente KSEG0, sendo em seguida introduzidos mapeamentos na TLB, permitindo o carregamento de novos programas para mem´oria mapeada.

Actualmente, o simulador n˜aodisp˜oede suporte para controladores de perif´ericosde armazenamento permanente, como os discos r´ıgidos. Desta forma, os programas que cor- rem no simulador n˜aoconseguem aceder a ficheiros de forma a permitir o carregamento de novos programas para zonas de mem´oriamapeadas. Assim, optou-se pela introdu¸c˜ao de mapeamentos manualmente, de forma a permitir o carregamento de c´odigoe da- dos para zonas mapeadas. Estes mapeamentos manuais disp˜oem de um limite m´aximo de dez mapeamentos, endere¸cosvirtuais e f´ısicosna TLB, que ser˜aoutilizados para o carregamento inicial dos programas. 132 CAP´ITULO 4. MODULOS´

Para tal ´enecess´ariointroduzir as seguintes directivas no ficheiro “Config.h”: //TLB − Mappings #define tlb map entryHI 0 0x7FFFE000//VPN+ ASID+ FLAGS #define tlb map entryLO0 0 0x00000100//Pagina Fisica Par #define tlb map entryLO1 0 0x00000140//Pagina Fisica Impar #define tlb map mask 0 0x00001800//Paginas de4k

#define tlb map entryHI 1 0x00400000//VPN+ ASID+ FLAGS #define tlb map entryLO0 1 0x00000080//Pagina Fisica Par #define tlb map entryLO1 1 0x000000C0//Pagina Fisica Impar #define tlb map mask 1 0x00001800//Paginas de4k

#define tlb map entryHI 2 0xE0000000//VPN+ ASID+ FLAGS #define tlb map entryLO0 2 0x00000160//Pagina Fisica Par #define tlb map entryLO1 2 0x00000180//Pagina Fisica Impar #define tlb map mask 2 0x00001800//Paginas de4k

#define tlb map entryHI 3 −1 #define tlb map entryHI 4 −1 #define tlb map entryHI 5 −1 #define tlb map entryHI 6 −1 #define tlb map entryHI 7 −1 #define tlb map entryHI 8 −1 #define tlb map entryHI 9 −1 Listing 4.22: Mapeamentos manuais na TLB.

Desta forma ´eposs´ıvel gerar programas que corram em qualquer segmento de mem´oria, mapeada ou n˜aomapeada. Resolvidos os problemas de mapeamentos, o simulador pode introduzir o c´odigode cada sec¸c˜aorespectivamente para o seu endere¸code mem´oriavir- tual. O carregamento ´efeito por sec¸c˜aoe a ordem de introdu¸c˜ao´edecidida pelo ficheiro bin´ario. O simulador apenas se encarrega de copiar o conte´udode cada sec¸c˜aopara o endere¸cof´ısicoresolvido, atrav´esdas fun¸c˜oes standard do processador, nomeadamente:

WORD LoadMemory(CPU ∗cpu, BYTE AcessLength , WORD vAddr) ; void StoreMemory(CPU ∗cpu, BYTE AcessLength , WORD vAddr, WORD Info); Listing 4.23: Fun¸c˜oesstandard de leitura e escrita do SimuladorUE.

Uma vez que no ficheiro bin´arioexistem apenas referˆenciasa endere¸cosvirtuais, n˜ao h´anecessidade, por parte do simulador, aceder directamente `amem´oriaf´ısicapara in- troduzir c´odigo. Embora os ficheiros no formato ELF permitam, para determinadas arquitecturas, guardar informa¸c˜aorelativa a endere¸cosf´ısicos,esta funcionalidade n˜ao´e suportada pelo simulador. 4.5. SIMULADOR UE 133

Todos os endere¸coss˜aoprocessados pela unidade de gest˜aode mem´oriado processador em funcionamento, da´ıa necessidade de haver mapeamentos na TLB antes do carrega- mento do programa. De modo a possibilitar a detec¸c˜aodo estado final da execu¸c˜aodo c´odigobin´ario,decidiu-se introduzir duas instru¸c˜oes, NOP e END no final de cada sec¸c˜ao. Nas sec¸c˜oesposteriores ser˜aoabordados em detalhe a forma e os motivos pelo quais ´e necess´arioa utiliza¸c˜aodas duas instru¸c˜oes.

Nos casos em que n˜aoseja utilizada mem´oriaROM, ap´oso carregamento do ficheiro bin´ariopara a mem´oriado sistema, o simulador procede `aaltera¸c˜aodo PC do processador sobrepondo-o com o valor do Entry Point definido no ficheiro bin´ario,iniciando assim o processo de execu¸c˜ao. Caso seja passado uma mem´oriaROM como argumento, o simulador copiar´ao conte´udodo ficheiro bin´arioROM para dentro da mem´oriaROM interna no simulador. Em seguida, de forma a iniciar o processo de execu¸c˜ao,o simulador introduzir´aum sinal de “Cold Reset” atrav´esda fun¸c˜ao RaiseException3(CPU *cpu) de forma a simular um arranque real do processador.

Como visto na sec¸c˜ao 4.1.8, quando o sinal de Reset ´eintroduzido no processador o valor do PC ´emodificado para 0xBFC00000, passando assim a execu¸c˜aopara a “BIOS” residente na mem´oriaROM, sendo esta respons´avel por dar continuidade `aexecu¸c˜aodo c´odigo.

4.5.2 Execu¸c˜ao

Ap´osa conclus˜aoda inicializa¸c˜aodo sistema o simulador encontra-se pronto para execu- tar o c´odigocarregado em mem´oria.A sua execu¸c˜aoinicia-se com a primeira instru¸c˜ao na mem´oria,RAM ou ROM dependendo dos argumentos utilizados, que se situa no endere¸coapontado pelo registo PC.

Esta execu¸c˜aoconsiste num ciclo infinito no qual o simulador envia sucessivos pedidos de itera¸c˜oesao processador, atrav´es da fun¸c˜ao executa, respons´avel pelo o controlo do fluxo de execu¸c˜aointerna do mesmo. void executa (CPU ∗cpu ) ; Listing 4.24: Fun¸c˜aoiterativa executa.

No cap´ıtulo 4.1 observou-se em detalhe o funcionamento e a estrutura acima mencionada. Em todas as itera¸c˜oesdo ciclo de execu¸c˜ao,o simulador valida se o estado do processador ´e CPU HALT (Idle) com o objectivo de suspender ou abortar o fluxo de execu¸c˜ao,sendo no segundo caso activado o procedimento de encerramento.

Uma vez que a velocidade de execu¸c˜aodo c´odigobin´ario´eelevada, impossibilitando a 134 CAP´ITULO 4. MODULOS´ leitura em tempo de execu¸c˜ao,desenvolveu-se um mecanismo de debug que permite aos utilizadores validar a informa¸c˜aoque se encontra em processamento num determinado instante ou endere¸co. Para tal ´enecess´arioconfigurar uma lista de endere¸cosde debug definidos no ficheiro “Config.h”, que parametrizar´ao simulador de forma a possibili- tar a interrup¸c˜aomomentˆaneado fluxo de execu¸c˜aonos endere¸coscustomizados pelo utilizador. Este mecanismo permitir´atamb´ema execu¸c˜aode fun¸c˜oesauxiliares como “fotografias” do estado de cada componente no sistema, nomeadamente, os registos do processador, mapeamentos na TLB, gerar dumps da mem´oriaf´ısicaou da tabela de ma- peamentos da TLB. Ser´aposs´ıvel, em determinadas situa¸c˜oes,a modifica¸c˜aomanual de alguns componentes, como eliminar todos os mapeamentos n˜aofixos existentes na TLB com o objectivo de demonstrar alguns comportamentos da arquitectura.

4.5.3 T´erminode Execu¸c˜ao

O simulador permite a execu¸c˜aode c´odigobin´ario,mas o que acontece quando o c´odigo desenvolvido em mem´oriatermina? Na realidade a mem´oriacont´eminforma¸c˜ao,in- dependentemente da sua validade, o que levaria o processador a tentar interpretar e executar essa mesma informa¸c˜ao.

Desta forma, levanta-se uma importante quest˜aoque ´ea forma como o simulador termina a sua execu¸c˜ao. Os programadores n˜aodevem ter de se preocupar com esta quest˜ao, sendo a mesma responsabilidade do sistema operativo. Em sistemas reais, o sistema operativo gera uma excep¸c˜aodo tipo NMI, respons´avel por enviar um sinal de encerra- mento para a fonte de alimenta¸c˜ao.Neste caso em concreto ´eo simulador que det´ema responsabilidade de detectar o estado final e encerrar o processo de execu¸c˜ao.Para tal, decidiu-se introduzir as instru¸c˜oes NOP e END no fim de cada segmento de c´odigopresente no ficheiro bin´ario.

Segundo [MT10b] a instru¸c˜ao NOP ´econstitu´ıdapor uma WORD de 32 bits, no qual todos os bits s˜aoiguais a zero. Esta instru¸c˜ao´einterpretada pelo processador como uma instru¸c˜aoSLL (Shift Left Logical). Relativamente `ainstru¸c˜ao END, esta n˜aoexiste por defeito na ISA MIPS32 revis˜ao2, sendo que a sua codifica¸c˜aose encontra dispon´ıvel para utiliza¸c˜aocustomizada como se pode observar no quadro 4.77.

Desta forma decidiu-se utilizar os primeiros seis bits da tabela de codifica¸c˜ao opcode, nomeadamente 011000, para codificar a instru¸c˜ao END, que activar´ao estado CPU HALT no processador, que por sua vez servir´acomo ponto de sa´ıda para o simulador. No quadro 4.77 pode-se ver a codifica¸c˜aobase das instru¸c˜oespara a ISA MIPS32 revis˜ao2 segundo [MT10b] e o local escolhido para codificar a instru¸c˜ao END. 4.5. SIMULADOR UE 135

OPCODE bits 28..26 0 1 2 3 4 5 6 7 bits 31..29 000 001 010 011 100 101 110 111 0 000 SPECIAL REGIMM J JAL BEQ BNE BLEZ BGTZ 1 001 ADDI ADDIU SLTI SLTIU ANDI ORI XORI LUI 2 010 COP0 COP1 COP2 COP1X BEQL BNEL BLEZL BGTZL 3 011 END * * * SPECIAL2 JALX * SPECIAL3 4 100 LB LH LWL LW LBU LHU LWR * 5 101 SB SH SWL SW * * SWR CACHE 6 110 LL LWC1 LWC2 PREF * LDC1 LDC2 * 7 111 SC SWC1 SWC2 * * SDC1 SDC2 *

Tabela 4.77: Codifica¸c˜aopara a instru¸c˜aoEND.

Sempre que surja uma instru¸c˜aocom esta codifica¸c˜aoo processador terminar´aa sua execu¸c˜aoe por consequˆenciao simulador encerrar´ao seu funcionamento. A raz˜aopelo qual foi escolhido esta codifica¸c˜aoe n˜aooutra deve-se ao facto de que esta ´ea tabela global que mapeia todas as instru¸c˜oesMIPS. E´ f´acilde notar que n˜aose encontram nesta tabela todas as instru¸c˜oesexistentes na ISA MIPS32, uma vez que existem codifica¸c˜oes que s˜aosubconjuntos de outras codifica¸c˜oes,nomeadamente a instru¸c˜ao ADD que ´euma sub codifica¸c˜aodo grupo SPECIAL.

No cap´ıtulo 4.1, na interpreta¸c˜aodas instru¸c˜oes,´epos´ıvel ver que existem instru¸c˜oesque s´onecessitam de uma compara¸c˜aopara identificar a instru¸c˜aoexistindo outros casos, em que ´enecess´ariofazer duas ou mais compara¸c˜oes. Tome-se como exemplo a instru¸c˜ao ADD: para que o processador consiga identificar a instru¸c˜aoe os seus argumentos, a sua primeira tarefa ´eidentificar o tipo de codifica¸c˜aoatrav´esdos seus seis bits mais significativos, respectivamente os bits 31 a 26. Neste caso, identificar´ao sub conjunto SPECIAL, no qual ser´anecess´ariointerpretar os seis bits menos significativos, bits 0 a 5 que ir´aidentificar a instru¸c˜ao ADD, sendo os restantes bits da instru¸c˜aoutilizados para identificar os seus argumentos.

De forma a minimizar o n´umerode compara¸c˜oesdecidiu-se utilizar a primeira codi- fica¸c˜aodispon´ıvel na tabela global de codifica¸c˜oes.Esta t´ecnicade introdu¸c˜aodas duas instru¸c˜oes, NOP e END, levanta alguns perigos na sua utiliza¸c˜ao,exclusivamente quando existem sec¸c˜oesno ficheiro bin´arioalinhadas e desordenadas.

Veja-se o seguinte exemplo: um ficheiro bin´ariocont´emduas sec¸c˜oescom endere¸cosn˜ao- alinhados, sendo que a sec¸c˜aoA possui 50 instru¸c˜oesno endere¸co 0x80000000 e a sec¸c˜ao B possu´ı20 instru¸c˜oesno endere¸co0x80000180. Quando estas sec¸c˜oesforem carregadas para mem´orian˜aohaver´aproblemas de sobreposi¸c˜aode instru¸c˜oes. 136 CAP´ITULO 4. MODULOS´

Agora nos casos em que as sec¸c˜oesse encontrem alinhadas e desordenadas, relativamente aos seus endere¸cosno ficheiro bin´ario,pode existir sobreposi¸c˜oesde instru¸c˜oescaso n˜ao sejam tomadas precau¸c˜oes. Peguemos em outro exemplo no mesmo seguimento, um ficheiro bin´ariocom duas sec¸c˜oessendo que a sec¸c˜aoA possui 10 instru¸c˜oesno endere¸co 0x80000000 e esta se encontra alinhada com a sec¸c˜aoB com 5 instru¸c˜oesno endere¸co 0x80000028.

Se a sec¸c˜aoB for introduzida na mem´oria em primeiro lugar, quando a sec¸c˜aoA for introduzida haver´asobreposi¸c˜aode informa¸c˜ao. De forma a resolver este problema, o simulador antes de introduzir as duas instru¸c˜oesna mem´oriaverifica se os seus valores s˜ao iguais ao valor preenchido por defeito na RAM de forma a preservar qualquer informa¸c˜ao carregada em mem´oriaanteriormente. Este ´eum comportamento perigoso por parte do simulador mas uma vez que os ficheiros de teste n˜aocontˆemsec¸c˜oesalinhadas optou-se por esta solu¸c˜ao.

Ap´osa ocorrˆenciada instru¸c˜ao END o simulador abortar´ao seu ciclo de execu¸c˜ao,inici- ando assim o processo de encerramento. Este processo consiste no envio do sinal SIGKILL aos processos filhos, o qual ser´ainterceptado pelos mesmos, iniciando igualmente em se- guida o processo de encerramento. Assim, em todos os processos filhos, s˜aoterminados e fechados os ficheiros de logs, sendo que em alguns casos como a RAM, ser´agerado um dump adicional com o estado da mem´oria,assim como o processador e seus respectivos registos. Cap´ıtulo5

Utiliza¸c˜aodo Sistema

Este cap´ıtulo´ededicado `autiliza¸c˜ao,interface e ao modo como o utilizador interage com o sistema. Aqui ser˜aodemonstrados alguns exemplos da utiliza¸c˜aodo simulador, destacando as funcionalidades mais importantes:

• Modos de execu¸c˜ao Kernel e User;

• Registos do coprocessador central CP0;

• Excep¸c˜oesassociadas ao vector geral;

• Utiliza¸c˜aodas excep¸c˜oes TLB Miss, TLB Invalid ou TLB Modified para aloca¸c˜ao de p´aginasna TLB e na mem´oriaRAM;

• Utiliza¸c˜aode chamadas ao sistema (System Calls);

• Gera¸c˜aoe tratamento de erros de execu¸c˜ao(runtime error) como: Address Error (AdES ou AdEL), Coprocessor Unusable ou erros na TLB (TLBL, TLBS ou Mod);

• Integra¸c˜aode c´odigo compilado utilizando GCC no simulador;

A sec¸c˜ao 5.1 descreve a interface desenvolvida para o sistema e a estrutura que os pro- gramas devem respeitar, de forma a permitir a sua execu¸c˜aono simulador. Na sec¸c˜ao 5.2 s˜aoapresentados alguns casos aplicados com sucesso no simulador.

137 138 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

5.1 Interface e funcionamento

Em oposi¸c˜aoaos simuladores SPIM e MARS, que permitem a programa¸c˜aodo c´odigo fonte, o presente simulador apenas permite a execu¸c˜aode c´odigobin´ariopr´eviamente compilado. De forma a possibilitar a execu¸c˜aode c´odigono simulador, ´enecess´arioque cada programa seja compilado e linkado atrav´esde um compilador.

Para programas desenvolvidos directamente atrav´esde c´odigo assembly, ficheiros com extens˜ao“.asm” ou “.S”, ´enecess´arioutilizar um assembler para converter o c´odigo fonte em c´odigo bin´arioexecut´avel. Uma vez que nos encontramos a desenvolver c´odigo bin´arionuma arquitectura diferente da arquitectura MIPS, nomeadamente x86, ´ene- cess´arioutilizar ferramentas que suportem a compila¸c˜aocruzada de c´odigo.

De forma a ultrapassar esta quest˜ao,optou-se pela utiliza¸c˜aodo Workbench da MIPS Inc, dado que disp˜oede um conjunto de ferramentas para desenvolvimento, compila¸c˜ao e depura¸c˜aode c´odigobin´ariopara a arquitectura MIPS, suportando v´ariasISA’s. As- sim, utilizou-se o software mips-gnu-linux-as para compilar o c´odigofonte assembly para c´odigom´aquina.Existe no entanto outra forma, nomeadamente atrav´esdo desen- volvimento de c´odigona linguagem de programa¸c˜aoC/C++. Nestes casos ´enecess´ario a utiliza¸c˜aodo compilador mips-gnu-linux-gcc, existindo ainda alguns problemas na integra¸c˜aoentre o simulador e as bibliotecas dinˆamicasda linguagem, como exemplo a biblioteca glibc.

Em ambos os casos, em determinadas situa¸c˜oes,´enecess´ario modificar alguns elementos dos ficheiros execut´aveis gerados, nomeadamente os endere¸cosdas sec¸c˜oesexistentes ou o ponto de entrada do ficheiro. A situa¸c˜aoocorre, uma vez que o mips-gnu-linux-gcc e o mips-gnu-linux-as geram sec¸c˜oescujo o endere¸cobase come¸cano endere¸covir- tual 0x00000000, sendo uma zona de mem´oriamapeada, que n˜ao´eposs´ıvel aceder sem mapeamento pr´evio.

Existe tamb´ema necessidade de modificar os endere¸cosde algumas sec¸c˜oes,uma vez que o objectivo da demonstra¸c˜aofoca-se nos mecanismos da arquitectura, no qual os testes `asexcep¸c˜oesnecessitam de tratadores em endere¸cospr´ecalculados, como abordado na sec¸c˜ao 4.1.8. O mesmo se aplica ao ponto de entrada do ficheiro ELF, uma vez que este pode variar conforme o tipo de demonstra¸c˜ao,sendo os endere¸cosde entrada mais comums 0x00400000 ou o 0x80000000.

Na figura 5.1 ´eposs´ıvel visualizar o processo de desenvolvimento e compila¸c˜aodos fi- cheiros de teste gerados, com o assembler as ou pelo compilador GCC. 5.1. INTERFACE E FUNCIONAMENTO 139

   

 $   !"!"#!  !"!"#!

()0) )A   

%&  !"!"#!

 '()0  !"!"#!1 2

#" 34 (56789@409

E)0F #" 34B%D

B# C)0B%D B# C3  !"!"#!  !"!"#!1"

Figura 5.1: Desenvolvimento e compila¸c˜aode programas para o SimuladorUE.

No anexoA pode-se observar o conte´udodo ficheiro Makefile, utilizado para compilar todas as demonstra¸c˜oesdo presente trabalho.

Uma vez compilado o programa a ser testado, encontramo-nos prontos a execut´a-lono simulador. Desta forma, para se iniciar a execu¸c˜aodo simulador ´enecess´ariocorrer na consola um dos seguintes comandos:

./simuladorUE programa ELF ou ./simuladorUE programa ELF memoria ROM ELF

Como se pode observar nos dois formatos acima, o simulador pode ser iniciado de duas formas: sem mem´oriaROM e com mem´oriaROM. No primeiro formato, apenas ´epas- sado como argumento o programa execut´avel na norma ELF, sendo responsabilidade do c´odigodo programa a inicializa¸c˜aodos estados do processador, designadamente: os modos de execu¸c˜ao,os estados de arranque, o mapeamento de p´aginasna TLB, estados de controlo, entre outros.

Por defeito, ´eposs´ıvel parametrizar o estado inicial e os registos internos do processador no simulador, sendo os valores de inicializa¸c˜aoutilizados sugeridos em [MT10c]. Neste caso, o endere¸codo PC ´emodificado com endere¸codo ponto de entrada definido no ficheiro execut´avel ELF, sendo este considerado o ponto inicial de execu¸c˜aodo c´odigo. 140 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.2: Terminal VMM do simuladorUE.

O segundo caso, ´eutilizado exclusivamente em sistemas que simulem um funcionamento mais realista, nomeadamente os mecanismos de arranque utilizados num sistema real. Nestes casos o endere¸co do PC n˜ao´emodificado pelo o valor do ponto de entrada no ficheiro bin´arioELF, sendo por sua vez actualizado atrav´esda inser¸c˜aodo sinal Reset no processador.

Assim que o simulador inicia a sua execu¸c˜ao,´eapresentado num terminal Linux um conjunto de informa¸c˜aorelativamente `aconfigura¸c˜aodo sistema, assim como os dispo- sitivos emulados como se pode ver na figura 5.2. A componente gr´aficado simulador consiste simplesmente num terminal Linux, de forma semelhante ao que acontece com o simulador QEMU, com a diferen¸caque esta consiste numa vis˜aodirecta do estado do monitor (VMM) e n˜aonum terminal TTY dentro do sistema virtualizado.

Inicialmente, ponderou-se a adop¸c˜aode uma solu¸c˜aono qual fosse poss´ıvel a utiliza¸c˜ao de duas consolas, uma para o VMM e ou outra atrav´esde um terminal TTY dentro do sistema virtualizado. Uma vez que o mecanismo de interrup¸c˜oesn˜aose encontra imple- mentado, apenas foi poss´ıvel implementar um terminal com a informa¸c˜aoproveniente do VMM.

No terminal ´eposs´ıvel visualizar informa¸c˜oescomo a descri¸c˜aodos componentes ligados 5.1. INTERFACE E FUNCIONAMENTO 141

Figura 5.3: Fun¸c˜oesdo SimuladorUE. no simulador ou o tipo de implementa¸c˜aoutilizados. E´ igualmente poss´ıvel validar algumas caracter´ısticas mais t´ecnicascomo os mapeamentos definidos na placa m˜ae para associa¸c˜aodos v´ariosdispositivos, como exemplo a mem´oriaRAM ou a mem´oria ROM.

A` medida que o simulador procede na sua execu¸c˜ao,pode-se ver a defini¸c˜aodos v´arios canais, utilizados pelos componentes, assim como o protocolo de comunica¸c˜aoadoptado para comunica¸c˜ao. E´ igualmente poss´ıvel visualizar que a execu¸c˜aodos v´arioscom- ponentes s˜aolan¸cadosem processos individuais, no qual comunicar˜aoexclusivamente com o m´odulo Dispatcher. Ap´osa incializa¸c˜aodos componentes e respectivos m´odulos, ´enecess´arioproceder `aintrodu¸c˜aodo programa bin´ariona mem´oria RAM do sistema virtualizado. Caso seja utilizada uma mem´oriaROM o seu conte´udoser´aigualmente carregado para o dispositivo respectivo.

Em seguida, a consola do monitor (VMM) apresentar´atodas a instru¸c˜oesexecutadas no simulador em tempo de execu¸c˜ao. Por defeito, o simulador possui um sistema de depura¸c˜aointerno, sendo poss´ıvel mapear at´edez endere¸cosvirtuais, no qual permitir´aao mesmo suspender a execu¸c˜aode instru¸c˜oesde forma a permitir ao utilizador a aplica¸c˜ao de um conjunto de fun¸c˜oes. O objectivo destas fun¸c˜oesconsiste na modifica¸c˜aodos estados internos do sistema virtualizado assim como dos seus componentes.

Suponha-se a seguinte situa¸c˜ao:a tabela de depura¸c˜aointerna no simulador possui ape- nas uma entrada com o endere¸co0x80000000, desta forma, sempre que o PC do proces- sador atingir o endere¸comapeado, o simulador suspender´aa seu execu¸c˜aoe apresentar´a a janela descrita na figura 5.3.

As fun¸c˜oesdispon´ıveis pelo simulador para modificar e recolher informa¸c˜aodo sistema h´ospede s˜ao:

• A primeira op¸c˜aoimprime no terminal os conte´udo dos registos internos e gen´ericos do processador do sistema h´ospede; 142 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

• A segunda op¸c˜aopega no conte´udoda mem´oriaRAM virtualizada e escreve num ficheiro de texto no sistema anfitri˜ao:

• A terceira op¸c˜ao´emuito semelhante `asegunda uma vez que escreve o conte´udo da tabela de mapeamentos TLB interna no processador num ficheiro de texto no sistema anfitri˜ao;

• A quarta op¸c˜aopermite ao utilizador executar uma TLB Flush, esvaziando assim a tabela de mapeamentos da TLB, for¸candoa uma mudan¸cade contexto;

• A ´ultimaop¸c˜ao´eutilizada para retornar `aexecu¸c˜aodas instru¸c˜oesno simulador.

5.2 Demonstra¸c˜oes

Em seguida ser˜aoabordados exemplos, atrav´esde programas bin´ariosno formato ELF, cujo objectivo consiste na demonstra¸c˜aodas funcionalidades da arquitectura MIPS32 revis˜ao2 implementadas na sec¸c˜ao4.

Todos os exemplos apresentados utilizam programas gerados utilizando o assembler mips-linux-gnu-as directamente ou o compilador mips-linux-gnu-gcc.

5.2.1 C´alculodo factorial em modo e zona de Kernel

O primeiro exemplo tem como objectivo a demonstra¸c˜aodo funcionamento de um pro- grama, compilado directamente atrav´esdo mips-linux-gnu-as, com as seguintes carac- ter´ısticas:

• E´ responsabilidade do programa a configura¸c˜aoinicial do processador;

• Ser´autilizado apenas o modo de execu¸c˜ao kernel;

• Ser˜aoutilizados endere¸cosdentro do espa¸code endere¸camento kernel;

• Ser˜aopr´edefinidos no simulador mapeamentos na TLB para utiliza¸c˜aoda STACK no segmento KSEG3 para o modo kernel;

• O ponto de entrada do programa ser´ao endere¸co0x80000000;

• Ser´aexecutado o programa com o factorial do n´umeroseis.

Uma vez que o primeiro exemplo n˜aodisp˜oede mem´oriaROM, ´eresponsabilidade do programa configurar o processador com os estados adequados para a sua execu¸c˜ao. 5.2. DEMONSTRAC¸ OES˜ 143

Apenas os endere¸cosde mem´oriadentro da zona kernel, nomeadamente KSEG0, KSEG1 e KSEG3 ser˜aoutilizados, no qual nos dois primeiros residir´ao c´odigobin´ariodo pro- grama e no segmento KSEG3 ser´aalocada uma p´aginana TLB de forma a poder-se utilizar como STACK. O ponto de entrada do programa ´eno endere¸co0x80000000, pertencente ao KSEG0 que ´euma zona n˜aomapeada e que n˜aoutilizada cache.

Uma vez que o modo de opera¸c˜ao kernel n˜aopossui restri¸c˜oesde acesso, uma das metas da demonstra¸c˜ao´epermitir a execu¸c˜aodo programa sem problemas, tanto a n´ıvel de permisss˜oescomo no funcionamento dos mecanismos. E´ importante referir que a fun¸c˜ao matem´aticafactorial necessita de acesso `apilha STACK de forma a poder guardar os resultados e retornos das chamadas recursivas de forma estruturada.

Um requisito da utiliza¸c˜aoda STACK ´ea inicializa¸c˜aodo registo $sp com um endere¸co para uma zona de mem´oriaque disponha de espa¸colivre. Para resolver este problema, ser´autilizado um mapeamento “hardcoded” no simulador, de uma p´aginaf´ısica na TLB, dentro do segmento KSEG3. No bloco de c´odigoseguinte pode-se ver os mapeamentos introduzidos na TLB.

//TLB − Mapeamentos #define tlb map entryHI 0 0xE0000000//Pagina Virtual+ ASID+ FLAGS #define tlb map entryLO0 0 0x00000100//Pagina Fisica Par #define tlb map entryLO1 0 0x00000140//Pagina Fisica Impar #define tlb map mask 0 0x00001800//Paginas de4k Listing 5.1: Mapeamentos na TLB para demonstra¸c˜ao1.

Sem o mapeamento, o programa n˜aofuncionar´acorrectamente, uma vez que o endere¸co virtual apontado pelo $sp, ser´autilizado para guardar informa¸c˜aoe caso aponte para uma zona de c´odigoou uma zona n˜aomapeada, levar´ao programa a um estado de erro.

Em sistemas operativos Linux, cada processo det´emuma ´areareservada para STACK no seu espa¸code endere¸camento para ambos os modos, user e kernel, sendo ambas mapeadas na TLB. De forma a ultrapassar este problema, optou-se pelo mapeamento pr´ecarregado na TLB do processador.

O comando seguinte exemplifica a forma como se iniciar´ao exemplo1.

./SimuladorUE exemplos/bin/exemplo1.bin

Na figura 5.4 pode-se ver a janela com a execu¸c˜aodo programa exemplo11. Ap´oso arranque do programa, ´eposs´ıvel visualizar em tempo real as instru¸c˜oesque v˜aosendo executadas no processador.

1O c´odigofonte do programa pode ser consultado no AnexoB. 144 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.4: Execu¸c˜aodo exemplo 1. 5.2. DEMONSTRAC¸ OES˜ 145

Figura 5.5: Valida¸c˜aodos resultados.

Uma vez que este ´eum programa relativamente simples, o objectivo principal consiste em validar se o simulador foi capaz de executar o c´odigocompletamente, confirmando o valor final no registo $v0. Como se pode ver na figura 5.5, no argumento $a0, o programa c´alculao factorial de seis, sendo o seu resultado 720.

Na figura 5.5 s˜aoapresentados os estados dos registos gen´ericos do processador, e ´e poss´ıvel confirmar o valor do registo $v0 com o resultado 720. O registo $sp possui o valor actual da pilha, encontrando-se com o valor inicial, uma vez que todos os dados introduzidos foram removidos com a execu¸c˜ao.Relativamente ao registo $ra, este possu´ı o valor do endere¸code retorno da ´ultimainstru¸c˜aoJAL executada, como se pode ver na figura 5.5.

Desta forma, no primeiro exemplo, o simulador ´ecapaz de executar c´odigobin´arioutili- zando mecanismos complexos, como exemplo as fun¸c˜oesrecursivas do qual practicamente 146 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA todas as fun¸c˜oesminimamente elaboradas necessitam. E´ igualmente poss´ıvel a execu¸c˜ao de c´odigobin´arioem modo kernel, alimentado apenas pelos bits StatusKSU e com acesso exclusivo a zonas de mem´oria kernel.

5.2.2 C´alculoda sequˆenciade Fibonacci em modo e zona de User

O segundo exemplo possui um objectivo semelhante ao utilizado na primeira demons- tra¸c˜ao,mas com uma ligeira modifica¸c˜ao.A diferen¸caconsiste no facto de o programa correr inteiramente em segmentos de mem´oriade user e em modo user.

Da mesma forma que o exemplo anterior, a demonstra¸c˜aofoi compilada directamente atrav´esdo mips-linux-gnu-as e possui as seguintes caracter´ısticas:

• E´ responsabilidade do programa a configura¸c˜aoinicial do processador;

• O programa ser´aexecutado em modo user;

• Ser˜aoutilizados exclusivamente endere¸cosdentro do espa¸code endere¸camento user para execu¸c˜aodo programa;

• Ser˜aopr´edefinidos no simulador mapeamentos na TLB para utiliza¸c˜aoda ´area de c´odigo,assim como da STACK para o modo user;

• O ponto de entrada do programa ser´ao endere¸co0x80000000;

• Ser´aexecutado o programa com a sequˆenciade Fibonacci do n´umeroquinze;

Como a presente demonstra¸c˜aon˜aodisp˜oede uma mem´oriaROM, ´enecess´arioinicializar o estado do processador para modo user, sendo obrigat´orioalterar os bits StatusKSU para 0b10, StatusEXL e StatusBEV para zero.

O programa arranca inicialmente para o endere¸co0x80000000, no qual ser´aexecutada uma rotina de inicializa¸c˜aodo processador em modo kernel, uma vez que o StatusERL se encontra activo. Ap´osa inicializa¸c˜aodo processador, o registo ErrorEPC ´emodificado com o endere¸codo programa, nomeadamente 0x00400000, sendo em seguida executada a instru¸c˜aoERET com o objectivo de alterar o PC, para em seguida passar para o modo user.

Ser´autilizado apenas o segmento de mem´oriaUSEG para guardar as p´aginascom o c´odigobin´ariodo programa Fibonacci, assim como os dados referentes `apilha STACK. Dado que todo o c´odigoarranca directamente para uma zona de mem´oriamapeada, ´enecess´arioque o simulador possua inicialmente duas p´aginasalocadas na TLB, de 5.2. DEMONSTRAC¸ OES˜ 147

forma a permitir o carregamento e execu¸c˜aodo programa. O bloco de c´odigoseguinte, apresenta os mapeamentos efectuados na TLB pelo o simuladorUE no seu arranque. //TLB − Mappings #define tlb map entryHI 0 0x7FFFE000//Pagina Virtual+ ASID+ FLAGS #define tlb map entryLO0 0 0x00000100//Pagina Fisica Par #define tlb map entryLO1 0 0x00000140// Pagina Fisica Impar #define tlb map mask 0 0x00001800// Paginas de4k

#define tlb map entryHI 1 0x00400000// Pagina Virtual+ ASID+ FLAGS #define tlb map entryLO0 1 0x00000080// Pagina Fisica Par #define tlb map entryLO1 1 0x000000C0// Pagina Fisica Impar #define tlb map mask 1 0x00001800// Paginas de4k Listing 5.2: Mapeamentos na TLB para demonstra¸c˜ao2.

Assim como acontece com a fun¸c˜aoFactorial, a fun¸c˜aoFibonacci requer a utiliza¸c˜ao da pilha igualmente de forma a poder guardar os resultados e retornos de chamadas recursivas de forma estruturada. Da mesma forma, sem os mapeamentos o programa n˜aofuncionar´acorrectamente, uma vez que o endere¸covirtual apontado pelo $sp ser´a utilizado para guardar informa¸c˜ao. Caso este aponte para uma zona de c´odigo,zona n˜aomapeada ou zona de mem´oriasem permiss˜oes,levar´ao sistema a um estado de erro, podendo em alguns casos gerar um excep¸c˜aodo tipo Address Error ou TLB Refill Exception.

Para executar o programa do exemplo dois, basta correr o comando: ./SimuladorUE exemplos/bin/exemplo2.bin

Na figura 5.6, pode-se ver a execu¸c˜aodo programa exemplo 22. Ap´oso arranque do programa, ´eposs´ıvel observar as instru¸c˜oesque v˜aosendo executadas no processador em tempo real. Relativamente ao programa anterior, este ´eum pouco mais complexo uma vez que requer mais compara¸c˜oese chamadas recursivas. Da mesma forma que a demonstra¸c˜aoanterior, o objectivo final consiste em validar se o simulador foi capaz de executar o c´odigocompletamente, confirmando o valor final no registo $v0.

Na figura 5.7, pode-se ver o valor de todos os registos gen´ericos,incluindo o registo $v0, no qual ´eposs´ıvel confirmar que Fibonacci de 15 ´eigual a 610.

No registo $sp podemos ver o valor actual da pilha, encontrando-se com o valor inicial uma vez que todos os dados introduzidos foram removidos com a execu¸c˜ao.Neste exem- plo, o valor do $sp difere do valor da demonstra¸c˜aoanterior uma vez que o segmento

2O c´odigofonte do programa pode ser consultado no apˆendiceC. 148 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.6: Execu¸c˜aodo exemplo2. 5.2. DEMONSTRAC¸ OES˜ 149

Figura 5.7: Registos gen´ericos. 150 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.8: Registos internos do coprocessador zero. 5.2. DEMONSTRAC¸ OES˜ 151 mapeado KSEG3 foi modificado para o segmento USEG, respectivamente 0xE0000100 para 0x7FFFEFFC.

Como se pode ver no segundo exemplo, o simulador permite a configura¸c˜aoe execu¸c˜aode c´odigobin´ario,no qual ´eposs´ıvel a execu¸c˜aode programas relativamente longos, uma vez que s˜aonecess´ariasaproximadamente trinta mil instru¸c˜oespara correr o Fibonacci(15). Na sua execu¸c˜ao,a fun¸c˜aoFibonacci consome exclusivamente recursos em modo de user, nomeadamente no segmento de mem´oriaUSEG.

Na figura 5.8, pode-se verificar o valor dos registos internos do coprocessador zero, no qual assentam os modos de execu¸c˜aoe estados do processador.

5.2.3 Casos de erro e mecanismos MIPS

Em oposi¸c˜aoaos dois exemplos anteriores, a presente demonstra¸c˜aotem como objectivo a gera¸c˜aode v´arioserros, for¸cando o programa em execu¸c˜aoa proceder ´acorrec¸c˜aodos respectivos erros atrav´esdos mecanismos definidos na arquitectura MIPS32.

O programa da presente demonstra¸c˜aofoi compilado directamente atrav´es do compilador mips-linux-gnu-as e possui as seguintes caracter´ısticas:

• E´ responsabilidade do programa a configura¸c˜aoinicial do processador;

• O programa ser´aexecutado utilizando ambos os modos user e kernel;

• Ser˜aoutilizados endere¸cosdentro do espa¸code endere¸camento de user e kernel;

• Ser˜aoutilizados pr´emapeamentos na TLB atrav´es do simulador para as ´areas STACK e USER CODE, sendo adicionados novos mapeamentos na execu¸c˜aodo programa;

• O ponto de entrada do programa ser´ao endere¸co0x80001000;

• Ser˜aogeradas v´ariassitua¸c˜oesde erro no qual a arquitectura dever´aser capaz de disponibilizar mecanismos para tratamento.

A demonstra¸c˜aofuncionar´ade forma diferente das anteriores, sendo gerado um erro de cada vez, demonstrando assim um exemplo do seu funcionamento. Atrav´esdos me- canismos fornecidos pela arquitectura MIPS32 ser˜aoefectuados para cada caso a sua correc¸c˜ao.

O programa iniciar´aa sua execu¸c˜aono endere¸co0x80001000, sendo efectuado em pri- meiro lugar a configura¸c˜aodo processador, come¸candoem seguida o processo de gera¸c˜ao 152 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.9: Excep¸c˜aoMachine Check. de estados de erros. A configura¸c˜aodo processador consistir´asimplesmente no desligar dos bits que possam influenciar os modos de opera¸c˜aoou o mecanismo de tradu¸c˜aode endere¸cos,nomeadamente: StatusKSU, StatusEXL, StatusERL e StatusBEV. A confi- gura¸c˜aodos bits encontra-se no bloco de c´odigono anexoD na etiqueta “Config” (linha 24).

O primeiro erro ser´aa gera¸c˜aoda excep¸c˜ao Machine Check em modo kernel. Como vimos na sec¸c˜ao 4.1.8, a excep¸c˜ao Machine Check ocorre sempre que existam inconsistˆenciasno processador ou na TLB. De forma a possibilitar a demonstra¸c˜aodeste comportamento, ser˜aointroduzidos dois mapeamentos iguais na TLB, for¸candoa ocorrˆenciada referida excep¸c˜ao.

No anexoD pode-se ver o bloco de c´odigo referente aos mapeamentos introduzidos na TLB na etiqueta “MCheck” (linha 67) e consequente gera¸c˜aodo estado de erro. Na figura 5.9 pode-se ver os registos do coprocessador central, no qual ´eposs´ıvel confirmar que o StatusTS se encontra activo no momento da excep¸c˜ao,quando executada a segunda instru¸c˜aoTBLWI. 5.2. DEMONSTRAC¸ OES˜ 153

Figura 5.10: Excep¸c˜aoAddress Error.

Como se pˆodeobservar em 4.3.2, na execu¸c˜aode instru¸c˜oesde escrita na TLB, nome- adamente em TLBWI ou TLBWR, ´eefectuado a valida¸c˜aoda mesma, sendo gerada a excep¸c˜ao Machine Check caso exista uma inconsistˆencia. E´ de notar que na gera¸c˜aoda excep¸c˜aoo PC ´emodificado para o endere¸co EBase + 0x180, perfazendo o endere¸co 0x80000180.

No anexoD, pode-se observar igualmente o c´odigode tratamento do programa no r´otulo “handle mcheck” (linha 177), sendo efectuado um simples flush do primeiro mapeamento como correc¸c˜aoda excep¸c˜ao.Ser´aigualmente efectuado a passagem de 1 para 0 do bit StatusTS.

Chama-se `aaten¸c˜aoque a permiss˜aona resolu¸c˜aodas inconsistˆenciaspor software na TLB ´edependente da implementa¸c˜ao. Para a revis˜aodois da arquitectura MIPS32, a detec¸c˜aoe tratamento, apenas pode ocorrer em instru¸c˜oesde escrita, designadamente TLBWI ou TLBWR. Os pr´oximosexemplos ser˜aoexecutados em modo user, uma vez que dizem respeito a mapeamentos de p´aginas,assim como o acesso sem permiss˜oesa de- terminados recursos do sistema. Assim, o c´odigodos pr´oximosexemplos ser´aexecutado 154 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.11: Excep¸c˜aoTLBL (TLB Refill). em espa¸code user come¸candono endere¸co0x00400000. O bloco de c´odigorespons´avel pela mudan¸cade modo de execu¸c˜aopode ser consultado no anexoD na etiqueta “Switch” (linha 41).

Como referido anteriormente, sempre que seja efectuado um pedido de LOAD ou STORE num determinado endere¸cosem permiss˜oes de acesso, a MMU ´erespons´avel por gerar uma excep¸c˜aodo tipo Address Error indicando o acesso n˜aoautorizado. Assim, de forma a demonstrar esta situa¸c˜aotentar-se-´aaceder ao endere¸co0x80002000 (.data) atrav´es do modo de execu¸c˜ao user.

Como indicado, este ´eum modo de execu¸c˜aomenos privilegiado, sem autoriza¸c˜aode acesso ao espa¸code endere¸camento kernel. Na tentativa de acesso ser´agerada uma excep¸c˜aodo tipo AdEL, sendo o PC modificado para o endere¸co EBASE + 0x180, perfazendo 0x80000180 como se pode observar na figura 5.10. O tratador utilizado para resolver este caso ir´asimplesmente somar quatro bytes ao valor de retorno do EPC, de forma a fazer o bypass da instru¸c˜aogeradora do erro.

Chama-se ´aaten¸c˜aoque o c´odigoutilizado para resolver o problema de acesso indevido 5.2. DEMONSTRAC¸ OES˜ 155

Figura 5.12: Excep¸c˜aoCoprocessor Unusable.

´eexclusivo do sistema operativo, sendo neste caso utilizado para demonstrar a sua existˆenciae funcionamento. Na etiqueta “handle adel” (linha 152) no anexoD, pode-se observar o bypass da excep¸c˜aono c´odigodo tratador.

Uma das excep¸c˜oes que mais vezes ocorre num sistema operativo ´esem d´uvidaa excep¸c˜ao TLB Refill, dado que esta ´einvocada v´ariasvezes em cada mudan¸cade contexto na TLB. De forma a exemplificar o seu comportamento ser˜aoefectuados acessos a dados existentes na STACK, cujo mapeamento ser´aremovido pr´eviamente da TLB.

Na figura 5.11 pode-se observar a gera¸c˜aoda excep¸c˜ao TLB Refill, no qual se pode ver o endere¸covirtual da instru¸c˜aogeradora da excep¸c˜ao,assim como o endere¸covirtual que o processador n˜aoconseguiu aceder (BadVAddr).

O c´odigobin´ariodo tratamento da excep¸c˜aopode ser consultado no anexoD em “.section .TLBrefill” (linha 245), consistindo no remapeamento da STACK na TLB. Em oposi¸c˜ao das excep¸c˜oesanteriores, a TLB Refill possui um ponto de entrada diferente caso o StatusEXL se encontre desligado, nomeadamente o endere¸co EBASE + 0x00, o que perfaz o endere¸covirtual 0x80000000. 156 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.13: Excep¸c˜aoSystem Call.

A demonstra¸c˜aoda TLB Refill n˜aotem por objectivo a programa¸c˜aode algoritmos com- plexos de gest˜aode mem´oria,mas sim a exemplifica¸c˜aodo funcionamento do mecanismo. Sempre que este tipo de situa¸c˜aoocorre o sistema operativo ´erespons´avel por introduzir um mapeamento novo na TLB.

Uma vez que o programa se encontra a correr em modo de execu¸c˜ao user com os bits StatusCU 3..0 ligados, ´eposs´ıvel aceder a determinadas funcionalidades no coprocessa- dor central. De forma a demonstrar a restri¸c˜aono acesso `asreferidas funcionalidades ´enecess´ariodesligar estes bits. Ap´osdesactivar os bits StatusCU, tentar-se-´aa modi- fica¸c˜aodo modo de execu¸c˜aode user para kernel, de forma a obter-se novamente acesso privilegiado a todas as funcionalidades no processador.

No anexoD na etiqueta “cpuerror” (linha 224) pode-se observar a tentativa de modi- fica¸c˜aodos bits StatusKSU para 0b00. Tal modifica¸c˜aon˜aopode ocorrer a partir do modo de execu¸c˜ao user dado que seria uma enorme falha de seguran¸capara o sistema. Na figura 5.12 pode-se observar a gera¸c˜aoda excep¸c˜aona execu¸c˜aodo programa no simulador.

De forma semelhante que excep¸c˜ao Address Error ´eresponsabilidade do sistema opera- 5.2. DEMONSTRAC¸ OES˜ 157 tivo decidir o que fazer com o programa gerador da excep¸c˜ao.Mais uma vez, neste caso ser´afeito novamente o bypass das instru¸c˜oesproblem´aticascomo se pode ver na etiqueta “handle cpu” (linha 169) no anexoD.

Por ´ultimotˆem-sea execu¸c˜aodo mecanismo mais conhecido na ´areados sistemas ope- rativos, nomeadamente as chamadas ao sistema Syscall. O seu funcionamento ´erelati- vamente simples, uma vez que a execu¸c˜aoda instru¸c˜aoSYSCALL invoca directamente uma excep¸c˜aono processador, sendo o PC modificado para o endere¸co EBASE + 0x180 que perfaz 0x80000180.

Na figura 5.13 pode-se observar a gera¸c˜aoda excep¸c˜aona execu¸c˜aodo programa no simulador. De forma a terminar a execu¸c˜aodo programa ´eexecutada uma SYSCALL, atrav´esdo modo user sem permiss˜oesnos bits StatusCU, que ir´asimplesmente escrever o valor cinco no registo $v0. O c´odigo bin´ariodo tratamento da excep¸c˜aopode ser consultado na etiqueta “handle syscall” (linha 160) no anexoD.

Como se pode observar no c´odigo do tratador “handle syscall”, a instru¸c˜aoSYSCALL possui apenas uma fun¸c˜ao,designadamente escrever o valor cinco no registo $v0, contra- riamente ao que acontece em sistemas operativos reais, como o Linux, no qual possuem nesta localiza¸c˜ao,uma tabela de mapeamentos para os tratadores das chamadas ao sis- tema implementadas. Chama-se no entanto `aaten¸c˜ao,para a necessidade de modifica¸c˜ao do registo EPC na excp¸c˜aoSYSCALL, uma vez que o endere¸code retorno aponta nova- mente para a mesma instru¸c˜ao.Assim, atrav´esde software o tratador da excep¸c˜aodeve ter este comportamento em considera¸c˜ao,somando quatro bytes ao valor de retorno.

5.2.4 C´alculode n´umerosprimos em C (GCC)

No presente exemplo tˆem-secomo objectivo a demonstra¸c˜aoda possibilidade de execu¸c˜ao de c´odigobin´ariogerado atrav´esde um compilador externo ao simulador. Desta forma, o programa utilizado na demonstra¸c˜ao,foi compilado directamente atrav´esdo compilador mips-linux-gnu-gcc e possui as seguintes caracter´ısticas:

• E´ responsabilidade do simulador a configura¸c˜aoinicial do processador;

• O programa ser´aexecutado em modo user;

• Ser˜aoutilizados endere¸cosdentro do espa¸code endere¸camento de user;

• Ser˜aoutilizados pr´emapeamentos na TLB atrav´esdo simulador;

• O ponto de entrada do programa depender´ado compilador GCC, aproximadamente 0x0040xxxx; 158 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

• Ser´afeita a valida¸c˜aose quatro n´umerosinteiros s˜aoprimos.

A configura¸c˜aodo processador ser´afeita directamente atrav´esdo simulador uma vez que o programa compilado atrav´esdo GCC n˜aotem em conta o estado do processador. Desta forma, os bits mais relevantes na configura¸c˜aodo processador ser˜aomodifica- dos pr´eviamente no simulador, nomeadamente: StatusKSU, StatusEXL, StatusERL e StatusBEV para 0b10, 0, 0 e 0 respectivamente.

Em oposi¸c˜aoaos exemplos anteriores, o processo de compila¸c˜aodifere, sendo utilizado o compilador para a linguagem C mips-linux-gnu-gcc e o linker mips-linux-gnu-ld. No bloco de c´odigoseguinte pode-se observar a forma como o exemplo quatro foi compilado.

#Compiladore Linker LK = mips−linux −gnu−ld GCC = mips−linux −gnu−gcc

BIN = bin SRC = s r c AUX = aux exemplo4 : # Compilar sem linkar $ (GCC) −EL −mips32r2 −mabi=32 −c $(SRC)/primos.c −o $(AUX)/exemplo4 .o

# Linkagem sem entry point $ (LK) −EL −N $(AUX)/exemplo4.o −o $(BIN)/exemplo4.bin Listing 5.3: Sequˆenciade compila¸c˜aopara a demonstra¸c˜ao4. (Makefile)

Inicialmente ponderou-se a gera¸c˜aode c´odigosem modifica¸c˜oes,mas uma vez que o com- pilador geraria um enorme conjunto de informa¸c˜aodesnecess´ariapara a demonstra¸c˜ao, mas necess´ariapara o loader do sistema operativo, esta op¸c˜aoteve de ser abandonada.

Optou-se assim por uma abordagem mais simples, nomeadamente na compila¸c˜aosem linkagem. Isto ´e,o compilador GCC, atrav´esda op¸c˜ao-c 3, apenas compilar´ao c´odigo C para c´odigom´aquina,sendo gerado um ficheiro do tipo “Relocatable”. Em seguida ´enecess´arioefectuar a linkagem do ficheiro gerado, criando um ficheiro execut´avel sem informa¸c˜oesdesnecess´arias,nomeadamente prepara¸c˜oesou referˆenciaspara bibliotecas dinˆamicas.

3No processo de compila¸c˜aodo c´odigofonte, apenas ´efeito o assemble do c´odigosem se efectuar a linkagem. 5.2. DEMONSTRAC¸ OES˜ 159

Figura 5.14: Registos gen´ericos.

O ponto de entrada utilizado para a execu¸c˜aodo programa ´edeixado inalterado, sendo o mesmo gerado pelo GCC. Como objectivo, o programa ir´avalidar se os n´umeros6, 7, 11 e 15 s˜aon´umerosprimos, sendo o seu resultado guardado no registo gen´erico$v0 para cada chamada da fun¸c˜ao.O programa n˜aofoi pensado para ser complexo mas sim poss´ıvel de correr dentro do simulador. Na figura 5.15 pode-se observar a execu¸c˜aodo programa no simulador4.

Na figura 5.14 pode-se ver o valor final dos registos gen´ericosdo processador. De forma a facilitar a interpreta¸c˜aoda execu¸c˜aodo c´odigo,foram introduzidas instru¸c˜oes assembly directamente no c´odigoC, como se pode ver no anexoE (linha5).

Estas instru¸c˜oestem como objectivo a intercep¸c˜aodo resultado, assim como do argu- mento utilizado, de forma a introduzir num registo tempor´ariopara apresenta¸c˜aocomo

4O c´odigofonte do programa pode ser consultado no AnexoE. 160 CAP´ITULO 5. UTILIZAC¸ AO˜ DO SISTEMA

Figura 5.15: Execu¸c˜aodo exemplo 4. se pode ver na figura 5.14. Desta forma, os resultados das quatro chamadas da fun¸c˜ao “primos” ser˜aoguardados dois a dois, nomeadamente o valor de retorno no registo par e o argumento no registo impar, come¸candono registo $t0.

Os valores de retorno iguais a dois indicam que o argumento ´eum n´umeroprimo uma vez que s´opossui dois divisores, nomeadmento o n´umeroum e ele pr´oprio. Nos casos em que o valor seja superior a dois, indica que o argumento n˜ao´eum n´umeroprimo, sendo o valor retornado o n´umerode divisores.

Como se pˆodeobservar com o presente exemplo, ´eposs´ıvel compilar c´odigona lingua- gem C, atrav´esdo compilador GCC com suporte para compila¸c˜aocruzada, para c´odigo bin´ariosendo poss´ıvel a sua execu¸c˜aono simulador, existindo no entanto, ainda alguns problemas na integra¸c˜aode ambos. Cap´ıtulo6

Conclus˜oes

Nesta tese desenvolveu-se um simulador da arquitectura MIPS32 revis˜ao2 com capaci- dade de execu¸c˜aoem modo user e kernel, incluindo os mecanismos de mem´oriavirtual e tradu¸c˜aode endere¸cos,excep¸c˜oese interrup¸c˜oes.A abordagem seguida teve em vista a flexibilidade na an´aliseda execu¸c˜aode c´odigoem oposi¸c˜aoao desempenho.

O simulador permite ler um ficheiro execut´avel no formato ELF, gerado por um compi- lador, e execut´a-lonum ambiente virtual controlado.

As sec¸c˜oes seguintes apresentam em maior detalhe os objectivos alcan¸cados(sec¸c˜ao 6.1 ), limita¸c˜oes(sec¸c˜ao 6.2), an´alisecomparativa com outras solu¸c˜oesexistentes (sec¸c˜ao 6.3) e finalmente t´opicosem aberto para trabalho futuro (6.4).

6.1 Objectivos alcan¸cados

Um dos objectivos colocados ´evirtualiza¸c˜aoda arquitectura MIPS32 revis˜ao2. Para o efeito ´enecess´ariocumprir um conjunto de requisitos m´ınimosimpostos pela arqui- tectura. Os requisitos referidos foram implementados com sucesso e enumeram-se em seguida:

ISA para a arquitectura MIPS32 revis˜ao2 O primeiro requisito consiste na implementa¸c˜aodo conjunto de instru¸c˜oesexisten- tes na arquitectura MIPS32 revis˜ao2, nomeadamente as instru¸c˜oesaritm´eticas,de

161 162 CAP´ITULO 6. CONCLUSOES˜

controlo do mecanismo de tradu¸c˜aode endere¸cos,saltos condicionais e incondicio- nais, assim como do controlo do fluxo de execu¸c˜aodo processador.

Simula¸c˜aodos pipelines Um aspecto muito importante ´ea simula¸c˜aodo comportamento da execu¸c˜aodas instru¸c˜oes dentro dos pipelines. Este comportamento ´erecriado atrav´esdo estado delay slot dentro da m´aquina de estados central no processador.

Registos gen´ericos Um dos pr´e-requisitosna implementa¸c˜aoda ISA ´eo conjunto de registos gen´ericos, nos quais ser˜aodepositadas a informa¸c˜aoproveniente da mem´oriaou gerada pelas instru¸c˜oes descritas na ISA.

Registos internos do coprocessador de controlo De forma semelhante aos registos gen´ericos, os registos internos do coprocessador de controlo, consistem num pr´e-requisiton˜aos´opara um subconjunto da ISA, mas igualmente para o PRA (Privileged Resource Architecture).

Modos de execu¸c˜ao O mecanismo respons´avel pela introdu¸c˜aodas funcionalidades de seguran¸ca,no- meadamente a restri¸c˜aode acessos a registos internos, assim como a zonas de mem´oria,s˜aoos modos de execu¸c˜aodo processador, designadamente: modo kernel e user.

Unidade de gest˜aode mem´oria A MMU ´eo mecanismo respons´avel pela valida¸c˜aoe tradu¸c˜aodos endere¸cospedi- dos pelo processador no acesso `amem´oria. Inerente ao seu funcionamento encontra-se os mecanismos de tradu¸c˜aode en- dere¸cos,FMT e TLB nos quais os mapeamentos para a mem´orias˜aoest´aticos e dinˆamicosrespectivamente. Uma vez que o simulador foi concebido para utilizar exclusivamente a TLB, o sistema virtualizado disp˜oede mecanismos de pagina¸c˜ao,com tamanhos iguais ou superiores a 4K.

Mecanismo de excep¸c˜oes Este ´esem sombra de d´uvidaso mecanismo mais importante no processador, no qual assentam v´ariosmecanismos como: syscalls, controlo do fluxo de execu¸c˜ao, interrup¸c˜oes,modos de execu¸c˜aoou Shadow Set’s.

Existem, no entanto, dois mecanismos considerados obrigat´oriospela revis˜ao2 que n˜ao foram implementados totalmente, nomeadamente o mecanismo de interrup¸c˜oes e o con- 6.2. LIMITAC¸ OES˜ 163 junto Shadow Set’s. Estas limita¸c˜oesser˜aodetalhadamente abordadas na sec¸c˜ao 6.2 deste cap´ıtulo.

Adicionalmente aos requisitos da arquitectura MIPS32, foi necess´arioemular quatro tipos de componentes f´ısicosde forma a possibilitar o funcionamento correcto de um sistema simples no simulador, nomeadamente: a placa m˜ae,processador gen´ericoMIPS, mem´oriaRAM e mem´oriaROM.

O simulador permite a execu¸c˜aode ficheiros bin´ariosexecut´aveis na norma ELF como argumentos, tornando poss´ıvel a execu¸c˜aode c´odigobin´ariogerado por qualquer com- pilador.

6.2 Limita¸c˜oes

Embora muitas das metas delineadas para o simulador tenham sido cumpridas, ficaram igualmente objectivos por cumprir. Desta forma, determinados aspectos da arquitectura MIPS32 Revis˜ao2 do simulador possuem limita¸c˜oesnos seus mecanismos, tal como na sua execu¸c˜aoe na sua implementa¸c˜ao.

Um exemplo deste comportamento, provavelmente o mais importante, ´eo facto de a implementa¸c˜aodo mecanismo de interrup¸c˜oesn˜aoter ficado completa. Uma vez que este mecanismo ´erespons´avel pela comunica¸c˜aoentre o processador e os v´ariosperif´ericos ligados no sistema, o seu impacto repercute-se no simulador e na pr´opria interac¸c˜aoentre o utilizador e o sistema virtualizado.

Associado `aespecifica¸c˜aoda arquitectura MIPS32, encontra-se o mecanismo de hardware conhecido como Shadow Set’s, no qual, para a revis˜aodois, ´eintroduzida uma grande optimiza¸c˜aoe diferencia¸c˜aona forma como s˜aosalvaguardados e repostos os registos gen´ericos,sempre que ocorrem excep¸c˜oesou interrup¸c˜oesno processador.

Tanto o mecanismo de interrup¸c˜oescomo os Shadow Set’s assentam sobre mecanismos priorit´arios,como o mecanismo de tradu¸c˜aode endere¸cosou o mecanismo de excep¸c˜oes. Por este motivo foram for¸cadosa ser implementados em ´ultimolugar, ficando a sua implementa¸c˜aoincompleta.

Por outro lado, para a especifica¸c˜aoda revis˜aodois, existem outros aspectos, como o coprocessador de v´ırgulaflutuante ou a mem´oria cache, os quais s˜aofuncionalidades desej´aveis em qualquer sistema real, mas sendo opcionais em contexto de simula¸c˜ao. Desta forma, ambos os mecanismos foram excluidos dos objectivos no processo de im- plementa¸c˜aodo simulador.

Ainda dentro das caracter´ısticasda arquitectura MIPS32 revis˜aodois, no mecanismo de 164 CAP´ITULO 6. CONCLUSOES˜ tradu¸c˜aode endere¸cosexiste a possibilidade de utiliza¸c˜aode p´aginasf´ısicase virtuais com tamanho igual a 1K (1024 bytes). O simulador foi concebido para correr um sistema operativo Linux, no qual a tendˆencia´eutilizar p´aginascom tamanho igual ou superior 4K, sendo as p´aginasde tamanho 1K utilizadas em sistemas menos complexos, como os microcontroladores. Desta forma, optou-se pelo n˜aosuporte `apagina¸c˜aocom p´aginas de tamanho 1K.

Uma limita¸c˜aodo sistema prende-se no facto de a representa¸c˜aodo mecanismo da TLB se encontrar implementada apenas para o modelo composto por um array simples, dado que a arquitectura MIPS32 disp˜oede configura¸c˜oesmais complexas da mesma, como array’s duplos ou com extens˜oes.

Relativamente `acomposi¸c˜aodo simulador, a sua maior limita¸c˜aoconsiste no conjunto de perif´ericosemulados, uma vez que o presente simulador apenas virtualiza quatro tipos de componentes, mormente: placa m˜ae1, processador MIPS gen´erico,mem´oriaRAM e ROM. Devido ao limitado conjunto de componentes emulados, o simulador n˜aoconsegue correr sistemas muito complexos, uma vez que n˜aodisp˜oede mem´oriaspermanentes (disco r´ıgido) nos quais possa carregar informa¸c˜ao,como bibliotecas de sistema ou um sistema operativo completamente funcional.

6.3 Compara¸c˜aocom trabalhos relacionados

Uma das aplica¸c˜oesdo simulador ´ea execu¸c˜aode um sistema operativo como o Linux, `asemelhan¸cado que acontece com emuladores mais avan¸cadoscomo o QEMU2 ou o GXemul3. Existem no entanto outros tipos de simuladores, que simulam igualmente a arquitectura MIPS32, mas com um objectivo pedag´ogico,nomeadamente o SPIM4 (A MIPS32 Simulator) ou o MARS5 (Mips Assembly and Runtime Simulator).

Estes dois ´ultimossimuladores, SPIM e MARS, apresentam um ambiente de desenvol- vimento com possibilidade de execu¸c˜aoe depura¸c˜aode c´odigo assembly MIPS.

Nestes simuladores, a simula¸c˜aoda arquitectura ´efeita atrav´esda interpreta¸c˜aodo c´odigofonte, sendo em seguida simulada a sua execu¸c˜ao. Por este motivo, em ambos os simuladores n˜ao´eposs´ıvel a execu¸c˜aode c´odigobin´ariogerado por outro tipo de compiladores, que n˜aoo do pr´opriosimulador, como por exemplo o compilador GCC. E´ tamb´emimportante referir que a arquitectura MIPS32 n˜aose encontra totalmente

1A placa m˜aeutilizada inspirou-se na motherboard Malta MIPS. 2Site oficial do simulador QEMU: http://wiki.qemu.org/Main_Page 3Site oficial do simulador GXemul: http://gxemul.sourceforge.net/ 4 Site oficial do simulador SPIM:http://pages.cs.wisc.edu/~larus/spim.html 5Site oficial do simulador MARS: http://courses.missouristate.edu/kenvollmar/mars/ 6.3. COMPARAC¸ AO˜ COM TRABALHOS RELACIONADOS 165 simulada, dado que alguns mecanismos como os modos de execu¸c˜ao,excep¸c˜oesou registos internos n˜aose encontram implementados.

O presente trabalho possui em comum alguns aspectos com os simuladores acima referi- dos, nomeadamente a possibilidade de execu¸c˜aoinstru¸c˜aoa instru¸c˜ao.

Embora existam algumas parecen¸cascom os emuladores anteriores, o objectivo do pre- sente trabalho consiste em subir um pouco mais a “fasquia”, de forma a permitir a emula¸c˜aocompleta de hardware com o objectivo de executar programas ou sistemas operativos desenhados para a arquitectura MIPS32, independentemente do tipo de com- pilador utilizado.

Simuladores mais poderosos como o QEMU ou GXemul, simulam n˜aouma mas v´arias arquitecturas, necessitando assim de um n´ıvel de portabilidade superior.

A forma que ambos utilizam para satisfazer esta necessidade, consiste na utiliza¸c˜ao de t´ecnicascomo a Dynamic Binary Translation, nas quais ´eposs´ıvel a cria¸c˜aode uma representa¸c˜aointerm´ediade instru¸c˜oes,conhecida como Micro code ou Micro Operations. A` semelhan¸cado que acontece com a linguagem de programa¸c˜aoJava, a utiliza¸c˜aode Micro code ´euma poderosa funcionalidade e vantagem na portabilidade do sistema, permitindo assim o mapeamento das instru¸c˜oesdo Micro code em fun¸c˜oesespec´ıficas, dependendo da arquitectura do sistema anfitri˜ao.

Uma vez que o presente trabalho apenas simula uma arquitectura em espec´ıfico,MIPS32, a utiliza¸c˜aode Micro code produziria desnecess´ariamente um maior overhead na gera¸c˜ao do c´odigono sistema anfitri˜ao.

Dado que a emula¸c˜aode sistemas se encontra com os n´ıveis de desempenho mais baixos nos tipos de virtualiza¸c˜aoactuais, existe uma enorme necessidade de optimiza¸c˜aodos emuladores. Desta forma, surgiram t´ecnicascomo o JIT (Just In Time), o LLVM (Low Level Virtual Machine) ou Nested Page Tables, nas quais ´eposs´ıvel optimizar a execu¸c˜ao dos sistemas virtualizados.

Ambos os emuladores QEMU ou GXemul tiram partido da DBT (Dynamic Binary Translation), n˜aos´opor motivos de portabilidade, mas igualmente com objectivo de optimizar o funcionamento do sistema, dado que com a Static Binary Translation n˜ao´e poss´ıvel, em determinadas situa¸c˜oes,aceder ao c´odigobin´ariocom uma s´opassagem.

Com a utiliza¸c˜aode DBT, ´eposs´ıvel integrar t´ecnicascomo a compila¸c˜aopor blocos de c´odigoou a compila¸c˜aode c´odigoem tempo de execu¸c˜ao,nomeadamente compila- dores JIT. Uma vez que o emulador desenvolvido no presente trabalho n˜aotira partido 166 CAP´ITULO 6. CONCLUSOES˜

@' 6A4 B12' $1C0 @' 6A4 B12' $1C0  6& ' D5E  6& 'E5

           

  !" ### !" ()

$%&' $%&'

0' 0  @' 6A4 B12' $1C0 @' 6A4 B12' $1C0 $012'  $012'   1      1     !13'4 !13'4

  50627& 85 & 9   50627& 85 & 9

   !13'4    !13'4

Figura 6.1: Tradu¸c˜aobin´ariadin˜amicados simuladores QEMU e SimuladorUE. de nenhuma representa¸c˜aointerm´edia atrav´esde Bytecode6, Micro code7 ou Bitcode8, a tradu¸c˜aodo c´odigobin´ario´efeita, de forma semelhante aos emuladores referidos an- teriormente, atrav´esdo mapeamento de instru¸c˜oesbin´ariaspara fun¸c˜oesdo n´ucleode execu¸c˜aodo processador desenvolvido na linguagem C/C++.

Na figura 6.1, podemos ver a forma como ´efeita a tradu¸c˜aodinˆamicabin´arianos simu- ladores QEMU e no simulador desenvolvido no presente trabalho.

Uma vertente directamente ligada `avirtualiza¸c˜ao,´ea emula¸c˜aode componentes f´ısicos, que ser´aligada ao simulador, permitindo o sistema h´ospede aceder aos mesmos.

Simuladores mais simples como o SPIM n˜aodisp˜oemde suporte para perif´ericoscomo discos r´ıgidos,placas de rede ou dispositivos USB, uma vez que a sua principal fun¸c˜ao´e valida¸c˜aodo c´odigo assembler MIPS. Existem, no entanto, simuladores no mesmo ˆambito, como o emulador MARS, que su- porta a integra¸c˜aode dispositivos ao simulador, mas de forma limitada.

Relativamente a simuladores mais complexos e completos, como QEMU e o GXemul,

6Representa¸c˜aointerm´ediautilizado pelo compilador da linguagem Java; 7Representa¸c˜aointerm´ediautilizado pelos simuladores QEMU e GXemul; 8Representa¸c˜aointerm´ediautilizado pelo compilador LLVM; 6.3. COMPARAC¸ AO˜ COM TRABALHOS RELACIONADOS 167 estes disp˜oemde um grande leque de dispositivos que o sistema h´ospede pode aceder. Exemplos destes dispositivos s˜ao:

• Placa m˜aeno qual todos os dispositivos ser˜aointerligados;

• Processador gen´ericoMIPS ou baseado num modelo espec´ıfico;

• Mem´oriaRAM;

• Placa gr´aficaatrav´esde adaptadores VESA, AGP ou PCI Express;

• Mem´oriaROM/EROM/EPROM ou EEPROM;

• Discos r´ıgidosatrav´esda implementa¸c˜aode controladoras como ICH ou PIIX;

• Controlo para ACPI (Advanced Configuration and Power Interface) atrav´esda implementa¸c˜aode controladoras como ICH ou PIIX;

• Placas de redes (NIC);

• Dispositivos USB;

• Dispositivos PCI;

• Dispositivos ISA;

• Dispositivos ´opticoscomo CD ROM/DVD;

Neste aspecto, existe uma grande desvantagem entre o presente simulador e os simulado- res complexos acima referidos, dado que a quantidade de dispositivos virtualizados pelo simulador ´ebastante reduzida. Da lista acima citada apenas um pequeno subconjunto se encontra actualmente suportado no simulador.

Um aspecto muito valorizado em qualquer produto desenvolvido ´ea sua componente gr´afica,com a qual o utilizador ir´ainteragir.

O presente simulador, de forma semelhante ao simulador QEMU, disp˜oede uma inter- face bastante simples, consistindo apenas na utiliza¸c˜aode uma consola do Linux para apresenta¸c˜aoe interac¸c˜aoentre o utilizador e o sistema h´ospede. Optou-se pela simplici- dade na interface gr´aficado simulador, dando uma maior prioridade na implementa¸c˜ao do n´ucleo de execu¸c˜aoe seus respectivos mecanismos. A interface difere da interface uti- lizada no simulador QEMU no modo como ´efeita a liga¸c˜aocom o sistema virtualizado. No caso do simuladorUE trata-se de um monitor para a m´aquinavirtual, enquanto que no simulador QEMU ´ecriado um interface s´erieao qual se liga um terminal.

Uma vez que o mecanismo de interrup¸c˜oesficou incompleto, n˜aofoi poss´ıvel implementar uma solu¸c˜aosemelhante `autilizada no simulador QEMU. 168 CAP´ITULO 6. CONCLUSOES˜

6.4 Trabalho Futuro

Em seguida ser˜aoidentificados alguns t´opicosque ficaram em aberto para desenvolvi- mento futuro.

Enriquecimento das funcionalidades do processador Em contexto de virtualiza¸c˜ao,o mecanismo de interrup¸c˜aodo processador n˜ao possui car´acterpriorit´ario,uma vez que o seu funcionamento assenta sobre meca- nismos mais importantes, nomeadamente os registos do coprocessador central ou o mecanismo de excep¸c˜oes. E´ claro que a sua utiliza¸c˜ao´ede suma importante, dado que sem esta n˜ao´eposs´ıvel a existˆencia de comunica¸c˜aoentre o processador emu- lado e os perif´ericosligados na placa m˜ae,designadamente os perif´ericosb´asicos de Input/Output (como o monitor, o rato ou o teclado). Temos a emula¸c˜aoda mem´oria cache, cujo o objectivo ´ea an´alisedo desempenho de algoritmos no que respeita `autiliza¸c˜aoda cache. De forma opcional, temos o coprocessador de v´ırgula flutuante interno no pro- cessador, cuja funcionalidade consiste na execu¸c˜aode opera¸c˜oesaritm´eticassobre n´umerosde v´ırgula flutuante.

Enriquecimento dos perif´ericosposs´ıveis de virtualizar No desenvolvimento do emulador, utilizou-se como referˆenciapara a placa m˜ae,a placa f´ısica Malta MIPS, sendo apenas um subconjunto das suas funcionalidades implementadas. Outro aspecto relevante ´eimplementa¸c˜aodestas funcionalidades, que atrav´esdo sistema de interrup¸c˜oespermitir˜aoa comunica¸c˜aoentre o utilizador e a m´aquina virtual dentro do emulador. Desta forma, ser´aposs´ıvel a liga¸c˜aode perif´ericos como: rato, teclado, monitor atrav´esde terminais, placa de rede, disco r´ıgidoou portas USB no sistema. Uma vez que o simulador n˜aodisp˜oede suporte para discos r´ıgidosnem para con- trolo da ACPI (Advanced Configuration and Power Interface), seria uma poderosa adi¸c˜aono emulador, o suporte para este tipo de componentes atrav´esda simula¸c˜ao da uma controladora do tipo ICH (Input/Output Controller Hub) ou PIIX (PCI IDE ISA Xcelerator), como objectivo a comunica¸c˜aoentre o processador e os pe- rif´ericosde Input/ Output.

Possibilidade de execu¸c˜aode sistemas operativos Linux Uma das grandes limita¸c˜oesno desenvolvimento do sistema h´ospede, foi o facto de este ter sido programado utilizando a linguagem assembler MIPS directamente, 6.4. TRABALHO FUTURO 169

dado que o Workbench mostrou-se inicialmente uma ferramenta muito sofisticada, devido `autiliza¸c˜aode bibliotecas dinˆamicasdo sistema. Oficialmente, o c´odigogerado por programas compilados pelo GCC corre fluente- mente no simulador, sendo o ´unico problema a referencia para fun¸c˜oesque n˜aose encontram carregadas na mem´oriado sistema. A tarefa de carregamento das bibli- otecas dinˆamicas,por exemplo o glibc, ´eresponsabilidade do sistema operativo, no qual o simulador apenas se limita a executar c´odigobin´ario. Actualmente, devido a alguns problemas na integra¸c˜aodo c´odigogerado pelo com- pilador GNU GCC, o simulador apenas suporta programas compilados pelo GCC no qual, o ponto de entrada assim como os endere¸cosutilizados sejam customizados. Para tal, ´enecess´ariocarregar todas as bibliotecas necess´ariascom o ficheiro que ser´aexecutado, uma vez que o simulador n˜aodisp˜oede suporte para mem´orias permanentes. Outra forma ´ea utiliza¸c˜aoda op¸c˜ao static na compila¸c˜aodo programa, for¸cando a linkagem de toda a biblioteca num ficheiro ´unicoexecut´avel, sendo uma op¸c˜ao pouco elegante. Desta forma, para que seja poss´ıvel a execu¸c˜aode um sistema operativo Linux no simulador, ´enecess´arioque a integra¸c˜aodo c´odigogerado por esta plataforma e as bibliotecas da qual estas dependem, se encontrem de alguma forma, carregadas na mem´oriado simulador.

Optimiza¸c˜aoda execu¸c˜aodo emulador Uma vez que os emuladores convencionais, cujo o funcionamento se baseia num ciclo de leitura, descodifica¸c˜aoe execu¸c˜ao,se encontram com o desempenho mais baixo nos tipos de virtualiza¸c˜ao,seria interessante introduzir optimiza¸c˜oestanto na execu¸c˜aocomo na portabilidade do emulador, que permitissem atingir n´ıveis satisfat´oriosna virtualiza¸c˜aode sistemas que possuam arquitecturas diferentes. Estes tipos de optimiza¸c˜aopoderiam ser, `asemelhan¸cado que acontece com o emulador QEMU, a tradu¸c˜aobin´ariadinˆamica,atrav´esda utiliza¸c˜aode bytecode e de um compilador JIT (Just In Time), ou atrav´esde t´ecnicasde optimiza¸c˜aode c´odigopara linguagens convencionais, como LLVM (Low Level Virtual Machine).

Bibliografia

[BE94] Farquhar Bunce, Philip and Erin. The Mips Programmer’s Handbook. Morgan Kaufmann, 1994.

[Bri03] Robert Britton. MIPS Assembly Language Programming. Prentice Hall, Illus- trated Edition, 2003.

[CgC] Vitaly Chipounov and george Candea. Dynamically translating x86 to LLVM using QEMU.

[Dan06] Sivarama P. Dandamudi. Guide to RISC Processors for Programmers and En- gineers. Springer, 2006.

[Gor04] Mel Gorman. Understanding The Linux Virtual Memory Manager. 2004.

[IA95] Inc IDT and Ltd Algorithmics. IDT R30xx Family Software Referenc Manual. Printice-Hall, 1 edition, 1995.

[JAM09] Carlos Ribeiro Lu´ısVeiga e Rodrigo Rodrigues Jos´eAlves Marques, Paulo Fer- reira. Sistemas Operativos. FCA - Editora de Inform´atica Lda, 1 edition, 2009.

[Lov10] Robert Love. Linux Kernel Development. Pearson Education, Inc, 3 edition, 2010.

[Mai] David Jo˜aoMaia. Arquitectura MIPS32. Semin´arios- Mestrado Engenharia Inform´atica.

[Mat02] Mat´ıas Zabalj´auregui. Hardware Assisted Virtualization Intel Virtualization Technology. MIPS Technologies, Inc, 1 edition, 2002.

171 172 BIBLIOGRAFIA

[MB] David Maia and Miguel Bar˜ao.MIPS32 Architecture Simulator. 2a Jornadas de Inform´atica da Universidade de Evora´ .

[Mic09] Microchip. PIC32 MX Family 5xx/6xx/7xx Data Sheet. Microchip Technology Inc, 2009.

[MMS01] Jeffrey Oldham Mark Mitchell and Alex Samuel. Advanced Linux Programing. David Dwyer, 1 edition, 2001.

[MT02] Inc MIPS Technologies. MaltaTM User’s Manual. MIPS Technologies, Inc, 1 edition, 2002.

[MT08] Inc MIPS Technologies. MIPS32 Instruction Set Quick Reference, 1 edition, 2008.

[MT10a] Inc MIPS Technologies. MIPS Architecture For Programmers, Volume I-A: Introduction to the MIPS32 Architecture. MIPS Technologies, Inc, 3 edition, 2010.

[MT10b] Inc MIPS Technologies. MIPS Architecture For Programmers, Volume II-A: The MIPS32 Instruction Set. MIPS Technologies, Inc, 3 edition, 2010.

[MT10c] Inc MIPS Technologies. MIPS Architecture For Programmers Volume III: The MIPS32 and microMIPS32 Privileged Resource Architecture. MIPS Technolo- gies, Inc, 3 edition, 2010.

[PH05] David A. Patterson and John L Hennessy. Computer Organization and Design - The Hardware/ Software Interface. Morgan Kaufmann, 2005.

[Sta01] Tool Interface Standards. Executable and Linkable Format (ELF). Portable Formats Specification, 1 edition, 2001.

[Sta05] William Stallings. Operating Systems, Internals and Design Principles. Prentice Hall, Illustrated Edition, 5 edition, 2005.

[Swe06] Dominic Sweetman. See MIPS Run - Second Edition. Denise E. M. Penrose, 2006.

[WGP] Rodolfo Wottrich, Thiago Genez, and Walisson Pereira. Uma Vis˜aoGeral Sobre Sistemas Virtualizados. Anexos

Anexo A

Compila¸c˜aode c´odigobin´ario- Makefile

Segue-se o conte´udodo ficheiro Makefile utilizado para gera¸c˜aodo c´odigobin´ariopara os exemplos demonstrados no cap´ıtulo5.

1# Compilacao Cruzada para arquitectura MIPS 2# Compilador Assembly 3 4 AC = mips−linux −gnu−as 5 LK = mips−linux −gnu−ld 6 OC = mips−linux −gnu−objcopy 7 GCC = mips−linux −gnu−gcc 8 9 CFLAGS = −c 10 CDEBUG = −g 11 12 BIN = bin 13 SRC = s r c 14 AUX = aux 15 16 cl e an : 17 rm −r f ∗˜ 18 rm −r f $ (BIN) /∗ 19 rm −r f $ (AUX) /∗

175 176 APENDICEˆ A. COMPILAC¸ AO˜ DE CODIGO´ BINARIO´ - MAKEFILE

20 rm −r f $ (SRC) /∗˜ 21 22 exemplo1 : 23 $ (AC) −EL −mips32r2 $(SRC)/exemplo1.asm −o $(AUX)/exemplo1.o 24 $ (LK) −EL −N −e 0x80000000 −Ttext=0x80000000 −Tdata=0 x80010000 25 $ (AUX) / exemplo1 . o −o $(BIN)/exemplo1.bin 26 27 exemplo2 : 28 $ (AC) −EL −mips32r2 $(SRC)/exemplo2.asm −o $(AUX)/exemplo2.o 29 $ (OC) −F e l f 3 2 −tradlittlemips −−remove−section=.reginfo 30 $(AUX)/exemplo2.o $(LK) −EL −N −e 0x80000000 −Ttext=0 x00400000 31 −Tdata=0x00410000 −−s e c t i o n −start=.config=0x80000000 32 $ (AUX) / exemplo2 . o −o $(BIN)/exemplo2.bin 33 34 exemplo3 : 35 $ (AC) −EL −mips32r2 $(SRC)/exemplo3.asm −o $(AUX)/exemplo3.o 36 $ (OC) −F e l f 3 2 −tradlittlemips −−remove−section=.reginfo $(AUX )/ 37 exemplo3 . o $ (LK) −EL −N −e 0x80001000 −Ttext=0x80001000 38 −Tdata=0x80002000 −−s e c t i o n −start=.TLBrefill=0x80000000 39 −−s e c t i o n −start=.userText=0x00400000 −−s e c t i o n −s t a r t 40 =.generalVector=0x80000180 $(AUX)/exemplo3.o −o $ (BIN) / 41 exemplo3 . bin 42 43 exemplo4 : 44 $ (GCC) −EL −mips32r2 −mabi=32 −c $(SRC)/primos.c −o 45 $ (AUX) / exemplo4 . o 46 $ (LK) −EL −N $(AUX)/exemplo4.o −o $(BIN)/exemplo4.bin 47 48 compile: clean exemplo1 exemplo2 exemplo3 exemplo4 Listing A.1: Ficheiro Makefile das demonstra¸c˜oes. Anexo B

C´odigoAssembler MIPS - Demonstra¸c˜ao1

O seguinte c´odigofonte assembler ´eutilizado para demonstrar o exemplo 1, no qual ´e configurado o processador no seu estado inicial sendo, em seguida executado o factorial do n´umeroseis. int f a c t ( int n) { i f (n<1) return ( 1 ) ; else return (n∗ f a c t (n−1) ) ; } Listing B.1: Demonstra¸c˜ao1 em C.

177 178 APENDICEˆ B. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 1

1 . s e t noat 2 .text 3 main :# Preparacao do Processador 4 5# valor den para teste,n=5 6 addi $a0,$zero ,6 7 8# STACK Pointer=0xE0000100 9 l u i $at , 0 xe000 10 ori $sp, $at, 0x0100 11 12 j a l FACT 13 nop 14 15 j END 16 nop 17 18 FACT: add $t0 ,$zero ,$a0# parametro 19 s l t i $t1 , $t0 , 1# if(n <1) 20 beq $t1 ,$zero ,ELSE# 21 nop 22# THEN 23 addi $v0,$zero ,1# returna1 24 jr $ra# 25 nop 26 27 ELSE : addi $sp , $sp ,−8# alocar espaco na STACK 28 sw $a0 , 4( $sp )# guarda parametron 29 sw $ra , 0( $sp )# guarda registo de retorno 30 31 add $a0 , $t0 ,−1# passao(n −1) como parametro 32 nop 33 j a l FACT# chama procedimento FACT novamente 34 nop 35 36 lw $ra , 0( $sp )# restaurao valor de $ra 37 lw $a0 , 4( $sp )# restaurao valor de $a0 38 addi $sp , $sp , 8# desaloca pilha 39 40# multiplicacao 41 add $t2 ,$zero ,$zero# variavel temporariaX 42 add $t3 ,$zero ,$zero# contador=0 43 44 FOR:#n ∗$v0 179

45 beq $t3 , $a0 , FIMFOR# condicao de saida do loop 46 nop 47 add $t2, $t2, $v0#x+=v0 48 addi $t3 , $t3 , 1# contador ++ 49 j FOR# loop 50 nop 51 52 FIMFOR: add $v0,$t2 ,$zero# resultado 53 jr $ra# returnan ∗ f a c t(n −1) 54 nop 55 56 END: Listing B.2: Demonstra¸c˜ao1 em Assembly MIPS.

Anexo C

C´odigoAssembler MIPS - Demonstra¸c˜ao2

O seguinte c´odigofonte assembler ´eutilizado para demonstrar o exemplo 2, no qual ´e configurado o processador no seu estado inicial, sendo em seguida executado o factorial do n´umeroseis. int f i b o n a c c i ( int n) { i f n == 0 return 0 ;

i f (n < 2) return 1 ;

return fibonacci(n − 1) + fibonacci(n − 2) ; }

# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610 Listing C.1: Demonstra¸c˜ao2 em C.

181 182 APENDICEˆ C. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 2

1 . s e t noat 2 .text 3 main : addi $a0,$zero ,15# valor den para teste,n=8 4 5 l u i $at , 0 x 7 f f f 6 ori $at, $at, 0xeffc 7 add $sp , $0 , $at 8 9 j a l f i b 10 nop 11 12 j END 13 nop 14 15 f i b : beq $a0, $zero, zero 16 nop 17 18 s l t i $t0 , $a0 , 2# ifi < 2(i == 1) 19 beq $t0, $zero, cont# ifi >=2 salta para cont 20 nop 21 addi $v0, $zero, 1# else retorna1 22 23 jr $ra 24 nop 25 26 zero : addi $v0, $zero, 0# else retorna0 27 jr $ra 28 nop 29 30 cont : 31 32# Alocar espaco na STACK 33 34 addi $sp , $sp , −16#3 elementos paraa stack 35 sw $ra , 0( $sp )# Return Address 36 sw $a0 , 4( $sp ) 37 38# Chamadas recursivas 39 40 addi $a0 , $a0 , −1# calcularn − 1 41 j a l f i b# calcular fib(n − 1) 42 nop 43 183

44 sw $v0 , 8( $sp )# Guardar na STACKo resultado de fib (n − 1) 45 lw $a0 , 4( $sp )# Carregar valor den 46 47 addi $a0 , $a0 , −2# calcularn − 2 48 j a l f i b 49 nop 50 51 sw $v0, 12($sp)# Guardar na STACKo resultado de fib (n − 2) 52 53# Retirar valores 54#da STACK 55 56 lw $ra , 0( $sp )# Carregar return address 57 lw $t0 , 8( $sp )# Carregar valor de fib(n − 1) 58 lw $t1, 12($sp)# Carregar valor de fib(n − 2) 59 addi $sp , $sp , 16# Remover da STACK 60 61# Calculo 62 add $v0, $t0, $t1# fib(n − 1)+ fib(n − 2) 63 64 jr $ra 65 nop 66 END: 67 68 . s e c t i o n . c o n f i g 69# Configurar Processador 70# Obter registo Status 71 mfc0 $t6 , $12 , 0 72 73# Activar modo User KSU 74 ori $t6 , $t6 , 0b0000000000010000 75 76# Introduzir valor0x0040000 no ErrorEPC 77 l u i $at , 0x0040 78 ori $at, $at, 0x0 79 mtc0 $at , $30 , 0 80 81# Escrever Registo Status 82 mtc0 $t6 , $12 , 0#Escrever no coprocessador0 83 84 eret # Comecao programa Listing C.2: Demonstra¸c˜ao2 em Assembly MIPS.

Anexo D

C´odigoAssembler MIPS - Demonstra¸c˜ao3

O seguinte c´odigofonte assembler ´eutilizado para demonstrar o exemplo 3, no qual ´econfigurado o processador no seu estado inicial, sendo em seguida apresentado v´arios casos de erro, assim como mecanismos MIPS.

1 .data 2 i n f o : . a s c i i z ”SimuladorUE” 3 i n f o 2 : .word 10, 20, 30, 40 4 5 .text 6 . s e t noat 7 main :# Configurar processador 8 j a l Config 9 nop 10 11# Gerar excepcao Machine Check 12 j a l MCheck 13 nop 14 15# Modificar modo de execucao no processador 16 j a l Switch 17 nop 18

185 186 APENDICEˆ D. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 3

19 j end 20 nop 21 22# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 23 24 Config :# Configurar Processador 25 26# Obter registo Status 27 mfc0 $t6 , $12 , 0 28 29# Desligar StatusBEVe StatusERL 30 l u i $t0 , 0b1111111110111111 31 ori $t0 , $t0 , 0b1111111111111011 32 33 and $t6, $t6, $t0 34 35# Escrever Registo Status 36 mtc0 $t6 , $12 , 0#Escrever no coprocessador0 37 38 jr $ra# Comecao programa 39 40# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 41 42 Switch :# Mudar para modo User 43 44# Obter registo Status 45 mfc0 $t6 , $12 , 0 46 47# Deixar Bit CU3..0 activo 48 l u i $t0 , 0b0001000000000000 49 or $t6, $t6, $t0 50 51 ori $t6 , $t6 , 0b0000000000010010 52 53# Escrever Registo Status 54#Escrever no coprocessador0 55 mtc0 $t6 , $12 , 0 56 57 58# Introduzir valor0x0040000 no EPC 59 l u i $at , 0x0040 60 ori $at, $at, 0x0 61 mtc0 $at , $14 , 0 62 187

63 eret # Comecao programa em user 64 65# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 66 67 MCheck : addi $s0, $0, 0xF000#EntryHi 68 addi $s1, $0, 0x6000#EntryLo0 69 addi $s2, $0, 0x5000#EntryLo1 70 addi $s3, $0, 0x1000#PageMask 71 addi $s4 , $0 , 10#Index 72 73 mtc0 $s0 , $10 74 mtc0 $s1 , $2 75 mtc0 $s2 , $3 76 mtc0 $s3 , $5 77 mtc0 $s4 , $0 78 79 tlbwi 80 81 addi $s0, $0, 0xF000#EntryHi 82 addi $s1, $0, 0x6000#EntryLo0 83 addi $s2, $0, 0x5000#EntryLo1 84 addi $s3, $0, 0x1000#PageMask 85 addi $s4 , $0 , 11#Index 86 87 mtc0 $s0 , $10 88 mtc0 $s1 , $2 89 mtc0 $s2 , $3 90 mtc0 $s3 , $5 91 mtc0 $s4 , $0 92 93 tlbwi 94 nop 95 96 jr $ra 97# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 98 end : 99 100# 101# Handler do entry point0x8000.0180 102# 103 . s e c t i o n . g e n e r a l V e c t o r 104#Guardar na STACK os registos Status, EPCe afins 105 mfc0 $k0 , $14 , 0#Status EPC 106 sw $k0 , 0( $sp ) 188 APENDICEˆ D. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 3

107 addi $sp , $sp , −4 108 109 mfc0 $k0 , $13 , 0#Status Cause 110 sw $k0 , 0( $sp ) 111 addi $sp , $sp , −4 112# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 113 114 mfc0 $k0 , $13 , 0#Get Cause Register 115 andi $k0, $k0, 0b0000000001111100#Extrair ExcCode 116 117 addi $k1, $0, 0x08#Codigo do TLBL sem 118 beq $k0, $k1, handle t l b l#shift0x08= > 0x02 119 120 addi $k1, $0, 0x10#Codigo do AdEL sem 121 beq $k0, $k1, handle a d e l#shift0x10= > 0x04 122 123 addi $k1, $0, 0x20#Codigo do syscall sem 124 beq $k0, $k1, handle s y s c a l l#shift0x20= > 0x08 125 126 addi $k1, $0, 0x2c#Codigo do CpU sem 127 beq $k0, $k1, handle cpu#shift0x2c= > 0x0b 128 129 addi $k1, $0, 0x60#Codigo do MCheck sem 130 beq $k0, $k1, handle mcheck#shift0x60= > 0x18 131 132# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 133 134 return :# Repor os registos da STACK 135 addi $sp , $sp , 4 136 lw $t6 , 0( $sp ) 137 mtc0 $t6 , $13 , 0#Status Cause 138 139 addi $sp , $sp , 4 140 lw $t6 , 0( $sp ) 141 mtc0 $t6 , $14 , 0#Status EPC 142 143#Return paraa instrucao geradora do erro 144 eret 145 nop 146 147# −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 148 149 h a n d l e t l b l : j return 189

150 151 152 h a n d l e a d e l :# Incrementaro EPC em4 para fazero bypass 153 lw $k0 , 8( $sp )#EPC 154 addi $k0 , $k0 , 4#Bypass 155 sw $k0 , 8( $sp ) 156 157 j return 158 nop 159 160 h a n d l e s y s c a l l : addi $v0, $zero, 5 161 lw $k0 , 8( $sp )#EPC 162 addi $k0 , $k0 , 4#Bypass 163 sw $k0 , 8( $sp ) 164 165 j return 166 nop 167 168 169 handle cpu : lw $k0 , 8( $sp )#EPC 170 addi $k0 , $k0 , 4#Bypass 171 sw $k0 , 8( $sp ) 172 173 j return 174 nop 175 176 177 handle mcheck :# Desligar bit StatusTS 178 179 mfc0 $k0 , $12 , 0# Status 180 l u i $k1 , 0xFFDF# Mascara para TS 181 and $k0, $k0, $k1# Desligar TS 182 mtc0 $k0 , $12 , 0# Escrever Status 183# no coprocessador0 184 185# Apagaro primeiro mapeamento 186 addi $s0, $0, 0x00#EntryHi 187 addi $s1 , $0 , 10#Index 188 189 mtc0 $s0 , $10 190 mtc0 $s1 , $0 191 192 tlbwi 193 190 APENDICEˆ D. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 3

194 j return 195 196# 197# Segmento de Text User0x00400000 198# 199 . s e c t i o n .userText 200 201# Gerar erro AdEL 202 la $t0 , i n f o 203 lw $t1 , 0( $t0 ) 204 205# Gerar erro TLBL 206# Limpar mapeamento da STACKe tentar aceder 207 l i $t0 , 2048 208 sw $t0 , −32($sp ) 209 210# Remover mapeamento da Stack na TLB 211 addi $s0, $0, 0x00#EntryHi 212 addi $s4 , $0 , 0#Index 213 214 mtc0 $s0 , $10 215 mtc0 $s4 , $0 216 217 tlbwi 218 219 lw $t1 , −32($sp ) 220 221# Gerar erro Coprocessor Unusable 222# Remover permissao de modificao 223 224 cpuerror : mfc0 $t6 , $12 , 0# Status 225 226# Deixar Bit CU3..0 activo 227 l u i $t0 , 0b1110111111111111 228 ori $t0 , $t0 , 0b1111111111111111 229 and $t6, $t6, $t0 230 231# Escrever Status no coprocessador0 232 mtc0 $t6 , $12 , 0 233 234#A partir daqui da erro no acesso aos registos i n t e r n o s 235 mfc0 $t7 , $12 , 0# Status 236 191

237 u s e r e x i t : syscall 238 nop 239#Fim do programa 240 241 242# 243# Segmento de Text User0x80000000 244# 245 . s e c t i o n . T L B r e f i l l 246# Remapear pagina 247 l u i $s0 , 0x7FFF#EntryHi 248 ori $s0, $s0, 0xE000 249 250 l u i $s1 , 0x0000#EntryLo0 251 ori $s1, $s1, 0x0100 252 253 l u i $s2 , 0x0000#EntryLo1 254 ori $s2, $s2, 0x0140 255 256 l u i $s3 , 0x0000#PageMask 257 ori $s3, $s3, 0x1800 258 259 addi $s4 , $0 , 8#Index 260 261 mtc0 $s0 , $10 262 mtc0 $s1 , $2 263 mtc0 $s2 , $3 264 mtc0 $s3 , $5 265 mtc0 $s4 , $0 266 267 tlbwi 268 269#Return paraa instrucao geradora do erro 270 eret 271 nop Listing D.1: Demonstra¸c˜ao3 em Assembly MIPS.

Anexo E

C´odigoAssembler MIPS - Demonstra¸c˜ao4

O seguinte c´odigofonte assembler ´eutilizado para demonstrar o exemplo 4, no qual ´e configurado directamente no simulador o estado inicial do processador, sendo em seguida executada v´ariaschamadas de valida¸c˜aodos n´umerosprimos.

//#include

void main ( ) { int r e s ; res = primos(6); asm (”move $t0, $v0;”); asm (”li $t1, 6;”); //printf (” −> %d\n”, res);

res = primos(7); asm (”move $t2, $v0;”); asm (”li $t3, 7;”); //printf (” −> %d\n”, res);

res = primos(11); asm (”move $t4, $v0;”); asm (”li $t5, 11;”); //printf (” −> %d\n”, res);

193 194 APENDICEˆ E. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 4

res = primos(15); asm (”move $t6, $v0;”); asm (”li $t7, 15;”);

asm ( ” j end ; ” ) ; //printf (” −> %d\n”, res);

//return 2; }

//0 − primo //1 − nao primo int primos ( int num) { int r e s = 0 ;

int i =0; for ( i =1; i<=num ; i++){ i f ( (num% i) ==0 ) r e s += 1 ; }

//printf (” −> %d\n”, res); return r e s ; }

asm (”end: nop;”); Listing E.1: Demonstra¸c˜ao4 em C.

Segue-se o c´odigofonte desmontado atrav´esdo mips-gnu-linux-objdump: Disassembly of section .text :

00400090

: 400090: 27bdffd8 addiu sp , sp ,−40 400094: afbf0024 sw ra , 3 6 ( sp ) 400098: afbe0020 sw s8 , 3 2 ( sp ) 40009c: 03a0f021 move s8 , sp 4000a0: 0c100042 j a l 400108 4000a4: 24040006 l i a0 , 6 4000a8: afc20018 sw v0 , 2 4 ( s8 ) 4000ac: 00404021 move t0 , v0 4000b0: 24090006 l i t1 , 6 4000b4: 0c100042 j a l 400108 4000b8: 24040007 l i a0 , 7 195

4000bc: afc20018 sw v0 , 2 4 ( s8 ) 4000c0: 00405021 move t2 , v0 4000c4: 240b0007 l i t3 , 7 4000c8: 0c100042 j a l 400108 4000cc: 2404000b l i a0 , 1 1 4000d0: afc20018 sw v0 , 2 4 ( s8 ) 4000d4: 00406021 move t4 , v0 4000d8: 240d000b l i t5 , 1 1 4000dc: 0c100042 j a l 400108 4000e0: 2404000f l i a0 , 1 5 4000e4: afc20018 sw v0 , 2 4 ( s8 ) 4000e8: 00407021 move t6 , v0 4000ec: 08100064 j 400190 4000f0: 240f000f l i t7 , 1 5 4000f4: 03c0e821 move sp , s8 4000f8: 8fbf0024 lw ra , 3 6 ( sp ) 4000fc: 8fbe0020 lw s8 , 3 2 ( sp ) 400100: 03e00008 jr ra 400104: 27bd0028 addiu sp , sp , 4 0

00400108 : 400108: 27bdffe8 addiu sp , sp ,−24 40010c: afbe0014 sw s8 , 2 0 ( sp ) 400110: 03a0f021 move s8 , sp 400114: afc40018 sw a0 , 2 4 ( s8 ) 400118: afc00008 sw zero , 8 ( s8 ) 40011c: afc0000c sw zero ,12(s8) 400120: 24020001 l i v0 , 1 400124: afc2000c sw v0 , 1 2 ( s8 ) 400128: 08100059 j 400164 40012c: 00000000 nop 400130: 8fc30018 lw v1 , 2 4 ( s8 ) 400134: 8fc2000c lw v0 , 1 2 ( s8 ) 400138: 0062001a div zero , v1 , v0 40013c: 004001f4 teq v0,zero ,0x7 400140: 00001010 mfhi v0 400144: 14400004 bnez v0 ,400158 400148: 00000000 nop 40014c: 8fc20008 lw v0 , 8 ( s8 ) 400150: 24420001 addiu v0 , v0 , 1 400154: afc20008 sw v0 , 8 ( s8 ) 400158: 8fc2000c lw v0 , 1 2 ( s8 ) 40015c: 24420001 addiu v0 , v0 , 1 400160: afc2000c sw v0 , 1 2 ( s8 ) 196 APENDICEˆ E. CODIGO´ ASSEMBLER MIPS - DEMONSTRAC¸ AO˜ 4

400164: 8fc3000c lw v1 , 1 2 ( s8 ) 400168: 8fc20018 lw v0 , 2 4 ( s8 ) 40016c: 0043102a s l t v0 , v0 , v1 400170: 1040ffef beqz v0 ,400130 400174: 00000000 nop 400178: 8fc20008 lw v0 , 8 ( s8 ) 40017c: 03c0e821 move sp , s8 400180: 8fbe0014 lw s8 , 2 0 ( sp ) 400184: 27bd0018 addiu sp , sp , 2 4 400188: 03e00008 jr ra 40018c: 00000000 nop

00400190 : ... Listing E.2: Demonstra¸c˜ao4 em Assembly MIPS.