UNIVERSIDADE REGIONAL DE BLUMENAU CENTRO DE CIÊNCIAS EXATAS E NATURAIS CURSO DE CIÊNCIA DA COMPUTAÇÃO – BACHARELADO MATTOS VIRTUAL MACHINE (MVM): MÁQUINA VIRTUAL MOBILE ANDREY DE OLIVEIRA BLUMENAU 2012 2012/2-03 ANDREY DE OLIVEIRA MATTOS VIRTUAL MACHINE (MVM): MÁQUINA VIRTUAL MOBILE Trabalho de Conclusão de Curso submetido à Universidade Regional de Blumenau para a obtenção dos créditos na disciplina Trabalho de Conclusão de Curso II do curso de Ciência da Computação — Bacharelado. Prof. Mauro Marcelo Mattos, Doutor – Orientador BLUMENAU 2012 2012/2-03 MATTOS VIRTUAL MACHINE (MVM): MÁQUINA VIRTUAL MOBILE Por ANDREY DE OLIVEIRA Trabalho aprovado para obtenção dos créditos na disciplina de Trabalho de Conclusão de Curso II, pela banca examinadora formada por: Presidente: ______________________________________________________ Prof. Mauro Marcelo Mattos Orientador, Doutor – Orientador, FURB Membro: ______________________________________________________ Prof. Antonio Carlos Tavares, Mestre – FURB Membro: ______________________________________________________ Prof. Miguel Alexandre Wisintainer, Mestre – FURB Blumenau, 10 de dezembro de 2012 Dedico este trabalho a todos os amigos, especialmente aqueles que me ajudaram diretamente na realização deste. AGRADECIMENTOS A Deus, pelo seu imenso amor e graça. À minha família, que mesmo longe, sempre esteve presente. Aos meus amigos, pelos empurrões e cobranças. Ao meu orientador, Mauro Marcelo Mattos, por ter acreditado na conclusão deste trabalho. Ao meu amigo Marco Caramori pela consultoria e auxílio em diversos imprevistos. À amiga Sara Schmitt pelo auxílio nos testes do aplicativo. Não há nada que seja maior evidência de insanidade do que fazer a mesma coisa dia após dia e esperar resultados diferentes. Albert Einstein RESUMO Este trabalho apresenta a especificação e a implementação de uma máquina virtual denominada Mattos Virtual Machine (MVM) para o sistema operacional Android para o auxílio ao ensino de sistemas operacionais. São apresentadas as funções do aplicativo e as instruções que são suportadas pela máquina. O aplicativo foi desenvolvido em Java com suporte ao banco de dados Sqlite para armazenamento dos códigos desenvolvidos. Palavras-chave: Ferramenta de ensino. Máquina hipotética. Android. ABSTRACT This paper presents the specification and implementation of a virtual machine called Mattos Virtual Machine (MVM) for the Android operating system to aid teaching of operating systems. There are presented the application functions and instructions that are supported by the machine. The application was developed in Java with support for SQLite database for storage of codes developed. Key-words: Teaching tool. Virtual machine. Android. LISTA DE ILUSTRAÇÕES Figura 1 – Diagrama de funcionamento do Android. ............................................................... 14 Figura 2 - Classificação das tecnologias de virtualização. ....................................................... 18 Figura 3 – arquitetura geral da Mattos Virtual Machine .......................................................... 19 Figura 4 – Arquitetura do MVM .............................................................................................. 20 Figura 5 – Estrutura da MVM expressa em linguagem Java. ................................................... 21 Quadro 1 – Lista de comandos suportados pela máquina ........................................................ 21 Figura 6 – Simulador SOsim versão 1.2. .................................................................................. 25 Figura 7 – Tela inicial do HIPO ............................................................................................... 26 Figura 8 – Interface VXt cliente Java com registradores e log de instrução. ........................... 27 Figura 9 - Funcionamento do sistema ...................................................................................... 28 Figura 10 - Interface BrasilOS para simulação de escalonamento de processos..................... 29 Figura 11 - Resultado da simulação de escalonamento de processos....................................... 30 Figura 12 – Janela que simula o funcionamento do escalonamento circular com prioridade. . 31 Figura 13 – Exemplo de interface do SISO .............................................................................. 32 Figura 14 – Detalhamento do fluxo operacional do IO Simulator.. ......................................... 33 Figura 15 – Integração entre processador e sistema de entrada/saída ...................................... 34 Figura 16 – Tela principal do simulador de entrada e saída ..................................................... 35 Figura 17 – Protótipo do simulador .......................................................................................... 36 Figura 18 – Diagrama de classes .............................................................................................. 38 Quadro 2 – Controle das opções ............................................................................................... 39 Quadro 3 – Parte do código de execução do programa ............................................................ 40 Quadro 4 – Criação do banco de dados .................................................................................... 41 Figura 19 – Regiões da interface da MVM .............................................................................. 43 Figura 20 – Tela de criação do novo projeto ............................................................................ 43 Figura 21 – Tela de localização dos projetos já existentes ....................................................... 44 Figura 22 – Mensagem de erro durante a verificação .............................................................. 44 Figura 23 – Ciclo de busca, decodificação e execução ............................................................ 46 Figura 24 – Atribuição de valor imediato ................................................................................. 46 Figura 25 – Resultado das instruções da figura 24 ................................................................... 47 Figura 26 – Desvio incondicional imediato.............................................................................. 47 Figura 27 – Resultado das instruções da figura 26 ................................................................... 48 Figura 28 – Operação de pilha.................................................................................................. 48 Figura 29 – Resultado da execução do programa da figura 28. ............................................... 49 Figura 30 – Endereçamento por base e deslocamento .............................................................. 49 Figura 31 – Correção do exemplo de endereçamento por base e deslocamento ...................... 50 Figura 32 – Device driver ......................................................................................................... 51 Figura 33 – Resultado da execução do programa da figura 32 ................................................ 51 Quadro 5 – Código fonte de uma aplicação de chamada de interrupções por software ........... 52 Figura 34 – Percentual de aparelhos e suas determinadas versões do Android ....................... 54 LISTA DE SIGLAS ABI - Application Binary Interface API - Application Programming Interface APK - Android Package File BCC – Curso de Ciência da Computação – Bacharelado CPU - Central Processing Unit DSC – Departamento de Sistemas e Computação DVM - Dalvik Virtual Machine EDGE - Enhanced Data Rates for GSM Evolution FCFS - First Come, First Served GB - Giga Byte GHZ - Giga Hertz GSM - Global System for Mobile Communications IDE - Integrated Development Environment ISA - Instruction Set Architecture MMU - Memory Management Unit RAM - Random Access Memory ROM - Read Only Memory SBC – Sociedade Brasileira de Computação USB - Universal Serial Bus XMPP - eXtensible Messaging and Presence Protocol SUMÁRIO 1 INTRODUÇÃO .................................................................................................................. 12 1.1 OBJETIVOS DO TRABALHO ........................................................................................ 13 1.2 ESTRUTURA DO TRABALHO ...................................................................................... 13 2 FUNDAMENTAÇÃO TEÓRICA .................................................................................... 14 2.1 SISTEMA OPERACIONAL ANDROID ......................................................................... 14 2.2 MÁQUINAS VIRTUAIS .................................................................................................. 16 2.3 A MVM ............................................................................................................................. 19 2.4 TRABALHOS CORRELATOS ........................................................................................ 24 2.4.1 SOSIM ............................................................................................................................ 24 2.4.2 HIPO – O computador hipotético ................................................................................... 25 2.4.3 VXT ................................................................................................................................ 26 2.4.4 BrasilOS: ......................................................................................................................... 29 2.4.5 EPSOSIM ........................................................................................................................ 30 2.4.6 SISO – SIMULADOR DE SISTEMA OPERACIONAL............................................... 32 2.4.7 IO Simulator .................................................................................................................... 33 2.4.8 SOIS – Sistema Operacional Integrado Simulado .......................................................... 34 2.4.9 VM Simulator ................................................................................................................. 35 3 DESENVOLVIMENTO .................................................................................................... 37 3.1 REQUISITOS PRINCIPAIS DO APLICATIVO ............................................................. 37 3.2 DIAGRAMA DE CLASSES............................................................................................. 38 3.3 IMPLEMENTAÇÃO ........................................................................................................ 41 3.3.1 Técnicas e ferramentas utilizadas.................................................................................... 41 3.3.2 Operacionalidade da implementação .............................................................................. 42 3.3.3 Casos de testes ................................................................................................................ 45 3.4 RESULTADO E DISCUSSÃO......................................................................................... 52 4 CONCLUSÕES .................................................................................................................. 55 4.1 EXTENSÕES .................................................................................................................... 55 12 1 INTRODUÇÃO Conforme Gagné, Brigss e Wagner (1992 apud CASAS, 1999), instrução, no contexto da escola, é um processo oferecido por instrutores humanos e envolve o professor e o aprendiz. Os méritos da instrução proporcionada por professores humanos são os aspectos dinâmicos e interativos do ensino. Segundo Fagundes (1998) apud Veiga (2001), aprender por projetos é uma forma inovadora de romper com as tradições educacionais, dando um formato mais ágil e participativo ao trabalho de professores e educadores. Trata-se mais do que uma estratégia fundamental de aprendizagem, sendo um modo de ver o ser humano construir, aprendendo pela experimentação ativa do mundo. Ao elaborar seus projetos, o professor conduzirá seus alunos a um conjunto de interrogações, quer sobre si mesmo ou sobre o mundo à sua volta, levando o aluno a interagir com o desconhecido ou com novas situações, buscando soluções para os problemas. Conforme Maziero (2002), “uma das principais características da disciplina de sistemas operacionais é a relativa dificuldade em definir um sequenciamento didático claro entre seus diferentes tópicos”. Mattos (2012) vem utilizando conceitos de máquinas virtuais já há algum tempo em suas aulas de sistemas operacionais (Mattos et al., 2004). Recentemente ele adotou uma estratégia diferente: conduzir os acadêmicos ao longo de um semestre no processo de concepção de uma máquina virtual hipotética (denominada Mattos Virtual Machine ou MVM) sobre a qual são desenvolvidos os conceitos básicos da disciplina a partir de uma visão bottom-up. Ao término da atividade a MVM é promovida a: My Virtual Machine permitindo ao acadêmico apropriar-se do fato de que o mesmo foi capaz de construir a sua própria versão a partir da especificação original da MVM. Na perspectiva de ampliar as possibilidades de interesse dos alunos (já que as atividades de laboratório são desenvolvidas para desktops) e considerando a enorme expansão1 do mercado de dispositivos móveis considerou-se como uma oportunidade de pesquisa explorar a possibilidade de disponibilizar a MVM como infraestrutura para o desenvolvimento dos conceitos de sistemas operacionais nesta plataforma. 1 Segundo a Anatel (2009, p. 73), o Brasil fechou o ano de 2009 com 173,9 milhões de telefones celulares em operação, o que representa um crescimento de 15,47% em relação a dezembro de 2008, quando existiam no País 150,6 milhões de telefones móveis em funcionamento. 13 1.1 OBJETIVOS DO TRABALHO Este trabalho tem como objetivo desenvolver uma aplicação para o sistema operacional Android que simule uma máquina virtual hipotética destinada a atividades de ensino de conceitos básicos de sistemas operacionais. Os objetivos específicos podem ser detalhados da seguinte maneira: a) migrar a estrutura da MVM desktop para a plataforma Android; b) validar a aplicação através de estudos de casos. 1.2 ESTRUTURA DO TRABALHO O trabalho está organizado em quatro capítulos: introdução, fundamentação teórica, desenvolvimento e conclusão. O capítulo 2 apresenta os aspectos teóricos estudados para o desenvolvimento do trabalho. São relatados temas como linguagens de descrição e consulta para web semântica e processamento de linguagem natural. Também são relacionados alguns trabalhos correlatos. No capítulo 3 é abordado o desenvolvimento, detalhando os requisitos, a especificação e a implementação, além dos resultados e discussões. Por fim, no capítulo 4 são apresentadas as conclusões, bem como sugestões para possíveis extensões. 14 2 FUNDAMENTAÇÃO TEÓRICA A primeira seção apresenta os conceitos básicos sobre o sistema operacional Android. A segunda seção apresenta conceitos de máquina virtuais, a terceira seção introduz a estrutura da MVM e finalmente são apresentados trabalhos correlatos. 2.1 SISTEMA OPERACIONAL ANDROID O Android é um sistema operacional livre que roda sobre núcleo Linux desenvolvido por uma pequena empresa chamada Android Inc., criada em 2003 e situada em Palo Alto, Califórnia, USA (AQUINO, 2007). Em 2005 a Google adquiriu os direitos da empresa e iniciou o desenvolvimento do sistema operacional para o uso em celulares e demais dispositivos móveis. A Figura 1 mostra a estrutura do sistema Android. Fonte: Aquino (2007, p. 5). Figura 1 – Diagrama de funcionamento do Android A arquitetura do sistema operacional Android, segundo Aquino (2007, p. 5) é formada por camadas onde os níveis mais baixos são expostos para os níveis mais altos através de interfaces. A primeira camada é o núcleo do sistema (kernel) que funciona como uma camada de 15 abstração entre o hardware e o restante de softwares da plataforma. Utilizando Linux 2.6.27 ela é responsável pelo gerenciamento de memória, processos, threads, pilha de protocolos de rede, módulo de segurança e vários módulos do núcleo de infraestrutura. A segunda camada contém um conjunto de bibliotecas C/C++ usada por vários componentes do sistema e a Dalvik Virtual Machine (DVM). A DVM foi escrita de forma que um dispositivo possa executar múltiplas máquinas virtuais concorrentemente de maneira eficiente. Ela usa o kernel do Linux para prover a funcionalidade de múltiplas threads e gerenciamento de memória de baixo nível. Cada aplicação do Android roda em um processo separado, com sua própria máquina virtual, número do processo e dono do processo, isso garante que caso a aplicação apresente erros, ela possa ser isolada e removida da memória sem comprometer o resto do sistema. Ao desenvolver as aplicações em Java, a DVM compila o bytecode (.class) e converte para o formato Dalvik Executable (.dex), que representa a aplicação do Android compilada. Depois disso, os arquivos .dex e outros recursos do projeto são compactados em um único arquivo com a extensão Android Package File (.apk), que representa a aplicação final. A terceira camada é composta por frameworks de aplicações. Os desenvolvedores têm acesso completo à mesma interface de programação de aplicativos que é usada pelas aplicações essenciais da plataforma. Esta camada fornece um conjunto de serviço tais como Activity Manager, que gerencia o ciclo de vida das aplicações; Package Manager, que mantêm quais aplicações estão instaladas no dispositivo; Window Manager, que gerencia as janelas das aplicações; Telephony Manager, que são os componentes para acesso aos recursos de telefonia; Content Providers, que permitem que as aplicações acessem dados de outras aplicações ou compartilhem os seus próprios dados; Resource Manager, que fornece acesso aos recursos gráficos e arquivos de layout; View System, que é um conjunto rico e extensível de componentes de interface do usuário; Location Manager, que gerência a localização do dispositivo; Notification Manager, que permite que todas as aplicações exibam alertas na barra de status e XMPP Service que é o suporte para o uso do protocolo eXtensible Messaging and Presence Protocol (XMPP). A quarta camada é composta pelas aplicações propriamente ditas. A plataforma Android oferece suporte a diversas tecnologias de conectividade tais como Bluetooth, enhanced data rates for “global system for mobile communications” (GSM) 16 evolution (EDGE), 3G e Wi-Fi2. Este suporte disponibiliza a comunicação com a internet, podendo ser usado o conceito sockets, através da linguagem Java que é compilada e executada na DVM para realizar esta conexão com a rede mundial de computadores. 2.2 MÁQUINAS VIRTUAIS O termo máquina virtual foi descrito na década de 1960 como uma abstração de software para um sistema físico. A virtualização é obtida inserindo-se uma camada intermediária entre o hardware e o sistema operacional. Segundo Morimoto (2010), o sistema principal passa a ser um hospedeiro da máquina virtual, podendo acessar os recursos do sistema através de instruções lógicas definidas pela máquina virtual. Conforme Santos et al. (2006, p. 342), virtualização é o modo de apresentação ou agrupamento de um subconjunto lógico de recursos computacionais de modo que possam ser alcançados resultados e benefícios como se o sistema estivesse executando sobre a configuração nativa. Outro tipo popular de virtualização e atualmente muito utilizado é a virtualização de hardware para rodar mais de um sistema operacional ao mesmo tempo, através de microkernels ou de camadas de abstração de hardware, como por exemplo o XEN. A virtualização nativa, também conhecida como virtualização acelerada ou híbrida, é uma combinação de virtualização nativa e virtualização de I/O (entrada e saída). Tipicamente, este método é iniciado com um Virtual Machine Monitor (VMM) com suporte a virtualização completa, como o XEN (SANTOS et al., 2006, p. 342), por exemplo, e então, baseando-se na análise de desempenho, emprega as técnicas de aceleração. O uso do processador e também dos drivers de rede são os recursos mais comuns, onde é empregada a virtualização nativa (SANTOS et al, 2006, p. 344). Ainda conforme Santos et al. (2006, p. 342), há diversas formas de virtualização: a) emulação: a máquina virtual simula todo o hardware, permitindo que um sistema operacional sem modificações rode em um processador central completamente diferente do hardware nativo. Existem softwares desenvolvidos para emular a arquitetura X86, onde se simula simultaneamente mais de um sistema operacional. 2 Segundo Landim (2012) é uma marca registrada pela empresa Wi-Fi Alliance que permite a conexão entre diversos dispositivos sem fio. 17 O Bochs e PearPC são dois emuladores bastante conhecidos; b) virtualização nativa ou “virtualização cheia": a máquina virtual somente simula parcialmente o hardware para permitir que um Sistema Operacional sem modificações funcione isoladamente no hardware, mas o Sistema Operacional convidado deve ser projetado para o tipo de processador central. VMware, Parallels Desktop, Adeos, Mac-on-Linux são plataformas que constituem a virtualização nativa; c) paravirtualização: a máquina virtual não simula o hardware mas oferece preferencialmente uma Application Program Interface (API) especial que requer modificações no kernel do sistema operacional hóspede. O XEN é um exemplo de plataforma de virtualização, onde é permitida a execução de vários sistemas operacionais em um mesmo hardware ao mesmo tempo; d) virtualização no nível do sistema operacional: virtualiza-se um servidor no nível do sistema operacional, permitindo-se múltiplos isolamentos de modo seguro aos servidores virtualizados, em um único servidor físico. Os ambientes dos sistemas operacionais hóspedes são os mesmos que o do sistema hospedeiro, já que o mesmo kernel do hardware é usado para executar os ambientes no hospedeiro. (Linux-VServer, Virtuozzo e OpenVZ, Solaris Containers, User Mode Linux e FreeBSD Jails). Existem três características principais para que um software seja considerado um monitor de máquina virtual, quais sejam (ADAM e AGESEN; 2006): a) fidelidade: o software no monitor de máquina virtual executa identicamente a sua execução no hardware exceto pelas barreiras de tempo impostas pela virtualização; b) performance: a grande maioria das instruções do hardware virtual são executadas pelo hardware real sem a intervenção do monitor de máquina virtual; c) segurança: o monitor de máquina virtual gerencia todos os recursos do hardware virtual. A Figura 2 apresenta uma classificação das tecnologias de virtualização (SCOPE; 2008, p. 10). Esta classificação é baseada em software que fornece um Instruction Set Architecture (ISA) ou um Application Binary Interface (ABI). O lado esquerdo da figura caracteriza tecnologias que suportam máquinas virtuais e o lado direito caracteriza tecnologias que suportam processos que implementam máquinas virtuais. A principal diferença é que uma máquina virtual é auto contida, ou seja, necessita de todo o software necessário (sistema operacional) para executar uma aplicação enquanto um processo de máquina virtual suporta 18 somente aplicações. (ADAM e AGESEN; 2006) Fonte: Adams e Agesen (2006). Figura 2 - Classificação das tecnologias de virtualização A CPU3 de uma máquina virtual genérica tem como objetivo o processamento de instruções conforme uma máquina real. Ela simula os registradores e demais operações de uma máquina real mimetizando seus estados de memória e processamento. Em outras palavras, uma máquina virtual atua como uma camada, permitindo o tratamento e alterações de estados da máquina sem afetar diretamente a máquina real. Dentre as vantagens de uma máquina virtual, tem-se a mobilidade de código, uma vez que um programa não se torna dependente de um sistema operacional e sim de uma máquina virtual pré-programada, como é o caso do Java. 3 Central Processing Unit (CPU). 19 2.3 A MVM A Mattos Virtual Machine (MVM) é um exemplo acadêmico utilizado para propósitos educacionais que possibilita a implementação de um pequeno sistema operacional embarcado. Ao contrário do que é comumente utilizado (ver seção de trabalhos correlatos), em geral as propostas didáticas partem de um modelo concebido e permitem que o aluno exercite dentro de parâmetros pré-concebidos. Conforme Mattos (2012), em 2004 esta prática foi adotada em pelo menos dois projetos: Moritz (2004) e em Mattos et al (2004). A perspectiva acadêmica no projeto MVM é permitir que o aluno construa a sua própria máquina (daí a denominação “My Virtual Machine”) e, a partir desta construção possa acompanhar todo o processo de desenvolvimento dos conceitos de sistemas operacionais e a sua vinculação ao hardware. (MATTOS;2012). Um modelo hipotético de hardware é utilizado para permitir que o desenvolvimento do hardware e dos conceitos associados possam acontecer dentro de um semestre letivo.Em função disto, o modelo de arquitetura utilizado é apresentado na figura 3. Fonte: Mattos (2012). Figura 3 – arquitetura geral da Mattos Virtual Machine Conforme apresentado em aula (figura 4), computador é composto por: a) um array de memória (array de bytes); 20 b) um processador (CPU) composto por conjunto de registradores e a Unidade Lógica e Aritmética (ULA) que implementa as funcionalidades do mesmo; c) um barramento que conecta a memória ao processador (system bus); d) um processador de interrupções programável que conecta os periféricos a CPU. Fonte: Mattos (2012). Figura 4 – Arquitetura do MVM Um processador, depois de ligado, repete infinitamente o ciclo de: a) busca uma instrução na memória; b) decodifica a instrução, c) executa a operação correspondente e volta ao passo a. O processador repete este loop até que a instrução HALT tenha sido encontrada ou um erro de decodificação tenha ocorrido4. A figura 5 apresenta a arquitetura da MVM e expressa em termos de um programa Java. 4 Um exemplo de erro de decodificação é perceptível em programas para a plataforma Windows quando o sistema operacional apresenta a mensagem: “Este programa executou uma instrução ilegal e será fechado”. 21 Fonte: Mattos (2012). Figura 5 – Estrutura da MVM expressa em linguagem Java A CPU possui um registrador de propósitos gerais (AX), dois registradores auxiliares (BX e CX), um registrador de topo da pilha (SP), um registrador de stack frame (BP), um registrador apontador de instruções (IP) e um registrador de decodificação (RI). A CPU possui quatro tipos de desvio: a) incondicional: ex. JMP 50; b) condicional: ex. TESTAX0,50; c) baseado em pilha: ex. CALL 50; d) baseado em interrupções por software e por hardware: ex. INT 30. Com estes recursos é possível implementar programas que utilizem laços de repetição, sub-rotinas e device drivers baseados em tabela de vetores de interrupção. A memória da MVM é concebida originalmente com 256 bytes, mas para comportar o núcleo de sistema operacional é alterada na metade do semestre para 1024 bytes conduzindo os acadêmicos a refletir a respeito do tamanho do barramento e suas consequências em termos de implementação. No quadro 1 apresenta-se o conjunto de instruções da máquina. Para cada instrução especifica-se o código, o mnemônico, o tamanho em bytes e o comportamento da mesma. Quadro 1 – Lista de comandos suportados pela máquina Instrução Mnemônico Tamanho Descrição da Operação 0 init ax 1 incrementa o valor de AX. 1 move ax,bx 1 move o valor de AX para BX. 22 2 3 4 5 move ax,cx move bx,ax move cx,ax move ax,[ 6 move ax,[bx+ 7 move ax,[bp8 move ax,[bp+ 9 move [ 1 1 1 2 move o valor de AX para CX. move o valor de BX pra AX. move o valor de CX para AX. move conteúdo da posição X da memória p/ax. Ex: move ax,[50] significa: move conteúdo da posição 50 para AX. 2 move o conteúdo da posição [bx+X] da memória p/ax. Ex: move ax,[bx+2]. 2 move conteúdo da posição [bp-X] para AX. Ex: move ax,[bp-2]. 2 move conteúdo da posição [bp+X] para AX. Ex: move ax,[bp+2]. 2 move o valor de AX para a posição X de memória. Ex: move [30],ax -> significa move o valor de AX para a posição 30 da memória. 10 move [bx+ 2 move valor de ax para a posição de memória indexada por [bx+valor]. Ex: move [bx+3],ax -> significa move o valor de AX para a posição [bx+3]; se bx=50, o resultado é: move [53],ax. 11 move bp,sp 12 move sp,bp 13 add ax,bx 1 move o valor de BP para SP. 1 move o valor de SP para BP. 1 incrementa o valor de AX com o valor de BX (AX = AX + BX). 1 incrementa o valor de AX com o valor de BX (AX = AX + CX). 1 incrementa o valor de BX com o valor de BX (BX = BX + CX). 1 decrementa o valor de AX com BX (AX = AX - BX). 1 decrementa o valor de AX com CX (AX = AX - CX). 1 decrementa o valor de BX com CX (BX = BX - CX). 1 incrementa o valor de AX em 1. 1 incrementa o valor de BX em 1. 1 incrementa o valor de CX em 1. 1 decrementa o valor de AX em 1. 1 decrementa o valor de BX em 1. 1 decrementa o valor de CX em 1. 2 se o valor de ax é igual a 0, move o ponteiro IP para a posição definida. 2 move para a posição de memória definida. Ex: jmp 150. 2 faz uma chamada de sub-rotina. Empilha o valor do registrador IP e move para o novo ponteiro de memória definido. Ex: call 150. 14 add ax,cx 15 add bx,cx 16 17 18 19 20 21 22 23 24 25 sub ax,bx sub ax,cx sub bx,cx inc ax inc bx inc cx dec ax dec bx dec cx test ax0, 26 jmp 27 call 28 ret 29 in ax 30 out ax 1 efetua o retorno de uma sub-rotina. 1 solicita uma tecla do teclado para inserir o valor no registrador AX. 1 imprime na console o valor do registrador AX. 23 31 32 33 34 35 36 37 38 39 40 41 42 push ax push bx push cx push bp pop bp pop cx pop bx pop ax nop halt dec sp move [bp- 43 move [bp+ 44 move ax,{ 45 test axEqbx 46 47 48 49 50 51 inc sp move ax,sp move sp,ax move ax,bp move bp,ax iret 52 int 1 1 1 1 1 1 1 1 1 1 1 2 empilha o valor de AX. empilha o valor de BX. empilha o valor de CX. empilha o valor de BP. empilha o valor de BP. empilha o valor de CX. empilha o valor de BX. empilha o valor de AX. comando que não realiza nenhuma operação. finaliza a execução do programa. decrementa o valor de SP. move o conteúdo de AX para a posição [bp-X]. Ex: move [bp-2], ax. 2 move o conteúdo de AX para a posição [bp+X]. Ex: move [bp+2], ax. 2 move o valor imediato entre chaves para o registrador AX. Ex: move ax,{50} -> move para AX o valor 50. 2 move para a instrução X se o valor de AX for igual à BX. Ex: test AXEqBX, 150 -> se o valor de AX for igual à BX, move para a posição 150. 1 1 1 1 1 1 incrementa o valor de sp em 1. move para AX o valor de SP. move para SP o valor de AX. move para AX o valor de BP. move para BP o valor de AX efetua o retorno de uma interrupção, é equivalente a pop cx, pop bx, pop ax, pop bp, ret. 2 gera uma interrupção, é equivalente a push ip, push bp, push ax, push bx, push cx. Fonte: Mattos (2012). A MVM possui os seguintes modos de endereçamento: a) imediato: ex. move AX,{30} a) direto: ex. move [30],AX b) indireto baseado em registradores: ex. move [BX+3],AX c) baseado em stack frame: ex. move [BP+2],AX A MVM possui duas instruções específicas para acesso ao hardware: a) IN AX: recebe um caractere do teclado; b) OUT AX: envia um caractere para a tela virtual. A MVM não implementa registrador de flags nem o tratamento de underflow, overflow e “vai um” nas operações aritméticas. 24 2.4 TRABALHOS CORRELATOS Nesta seção são apresentados os trabalhos de Machado e Maia (2004) seguido do trabalho Schouery (2007). Por sequência serão abordados alguns trabalhos voltados especificamente ao desenvolvimento de ferramentas para o ensino de sistemas operacionais. Os trabalhos apresentados são: a) SOSIM; b) HIPO – O computador hipotético; c) VXT (MATTOS et al., 2004); d) BrasilOS (SILVA et al. 2011); e) EPSOSIM (CARVALHO, 2011, p. 55); f) SISO (CARVALHO, 2011); g) IO Simulator (MEDEIROS et al., 2011); h) SOIS - Sistema Operacional Integrado Simulado (Cruz; Silva; Gonçalves, 2007); i) VM Simulator (SOUZA; SOUZA, 2011, p. 550). 2.4.1 SOSIM Conforme Machado e Maia (2004), o SOsim é um simulador com recursos visuais que tem como principal objetivo apresentar os conceitos e técnicas encontradas nos Sistemas Operacionais multiprogramáveis modernos. Alguns dos algoritmos implementados podem ser encontrados em sistemas operacionais comerciais, como no HP OpenVMS e Microsoft Windows NT/2000/XP. O simulador emula os principais subsistemas de um sistema operacional multiprogramável, como gerência de processos, escalonamento e memória virtual por paginação e foi concebido com o propósito de ser uma ferramenta de apoio ao ensino de Sistemas Operacionais (MACHADO; MAIA; 2004). 25 O software foi concebido para ser executado no sistema Windows da Microsoft, possuindo uma interface simples e de fácil interação e permitindo ao usuário acompanhar visualmente os diversos eventos assíncronos que ocorrem em um sistema operacional (figura 6). Fonte Machado e Maia (2002). Figura 6 – Simulador SOsim versão 1.2 Conforme relatado por Machado e Maia (2002, p. 10), na experiência realizada, o uso do simulador SOsim mostrou-se importante no auxílio da construção do saber, pois possibilitou a maior atenção do aprendiz com o objeto de estudo. Uma grande vantagem pedagógica em utilizar tal ferramenta é a construção de um ambiente híbrido de ensinoaprendizado, onde aulas expositivas tradicionais e simulações podem ser combinadas. 2.4.2 HIPO – O computador hipotético O HIPO é um sistema feito em JAVA que permite a simulação de programas escritos em uma linguagem de máquina simplificada para o auxílio de estudantes sobre o 26 funcionamento de uma máquina real. Ele possui um número de instruções limitado, definido pela própria máquina. Conforme Schouery (2007, p. 14), são definidas as instruções suportadas pela máquina e as funções são: a) carregar e salvar o conteúdo na memória; b) efetuar operações aritméticas, como por exemplo, somar, subtrair, etc; c) leitura de dados de entrada como teclas por exemplo e impressão do conteúdo; d) instruções comparativas como, por exemplo, igualdade entre valores. Fonte: Schouery (2012). Figura 7 – Tela inicial do HIPO 2.4.3 VXT O Virtual XT (VXT) é um projeto iniciado em 1997 e que simula uma máquina baseada no processador 8086. Concebido para suportar atividades de sala de aula, foi desenvolvido através de alguns trabalhos de conclusões de curso e projetos de iniciação científica (MATTOS et al, 2004). O VXT possui uma interface gráfica que interage com o usuário com a finalidade de mostrar passo a passo a execução de um programa em modo de instruções de máquina. Segundo Mattos et al. (2004), este projeto tem um grande valor didático, por auxiliar no 27 ensino de sistemas operacionais. Além disso, o VXT possui outras características importantes como: a) trabalha no conceito de cliente-servidor; b) tem interface completamente isolada da implementação do processador; c) permite que sejam executados vários simuladores em paralelo; d) permite que seja salvo ou carregado o contexto de execução de uma determinada simulação; e) permite salvar log de uma simulação, possibilitando assim efetuar uma análise destas informações. Fonte: Goedert (2006, p. 75). Figura 8 – Interface VXt cliente Java com registradores e log de instrução A ultima versão do sistema permitia que a tela do professor pudesse ser propagada para todas as máquinas dos alunos através de um middleware escrito em Java. A figura 8 apresenta um exemplo de funcionamento do sistema conforme os rótulos abaixo: a) cliente Java 1: recebe dados do middleware; b) cliente Java 2: recebe dados do middleware; c) cliente Delphi: envia dados para o middleware; d) janela de log de instruções do cliente Delphi; e) janela de log de instruções do cliente Java 1; f) janela de log de instruções do cliente Java 2; 28 g) middleware Java: gerencia clientes, recebe mensagens do cliente Delphi e transmite para as interfaces Java. Fonte: Goedert (2006, p. 76). Figura 9 - Funcionamento do sistema Conforme Goedert (2006, p.77), a versão implementada permitiu propagar a interface do VXt para clientes remotos. Com essas novas características implantadas no VXt, ele torna mais interessante a aprendizagem dos alunos, pois poderão ver na prática o funcionamento de uma CPU, assimilando melhor os assuntos relacionados a sistemas operacionais. Com relação a performance da transmissão dos dados, pôde-se constatar que o tempo de atraso desde o envio até o recebimento pelos clientes das informações, não foi significativo a ponto de comprometer a aplicação. Com essa versão foi possível propagar a interface do VXt sem perdas de informações e num teste realizado com 20 computadores conectados ao middleware, praticamente não houve tempo de atraso no envio de informações a 500 ms. Através de testes realizados com o VXt, foi observado que ele também funciona utilizando como meio de transmissão a internet, sendo teste realizado somente entre 2 computadores. Também foram feitos testes com os clientes sendo executados no sistema 29 operacional Linux e percebeu-se que o VXt propaga sua interface sem nenhum problema com relação a plataforma (GOEDERT; 2006, p.77). 2.4.4 BrasilOS: O BrasilOs é um ambiente didático para o auxílio ao ensino e aprendizado de sistemas operacionais desenvolvida por Marcos Aurélio Medeiros Silva¹, Rogério Guerra Diógenes Filho¹, Emanuel Feliciano Queiroz¹, Hedwio Carvalho e Silva¹ e Verônica Pimentel de Sousa O BrasilOS é uma ferramenta de simulação de sistemas operacionais. O sistema faz uso de recursos gráficos para que a dinâmica de cada algoritmo seja bem visualizada durante sua simulação. Para tornar o software mais completo, são inseridos pequenos textos durante a execução do algoritmo, o que possibilita uma formação conceitual mais abrangente para o efetivo aprendizado (Silva et al., 2011, p. 2). Implementada em C#, a fase atual contempla o módulo de algoritmos de escalonamento de processos, com simulação dos algoritmos first come, first served (FCFS), shortest job first (SJF), alternância circular e prioridade. Além disso contém textos objetivos para bom embasamento teórico e um guia de utilização da ferramenta tornando possível que todos os seus recursos sejam bem utilizados (SILVA ET ALL;2011). A Figura 10 mostra como o usuário pode configurar estas opções. Para isso, é necessário que as informações de cada processo sejam adicionadas antes de inseri-lo no escalonador. Fonte: Silva et al. 2011. Figura 10 - Interface BrasilOS para simulação de escalonamento de processos 30 Após adicionar os processos necessários para a simulação é possível selecionar o algoritmo de escalonamento na lista de seleção do lado direito da imagem. A partir daí, o usuário pode executar a simulação e comparar os resultados (figura 11). Fonte: Silva et al. 2011. Figura 11 - Resultado da simulação de escalonamento de processos A partir dos resultados iniciais, os autores planejam a ampliação do escopo da ferramenta para contemplar outros algoritmos de escalonamento de processos, além do gerenciamento de memória (SILVA et al., 2011). 2.4.5 EPSOSIM Conforme Carvalho (2011), o EPSOSIM é um simulador de escalonamento de processos em sistemas operacionais e busca, de forma simples, pratica e detalhada, simular os algoritmos de escalonamento de processos. 31 Fonte: Carvalho (2011, p. 55) Figura 12 – Janela que simula o funcionamento do escalonamento circular com prioridade O Simulador permite a visualização gráfica do funcionamento de 8 algoritmos de escalonamento ( Carvalho (2011, p. 58): a) FIFO; b) SJF; c) SRT; d) Circular; e) Circular com prioridade; f) Por prioridade preemptiva; g) Por prioridade não-preemptivo; h) Múltiplas filas. Além disso, o simulador permite a visualização do diagrama de Gantt, onde é possível visualizar o comportamento dos processos desde o início até o final. Com este instrumento, os alunos tem mais facilidade em aprender sobre o funcionamento dos mecanismos de escalonamento estudados (Carvalho, 2011, p.58). 32 2.4.6 SISO – SIMULADOR DE SISTEMA OPERACIONAL Conforme Carvalho (2011), o SISO é um applet java desenvolvido com o intuito de auxiliar no processo de ensino-aprendizagem da disciplina de sistemas operacionais. O SISO é um simulador muito prático e seu funcionamento não exige instalação. Conforme Paulo (2011), o objetivo do SISO é: a) auxiliar no ensino/aprendizagem da disciplina de sistemas operacionais, facilitando o entendimento prático do algoritmo de detecção de deadlock; b) permitir a visualização da montagem das matrizes do algoritmo; c) permitir que o aluno antecipasse os resultados da detecção, antes de serem exibidos. Fonte: Carvalho (2011). Figura 13 – Exemplo de interface do SISO 33 2.4.7 IO Simulator Medeiros et al. (2011) descrevem um ambiente de simulação denominado IO Simulator, destinado a demonstrar na prática os conceitos teóricos relativos as peculiaridades do comportamento de mecanismos de gerenciamento de dispositivos de entrada e saída. A interatividade da ferramenta fornece aos alunos um ambiente agradável de aprendizado, detalhando o fluxo operacional deste módulo do sistema operacional por meio de animações dinâmicas (MEDEIROS et al.;2011). Fonte: Medeiros et al. (2011). Figura 14 – Detalhamento do fluxo operacional do IO Simulator Por meio do IO Simulator é possível interagir com qualquer componente persente na animação, permitindo consultar seu conceito ou entender a sua função dentro do fluxo de entrada e saída. 34 2.4.8 SOIS – Sistema Operacional Integrado Simulado Conforme Cruz, Silva e Gonçalves (2007), a ferramenta Sistema Operacional Integrado Simulado (SOIS) visa a criação de um ambiente completo de simulação computacional, integrando compilador, sistema operacional, sistema de entrada e saída e interface de visualização. Devido a sua complexidade, em 2007 estava implementado o núcleo básico do processador envolvendo a unidade de decodificação de instruções IA-32 e o módulo de simulação de entrada e saída embora operando sobre um conjunto de instruções simplificado. A Figura 15 apresenta a arquitetura do sistema. Fonte: Cruz, Silva e Gonçalves (2007). Figura 15 – Integração entre processador e sistema de entrada/saída A figura 16 apresenta um snapshot da execução de um programa pelo simulador (CRUZ; SILVA; GONCALVES; 2007). 35 Fonte : Cruz, Silva e Gonçalves (2007). Figura 16 – Tela principal do simulador de entrada e saída 2.4.9 VM Simulator Conforme Sousa e Souza (2011, p.550), o VM Simulator, é um simulador para apoiar o ensino e a aprendizagem de gerência de memória virtual. A importância do trabalho se deve ao fato desse conteúdo ser geralmente lecionado de forma excessivamente teórica em salas de aula e da falta de simuladores educacionais relacionados que abordem esse conteúdo de forma completa e satisfatória. Com o VM Simulator, pretende-se mostrar o funcionamento dos principais componentes desse tipo de gerência de forma visual e dinâmica. Através do simulador, o usuário poderá criar uma simulação escolhendo os tamanhos das páginas virtuais e dos frames, do espaço de endereçamento virtual, da memória principal e o algoritmo de substituição de páginas. Após a configuração desses parâmetros, o aluno/professor visualiza uma tela similar à apresentada na figura 17. 36 Fonte: Sousa e Souza (2011, p. 552). Figura 17 – Protótipo do simulador O usuário poderá incluir processos que serão mostrados na seção da área 4 (quatro) e cada espaço de memória ocupado por esse processo será mostrado na seção da área 6 (seis) e identificado pelo número do seu endereço, pelo número do processo que o contém e pela mesma cor atribuída ao processo. Com base no seu tamanho e nas configurações de tamanho de memória informadas anteriormente, a ferramenta criará um espaço de endereçamento virtual para ele, com as páginas alocadas sendo mostradas na seção da área 2 (dois). Dessa forma, uma página virtual poderá ser buscada a partir do seu número e a ferramenta mostrará na seção da área 5 (cinco) como essa requisição chega à memória a partir da CPU e da MMU. Os dados das páginas de um processo estarão mapeados e mostrados na seção das áreas 1 (um) e 3 (dois) ,onde será mostrado qual página foi escolhida e que endereço de memória real essa página tem. Se for necessária uma substituição de páginas, a ferramenta mostrará como isso irá ocorrer de acordo com o algoritmo de substituição de páginas escolhido em uma animação na seção da área 2 (dois) (Sousa; Souza, 2011, p. 553). 37 3 DESENVOLVIMENTO Neste tópico serão abordados os requisitos principais do aplicativo, seguido do diagrama de classes da aplicação, dos dados da implementação como as técnicas utilizadas, a memória disponível, comandos suportados e operacionalidade da ferramenta, finalizando com a descrição dos resultados obtidos e situações encontradas durante o desenvolvimento. 3.1 REQUISITOS PRINCIPAIS DO APLICATIVO Os requisitos funcionais e não funcionais do sistema são: a) o sistema deve permitir que o aluno desenvolva programas para a MVM no dispositivo móvel (Requisito Funcional - RF); b) o aplicativo deve permitir que sejam carregados os projetos já salvos no dispositivo móvel (RF); c) permitir a edição dos valores da memória da máquina (RF); d) permitir que o código fonte do projeto escrito possa ser salvo e carregado novamente (RF); e) permitir a exclusão do projeto (RF); f) permitir que a execução do programa possa ser interrompida (RF); g) o sistema deve oferecer uma interface amigável ao usuário (Requisito Não Funcional RNF); h) o sistema deve ser implementados na linguagem Java (RNF); i) o sistema deve ser implementado usando o ambiente de desenvolvimento Eclipse (RNF); j) o sistema operacional no qual o software está instalado deve rodar no sistema operacional Android (RNF). 38 3.2 DIAGRAMA DE CLASSES O diagrama de classes (figura 18) apresenta as classes do aplicativo e suas ligações com as classes responsáveis pelo controle da máquina virtual. class Getting Started EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi DataHelper - Opcao context :Context db :SQLiteDatabase i d :i nt EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi INSERT :Stri ng = "i nsert into " ... {readOnly} i mage :i nt - i nsertStmt :SQLiteStatement T ABLE_NAME :Stri ng = "PROJET O" - nome :Stri ng + getId() :i nt EA 9.3 Unregistered Trial Version EA 9.3 Unregistered EA 9.3 Unregi + atual izarProjeto(Stri ng, Stri ng) :voi d Trial Version + getImage() :i nt + + + + DataHelper(Context) excl ui rProj eto(Stri ng) :long i nsert(Stri ng, String) :l ong sel ecionarT odosProjetos() :ArrayLi st<Proj eto> + + getNome() :Stri ng Opcao(int, String, i nt) BaseAdapter MsgGenericAdapter EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi -dataHel per Acti vity OnItemCl ickLi stener - context :Context corFundo :int li stMsg :Li st<Stri ng> = new ArrayLi st<S... + + getCount() :i nt getItem(i nt) :Obj ect EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi MainActiv ity - codi go_fonte_edittext :EditT ext + console :Li stVi ew getItemId(i nt) :l ong EA 9.3 Unregistered Trial Version EA 9.3++ Unregistered Trial Version EA 9.3 Unregi dataHelper :DataHelper getView(i nt, View, ViewGroup) :Vi ew - funcaoPrograma :Li nearLayout isAlter :boolean = false li stMemori a :Li stView li stMenu :Li stVi ew lv :PosicaoMemoria menu :OpcoesMenu msgConsol e :MsgGeneri cAdapter msgRegistradores :MsgGeneri cAdapter mvm :Maqui naVi rtual = new Maqui naVi rtual() proj etoAtual :Proj eto regi stradores :Li stView stopCPU :boolean = true tamanho_memori a :i nt = 1024 {readOnl y} ui Handler :Handler = new UIHandl er() ui HandlerConsol e :UIHandl erConsole = new UIHandlerCo... + + + + - al ertDi al og(Stri ng) :voi d atual i zarConsol e(Stri ng) :voi d atual i zarProj eto(Proj eto) :voi d atual i zarRegistradores() :voi d carregarLi staMemori a() :voi d carregarProjeto() :void compi larProj eto() :voi d cpu(boolean) :voi d excluirProjeto() :void executar(bool ean) :void isStopCpu(boolean) :boolean li mparConsol e() :voi d li mparRegistradores() :voi d novoProj eto(Opcao) :voi d onCreate(Bundle) :voi d onCreateOptionsMenu(Menu) :bool ean onItemCli ck(AdapterVi ew<?>, View, int, long) :void pararExecucao() :void sal varBancoDados(Stri ng) :void sal varProj eto() :void toast(int) :void toast(String) :void -msgRegistradores -msgConsol e + + + insert(Stri ng) :voi d li mpar() :voi d MsgGeneri cAdapter(Context, i nt) EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi Proj eto EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi - codi goFonte :Stri ng memoria :int ([]) nome :String + + + + + + + + getCodi goFonte() :String getMemori a() :i nt[] getNome() :String Proj eto(Stri ng, String) setCodi goFonte(Stri ng) :voi d setMemori a(int, i nt) :void setNome(Stri ng) :void toString() :Stri ng EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi -proj etoAtual EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi BaseAdapter EA 9.3 Unregistered Trial Version -menu EA 9.3 Unregistered Trial Version EA 9.3 Unregi OpcoesMenu - context :Context stateLi st :List<Opcao> + + getItem(i nt) :Obj ect getItemId(i nt) :l ong + + li mparLi sta() :void OpcoesMenu(Context, List<Opcao>) EA 9.3 Unregistered Trial Version EA+ 9.3 Unregistered Trial Version EA 9.3 Unregi getCount() :int getView(i nt, Vi ew, Vi ewGroup) :Vi ew EA 9.3 Unregistered Trial Version EA++ 9.3 Unregistered Trial Version EA 9.3 Unregi inserirBotoes(Opcao) :voi d EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi -lv BaseAdapter EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi PosicaoMemoria -mai n - context :Context stateList :ArrayList<Integer> + + getCount() :i nt getItem(i nt) :Object + PosicaoMemori a(Context, ArrayLi st<Integer>) -ui Handl erConsol e EA 9.3 Unregistered Trial Version+ alterVal EA ue(i 9.3 Unregistered Trial Version EA 9.3 Unregi nt, Integer) :void Handler UIHandlerConsole EA 9.3 Unregistered Trial Version++ getItemId(int) EA 9.3:l ong Unregistered Trial Version EA 9.3 Unregi + handl eMessage(Message) :void getView(i nt, View, ViewGroup) :View -mvm EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi Handler handleMessage(Message) :voi d SQLi teOpenHel per MaquinaVirtual UIHandler + ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ + ~ acerto :i nt = 0 ax :int = 0 bp :i nt = 0 bx :int = 0 cl ockBusc :i nt = 0 cl ockComplExec :int = 0 cl ockExec :int = 0 cx :i nt = 0 erro :String = "" i :i nt = 0 ip :i nt = 0 main :Mai nActi vi ty mem :int ([]) = new i nt[1024] sp :i nt = 0 + + decodi ficar(Stri ng) :void impri meVal oresConsol e(int) :Stri ng OpenHelper EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Version EA 9.3 Unregi DB :Stri ng = "MVMDB"Trial {readOnl y} ConstMenu - T ABELA_PROJETO :Stri ng = "PROJETO" {readOnly} + + ~ onCreate(SQLi teDatabase) :voi d EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi + CARREGAR :int = 2 {readOnly} onUpgrade(SQLiteDatabase, i nt, int) :voi d + + + + + + + COMPILAR :i nt = 4 {readOnl y} EXCLUIR :int = 8 {readOnly} EXECUT AR :i nt = 5 {readOnl y} EXECUT AR_PASSO :i nt = 6 {readOnl y} NOVO :i nt = 1 {readOnl y} PARAR_EXECUCAO :i nt = 7 {readOnl y} SALVAR :i nt = 3 {readOnl y} OpenHelper(Context) EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi + li Version mparConfi guracoes(iEA nt) :void EA 9.3 Unregistered Trial 9.3 Unregistered Trial Version EA 9.3 Unregi + li mparConfi guracoesReg(i nt) :voi d EA 9.3 Unregistered Trial Version EA 9.3 Unregistered Trial Version EA 9.3 Unregi Figura 18 – Diagrama de classes 39 A classe MainActivity é a responsável pelo controle dos componentes visuais, ela utiliza as classes DataHelper para o controle do banco de dados, onde é efetuada a inserção dos registros, consulta dos dados e remoção dos registros. As opções de menu são inseridas em um componente chamado listView com eventos de clique para a execução da devidas rotinas. Todas as opções do aplicativo são tratadas por um único listener, onde chama a rotina necessária para a opção selecionada conforme apresentado no quadro 2. Quadro 2 – Controle das opções A classe MainActivity também instancia a classe MaquinaVirtual que é responsável pelo controle dos registradores e da memória que é suportada. Conforme especificado na seção anterior, a MVM suporta 1024 posições de memória (implementada como um array de bytes) e possui um total de 6 registradores. A execução das instruções é realizada pela classe MainActivity. Esta abordagem foi necessária pois a execução deve ocorrer de forma independente da interface e para isto foi necessário instanciar uma thread5 contendo um handler6 para passar as mensagens ao componente gráfico e fazer a atualização dos camnpos em tempo real. O quadro 3 apresenta uma parte do código para execução das instruções na memória. 5 Permite que possam ser executadas várias tarefas diferentes ao mesmo tempo (Alcântara, 1996). 6 Uma referência a um objeto para poder enviar mensagens a uma thread ou o programa principal (Parkhi, 2011). 40 Quadro 3 – Parte do código de execução do programa A criação do banco de dados é realizada na classe OpenHelper, que é ativada no momento da criação da classe DataHelper. O nome do banco de dados utilizado na aplicação foi definido como “MVMBD” e caso haja alguma alteração dos dados, todos os registros são excluídos e o banco de dados é recriado. O quadro 4 abaixo apresenta a rotina de criação do banco de dados. As classes Opcao, OpcoesMenu, PosicaoMemoria e MsgGenericaAdapter são utilizadas para a criação dos listview das opções de menu, registradores, console e memória. 41 Quadro 4 – Criação do banco de dados 3.3 IMPLEMENTAÇÃO Nesta seção são abordadas as técnicas e ferramentas utilizadas para o desenvolvimento do aplicativo, bem como características da arquitetura implementada e uma descrição sobre as funcionalidades da ferramenta. 3.3.1 Técnicas e ferramentas utilizadas Para o desenvolvimento do aplicativo foi utilizada a linguagem de programação Java com API de desenvolvimento Android para o modo de compatibilidade com a versão 2.2 até 4.1 disponível no plug-in Android Development Tools (ADT) em sua versão 20.0.3. Este plug-in é incluso a Integrated Development Environment (IDE) Eclipse e adiciona recursos para a criação e execução de aplicações, possibilitando inclusive a execução a partir de um dispositivo Android. O desenvolvimento da aplicação foi realizado utilizando o emulador Android na versão 4.1 e o tablet da marca Genesis no modelo GT-1230 com o sistema Android 4.0. O Genesis GT-1230 possui um processador Cortex A8 com capacidade de 1.2 Giga Hertz (GHz), memória de 1 Giga Byte (GB) de Random Access Memory (RAM) e 8 GB de Read Only Memory (ROM). 42 O armazenamento dos projetos é feito utilizando o banco de dados Sqlite, disponível por padrão nos sistemas operacionais Android. 3.3.2 Operacionalidade da implementação Um programa na MVM pode ser construído de 2 formas: a) inserção da sequencia de códigos de operação diretamente nas posições de memória ou; b) edição de um arquivo texto com a sequencia de instruções. No primeiro caso após a inserção da instrução HALT o valor do registrador IP é inicializado para a posição contendo a primeira instrução do programa e ao pressionar o botão Executar a sequencia de instruções será executada. No segundo caso é necessário um passo de “montagem” onde a sequencia de instruções expressa através dos mnemônicos é traduzida para os respectivos códigos de instrução e os mesmos são armazenados nas respectivas posições de memória a partir de um “endereço de carga” previamente fornecido. A interface do aplicativo é dividida em 5 regiões (figura 19). a) opções do programa: onde são disponibilizados as funções de: − novo projeto: cria um novo projeto para ser executado na MVM; − carregar projeto: localiza um projeto já criado com o código fonte salvo; − salvar projeto: salva o projeto alterado na máquina; − compilar projeto: efetua a transcrição dos comandos inseridos na área do código fonte para a memória da máquina. Neste momento é validado se todos os comandos inseridos são suportados pela máquina, caso contrário, apresenta ao usuário o comando que encontrou o problema e a linha que o mesmo pertence; − executar projeto: executa as instruções que estão na memória; − executar passo-passo: executa as instrução que estão na memória, porém, com um temporizador de 6 segundos para cada instrução executada; − parar execução: Finaliza a execução do programa em execução; − excluir: Exclui o projeto atual. 43 b) código fonte: Área para a edição do código fonte a ser compilado pela máquina; c) console: Área onde serão apresentadas as mensagens de saída do comando “out”; d) registradores: Área em que será apresentado em tempo real o valor de cada registrador da máquina, estes valores são atualizados durante a execução; e) memória da CPU: Área em que são apresentados os valores de cada posição de memória. Cada posição de memória pode ter seu valor alterado e será executado pela máquina no momento da execução. Figura 19 – Regiões da interface da MVM Em um primeiro momento deve-se criar um novo projeto ou carregar projetos já salvos, como mostram as figuras 20 e 21. Figura 20 – Tela de criação do novo projeto 44 Figura 21 – Tela de localização dos projetos já existentes Ao ser carregado um projeto são geradas as 1024 posições de memória em um listview o que permite a edição dos valores. Neste momento é possível a edição de instruções que serão compiladas ou a alteração direta das posições de memória. A compilação do projeto é necessária para a conversão das instruções para seus respectivos códigos de operação. Havendo algum erro nesta etapa será apresentada uma mensagem indicando que o comando que não foi encontrado e a linha que ele se encontra. O tratamento de erros é sequencial, ou seja, para que seja encontrado o próximo comando não suportado, deve-se corrigir o primeiro (figura 22). Figura 22 – Mensagem de erro durante a verificação. 45 Com o programa devidamente carregado para a memória inicia-se o processo de execução onde a cada momento são atualizadas as outras 3 listview: a primeira de execução das instruções, a segunda para atualização dos registradores e a terceira para atualização da console que apresenta a saída dos comandos. Este processo foi realizado para permitir que a execução e a alteração dos registradores ocorram em tempo real, permitindo que o aluno possa acompanhar a execução do programa. Quando a aplicação está em processamento é possível finalizar a mesma, entretanto, os valores de memória não irão condizer com o resultado do programa, apenas se manterão com o status anterior ao cancelamento da aplicação. A cada nova execução os registradores são inicializados com zero e a execução é realizada em função do conteúdo atual da memória. 3.3.3 Casos de testes Objetivando validar a implementação, nesta seção são apresentados alguns exemplos de programas que são suportados pela máquina virtual conforme apresentados por Mattos (2012). A figura 23 ilustra uma sequência simples que permite ao aluno validar o conceito de ciclo de busca, decodificação e execução de instruções. Na primeira coluna existe a referência explicita a posição de memória (ex. mem[0]), o mnemônico da instrução e na terceira coluna o código da operação que deverá ser armazenado na respectiva posição. Ao final do programa é apresentado o resultado esperado da execução do mesmo. 46 Fonte: Mattos (2012). Figura 23 – Ciclo de busca, decodificação e execução O exemplo da figura 24 demonstra explicitamente que os parâmetros das instruções ocupam o próximo byte na sequencia. Além disso, o exemplo serve para caracterizar a diferença entre valor imediato e endereçamento direto. Fonte: Mattos (2012). Figura 24 – Atribuição de valor imediato 47 A figura 25 apresenta o resultado do programa da figura 25 na MVM mobile. Figura 25 – Resultado a execução do programa da figura 24. A figura 26 apresenta um programa para validar as instruções de desvio incondicional e desvio condicional. São apresentados os resultados esperados da execução do programa para que os acadêmicos possam validar as suas respectivas implementações. Fonte: Mattos (2012). Figura 26 – Desvio incondicional imediato A figura 27 apresenta o resultado da execução do programa. 48 Figura 27 – Resultado das instruções da figura 26 O próximo exemplo (figura 28) demonstra o uso das operações de pilha de execução através das instruções push e pop. Fonte: Mattos (2012). Figura 28 – Operação de pilha 49 A figura 29 demonstra a saída da MVM para o exemplo da figura 28. Figura 29 – Resultado da execução do programa da figura 28 A figura 30 apresenta exemplo de acesso a memória através de modo de endereçamento por base e deslocamento. No exemplo, o registrador base é o registrador BX. Fonte: Mattos (2012). Figura 30 – Endereçamento por base e deslocamento 50 O exemplo acima propositalmente contém um erro que faz com que a MVM aborte a execução. Isto porque há uma sobrescrita da instrução HALT fazendo com que o sistema atinja o topo da memória executando operações INIT AX (código 0). Os alunos são levados a refletir o porque do erro e então a solução é publicada conforme apresentado na figura 31. Fonte: Mattos (2012). Figura 31 – Correção do exemplo de endereçamento por base e deslocamento Finalmente o exemplo a seguir demonstra o conceito de device driver validando o processo de interrupção por software e o fluxo de retorno de uma interrupção. Este é o ponto de partida para a construção de um núcleo de multitarefa com vários processos. A única modificação do código abaixo foi a alteração da instrução move ax,{1024} para move ax,{1023}, 0. pois a máquina suporta apenas 1024 posições de memória, partindo da posição 51 Fonte: Mattos (2012). Figura 32 – Device driver A figura 33 demonstra o funcionamento do exemplo na MVM. Figura 33 – Resultado da execução do programa da figura 32 52 O código do quadro 5 mostra um exemplo de um programa que simula a chamada de interrupções por software. Quadro 5 – Código fonte de uma aplicação de chamada de interrupções por software 3.4 RESULTADO E DISCUSSÃO O presente trabalho apresentou o desenvolvimento da MVM para Android. Conforme apresentado, a aplicação permite demonstrar de forma clara e objetiva o passo a passo de uma máquina de um único processador, sendo um excelente ponto de partida para a introdução aos conceitos de sistemas operacionais. A partir dos recursos desenvolvidos é possível a criação de um núcleo de multitarefa onde os alunos tem uma visão completa da interação hardware e software e o papel de um sistema operacional como gerenciador de recursos. O sistema foi desenvolvido em Java sendo a escolha da versão 20.0.3 do plugin ADT escolhida pelo fato de ser a última versão estável disponibilizada além de permitir o tratamento para a compatibilidade com outras versões do sistema operacional. O aplicativo desenvolvido é compatível a partir da versão 2.2 do Android e permite que a aplicação seja compatível com mais de 98% dos aparelhos no mercado segundo a Google (2012 apud HECKE, 2012) (figura 34). 53 Fonte: Hecke (2012) Figura 34 – Percentual de aparelhos e suas determinadas versões do Android Esta decisão de projeto acarretou alguns problemas como a falta de componentes visuais para o desenvolvimento da interface e performance do programa. Outros problemas que foram encontrados durante o desenvolvimento foi o controle de thread’s do sistema. Atualmente o Android trabalha com diversas threads para determinadas execuções, como por exemplo, a chamada de um AlertDialog.builder. Durante a execução da MVM, esta situação fazia com que o sistema questionasse ao usuário o novo valor do registrador AX, porém, não interrompia a execução e fazia com que o programa continuasse independente do valor entrado. Para que esta situação fosse corrigida foi necessária a implementação de uma rotina de controle juntamente com a chamada da classe AlertDialog.builder e assim foi possível simular a execução JOptionPane.showMessageDialog modal do comando, semelhante ao método nativo do framework7 swing. Outra situação encontrada foi quanto ao cancelamento da execução para casos de problemas na execução do programa. Isto ocorre pois o Android possui problemas ao interpretar a chamada entre as threads criadas, impossibilitando que seja cancelado diretamente a execução. Para esta situação foi necessária a utilização de um método synchronized para a alteração de uma variável global, permitindo assim a alteração de seu valor e a paralização da execução MVM. Outra forma de resolver seria a criação de um handler para o cancelamento da execução, entretanto, havia uma grande quantidade de lugares para ser tratada esta questão e acabaria fazendo com que houvessem chamadas 7 Segundo a Müller (2008) um framework é uma abstração que unifica os códigos comuns entre vários projetos para uma funcionalidade genérica. 54 repetidas vezes ao mesmo handler, podendo causar conflito na execução e finalizando a aplicação. O modelo de tablet que foi utilizado para testes, o Genesis GT-1230, possui tratamento para rotatividade da tela com base no acelerômetro8 do aparelho. Em função disto, quando era efetuado o ajuste da tela, acabava por chamar o método onCreate do aplicativo. Este problema também foi relatado ao ser testado com um tablet da marca Acer. Mesmo com um número limitado de instruções e posições de memória, a simulação de uma série de rotinas, incluindo a criação de sub-rotinas para a execução, cálculos e interrupções ocorrem de forma eficiente permitindo que sejam simulados vários casos reais ocorridos em sistemas operacionais além de simulação de núcleos multitarefas. 8 Segundo Prada (2009), o acelerômetro é um equipamento que mede a aceleração do aparelho, podendo assim, detectar movimentos e fazer tratamento como por exemplo, rotacionar o visor juntamente com a posição relativa do aparelho. 55 4 CONCLUSÕES O presente trabalho descreve a implementação de uma máquina virtual hipotética denominada MVM. Os objetivos propostos foram atendidos na medida em que é possível a criação, execução e persistência de programas exemplo. O sistema permite a simulação de interrupções e, com isto, a possibilidade de construção de um núcleo de multitarefa. Conforme Mattos (2012), este é o ponto máximo de utilização da ferramenta uma vez que o aluno pode, executando passo a passo o código fornecido pelo professor, acompanhar o processo de troca de contexto entre processos não perdendo de perspectiva tanto o comportamento do hardware como o comportamento do software do sistema operacional. Como ferramenta didática a MVM tem demonstrado ser útil na fixação de conceitos importantes. Como ferramenta de motivação, a versão mobile desenvolvida neste trabalho traz um agregado importante pois permite a mobilidade à solução construída. Como apresentado no levantamento de trabalhos correlatos, a tendência dos projetos é a demonstração de algoritmos de alto nível relacionados a gerência de memória, processos e entrada e saída ou utilizando simuladores de arquitetura X86 (como o VXT) ou utilizando simuladores que abstraem demasiadamente o funcionamento do hardware. Portanto todos utilizam a abordagem top-down enquanto a MVM permite a demonstração de conceitos de forma bottom-up. O trabalho apresentado é um aplicativo de simulação de uma máquina virtual com o intuito de apresentar de forma clara e simples o funcionamento e desenvolvimento de pequenos programas que simulam rotinas internas de um sistema operacional, tais como controle de eventos, chamada de métodos, cálculos e criação de sub-rotinas. 4.1 EXTENSÕES Este é um projeto em andamento e algumas funcionalidades adicionais poderiam ser consideradas como complementares ao ambiente já desenvolvido. Dentre elas destacam-se as propostas a seguir: a) implementação da funcionalidade de carga e relocação de programas; 56 b) implementação da funcionalidade de ligação dinâmica de bibliotecas; c) implementação do mecanismo de overlays para gerenciamento de memória real; d) implementação de dispositivos periféricos como unidade de disco; e) implementação do mecanismo de memória virtual com paginação. 57 REFERÊNCIAS BIBLIOGRÁFICAS ADAMS, Keith; AGESEN, Ole. A comparison of software and hardware techniques for x86 virtualization. In: Proceedings of the 12th international conference on architectural support for programming languages and systems, 2006, California-USA. ALCÂNTARA, Andreia A. O que são threads? [S.1], [1996]. Disponível em: < http://www.di.ufpe.br/~java/verao/aula8/definicao.html>. Acesso em: 10 nov. 2012. AMARAL, Fabio E. O que é virtualização? [S.1.], [2009]. Disponível em: <http://www.tecmundo.com.br/web/1624-o-que-e-virtualizacao-.htm>. Acesso em: 20 abr. 2012. ANATEL. Relatório anual 2009 - Anatel. [S.1.], [2009]. Disponível em: <http://www.anatel.gov.br/Portal/verificaDocumentos/documento.asp?numeroPublicacao=24 5429&assuntoPublicacao=Relat%F3rio%20Anual%20da%20Anatel%202009&caminhoRel= null&filtro=1&documentoPath=245429.pdf>. Acesso em: 10 jun. 2012. AQUINO, Juliana F. S. Plataformas de desenvolvimento para dispositivos móveis. 2007. 14 f. Monografia (Pós Graduação em Informática) – Departamento de Informática, Pontifícia Universidade Católica do Rio de Janeiro, Rio de Janeiro. CARVALHO, Joel O. EPSOsim - simulador de escalonamento de processos em sistemas operacionais. 2011. 92 f. Monografia de Graduação (Bacharelado em Ciências da Computação) - Faculdade Farias Brito, Fortaleza. Disponível em: <http://www.ffb.edu.br/sites/default/files/tcc-20111-joel-oliveira-carvalho.pdf>. Acesso em: 10 set. 2012. FRES, Osmar A.; ALONSO, Ignacio G. Rovim: a generic and extensible virtual machine for mobile robots. [S.1.], [2010]. Disponível em: <http://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=5464168&tag=1>. Acesso em: 20 abr. 2012. HECKE, Caroline. Ice Cream Sandwich está em 7% dos aparelhos com Android. [S.1], [2012]. Disponível em: <http://www.tecmundo.com.br/android/24517-ice-cream-sandwichesta-em-7-dos-aparelhos-com-android.htm>. Acesso em: 04 nov. 2012. HONORATO, Renata. ‘Vamos começar pelo professor', diz Mercadante sobre projeto de R$ 180 mi que levará tablets a escolas públicas. [S.1.], [2012]. Disponível em: <http://veja.abril.com.br/noticia/educacao/vamos-comecar-pelo-professor-diz-mercadantesobre-projeto-de-r-180-milhoes-que-levara-tablets-a-escolas-publicas>. Acesso em: 01 jun. 2012. LANDIM, Wikerson. O que é Wi-Fi? [S.1.], [2012]. Disponível em: <http://www.tecmundo.com.br/wi-fi/197-o-que-e-wi-fi-.htm>. Acesso em: 13 nov. 2012. 58 MACHADO, Francis B.; Maia, Luis P. Um Framework construtivista no aprendizado de Sistemas Operacionais - uma proposta pedagógica com o uso do simulador SOsim. In: WORKSHOP DE EDUCAÇÃO EM COMPUTAÇÃO, 24., 2004, Salvador. Anais eletrônicos... Salvador: UFBA, 2004. Disponível em: <http://www.training.com.br/sosim/sbcwei04.pdf>. Acesso em: 13 nov. 2012. MATTOS, Mauro M. et al. VXt: um ambiente didático para ensino de conceitos básicos de sistemas operacionais e arquitetura de computadores. In: WORKSHOP DE COMPUTAÇÃO DA REGIÃO SUL, 1., 2004, Florianópolis. Anais… Florianópolis: Unisul, 2004. Paginação irregular. MATTOS, Mauro M. Sistemas operacionais. 2012. Paginação irregular. Notas de aula (Disciplina de Sistemas Operacionais, Bacharelado em Ciências da Computação) - Centro de Exatas e Naturais, Departamento de Sistemas e Computação, Universidade Regional de Blumenau, Blumenau. MAZIERO, Carlos. Reflexões sobre o ensino prático de sistemas operacionais. In. WORKSHOP SOBRE EDUCAÇÃO EM COMPUTAÇÃO, (WEI2002), 1., 2002, Florianópolis. Anais... Florianópolis: PUCPR, 2002. p. 1-4. MEDEIROS, Thiago R. et al. IO Simulator: Um Simulador de Dispositivos de Entrada e Saída para Auxiliar o Ensino de Sistemas Operacionais. In: WORKSHOP SOBRE EDUCAÇÃO EM COMPUTAÇÃO, 19., 2011, Natal. Anais eletrônicos... Disponível em: <http://www.dimap.ufrn.br/csbc2011/anais/eventos/contents/WEI/Wei_Secao_5_Artigo_2_M edeiros.pdf>. Acesso em: 13 nov. 2012. MORIMOTO, Carlos E. Introdução aos sistemas de virtualização. [S.1.], [2010]. Disponível em: <http://www.hardware.com.br/dicas/intro-sistemas-virtualizacao.html>. Acesso em: 17 nov. 2012. MORITZ, Gustavo. Simulador de mecanismos de gerência de memória real e virtual. 2004. 81 f. Trabalho de Conclusão de Graduação (Bacharelado em Ciências da Computação) - Centro de Ciências Exatas e Naturais, Universidade Regional de Blumenau, Blumenau. Disponível em: <http://campeche.inf.furb.br/tccs/2004-II/20042gustavomoritzvf.pdf>. Acesso em: 10 out. 2012. MÜLLER, Nícolas. Framework, o que é e para que serve? [S.1], [2008]. Disponível em: <http://www.oficinadanet.com.br/artigo/1294/framework_o_que_e_e_para_que_serve>. Acesso em: 04 nov. 2012. PARKHI, Vaibhav. Multi-threading in Android using handler for message queue. [S.1], [2011]. Disponível em: <http://marakana.com/forums/android/examples/500.html>. Acesso em: 16 nov. 2012. PAULO, Marcus. SISO 2.0 – simulador de sistema operacional (módulo de deadlock). [S.1.], 2009. Disponível em: <http://www.martins.eti.br/2009/03/siso-20-simulador-desistema.html>. Acesso em 15 de novembro de 2011 59 PRADA, Rodrigo. O que é um acelerômetro? [S.1.], [2009]. Disponível em: <http://www.tecmundo.com.br/curiosidade/2652-o-que-e-um-acelerometro-.htm>. Acesso em 02 nov. 2012. SANTOS, Rogério S. et al. Guia de estruturação e administração do ambiente de cluster e grid. [S.1.], 2006. Disponível em <http://www.governoeletronico.gov.br/anexos/guia-decluster>. Acesso e 13 nov. 2012. SCHOUERY, Rafael C. S. Manual do desenvolvedor do HIPO: o computador hipotético. [S.1.], [2007]. Disponível em: <http://hipo.sourceforge.net/desenvolvedor.pdf>. Acesso em: 20 abr. 2012. SCHOUERY, Rafael C. S. Linux – inside III. [S.1.], [2012]. Disponível em: <http://blog.sirandsir.com/tag/hipo/>. Acesso em: 02 nov. 2012. SCOPE. Virtualization: state of the art. [S.l.], 2008. Disponível em: <http://www.scopealliance.org/pr/SCOPE-Virtualization-StateofTheArt-Version-1.0.pdf>. Acesso em: 22 set. 2008. SILVA, Marcos A. et al. BrasilOS: Um ambiente didático para auxílio ao ensino e aprendizado de sistemas operacionais. In: WORKSHOP SOBRE EDUCAÇÃO EM COMPUTAÇÃO, 21., 2011, Natal. Anais eletrônicos... Disponível em: <http://www.dimap.ufrn.br/csbc2011/anais/eventos/contents/WEI/Wei_Secao_2_Artigo_4_Si lva.pdf>. Acesso em: 13 nov. 2012. VEIGA, Marise S. Computador e educacão? Uma ótima combinação. [S.1.], [2001]. Disponível em: <http://www.pedagogiaemfoco.pro.br/inedu01.htm>. Acesso em: 14 abr. 2012.