• Nenhum resultado encontrado

Verificação do ficheiro class

No documento Máquina virtual Java em FPGA (páginas 73-77)

3.3 Máquina Virtual Java

3.3.6 Verificação do ficheiro class

Embora os compiladores de Java produzam ficheiros class de acordo com as especificações descritas, não há garantia de que a máquina virtual Java vá rece- ber um ficheiro class. Portanto, torna-se necessário verificar se o ficheiro a ser carregado para a máquina virtual Java é um ficheiro class normal. A verificação do ficheiro consiste em quatro passos:

1. O primeiro passo consiste em verificar se o ficheiro tem o formato básico de um ficheiro class. Os primeiros quatro bytes devem conter o magic number correto, todos os atributos devem ter o tamanho certo e o ficheiro class não pode estar truncado ou ter bytes extra no fim. A constant_pool não deve conter nenhuma informação irreconhecível;

2. O verificador deve:

- Assegurar que as classes final não são subclasses e que os métodos finalnão são anulados;

- Verificar se cada classe (excepto a Object) tem um super-classe direta; - Assegurar que a constant_pool satisfaz as restrições documenta- das, por exemplo, cada estrutura CONSTANT_Class_info na constant pool deve ter no seu item name_index um índice válido da constant pool para uma estrutura do tipo CONSTANT_Utf8_info;

- Verificar se todas as referências a métodos e campos na constant_- pooltêm nomes válidos, classes válidas e um tipo de descriptor válido. 3. Durante a fase de linking, o verificador analisa o array code do atributo Code para cada método do ficheiro class, verificando o fluxo de dados em cada método. Assim, o verificador assegura que, em qualquer ponto do programa, o seguinte seja verdade:

- A operand stack tem sempre o mesmo tamanho e contém os mesmos tipos de valores;

- Nenhuma variável local é acedida a não ser que contenha um valor de um tipo apropriado;

- Os métodos são invocados com os argumentos apropriados;

- Os campos são atribuídos usando apenas valores de tipos apropriados; - Todos os opcodes têm tipos de argumentos apropriados na operand stack

e no array de variáveis locais.

4. É um passo virtual realizado por instruções da máquina virtual Java. Na primeira vez que uma instrução, que referencia um tipo, é executada, a ins- trução de execução carrega a definição do tipo referenciado, se ainda não tiver sido carregada e verifica que o tipo a ser executado atualmente tem permissão para referir o tipo.

A primeira vez que uma instrução invoca um método ou acede ou modifica um campo, a instrução assegura que o método ou campo referenciado existe numa determinada classe, verifica se o método ou o campo tem o descriptor indicado, assim como se o método a ser executado atualmente tem acesso ao método ou campo referenciado.

Field-Programmable Gate Array

As FPGA são dispositivos semicondutores programáveis que se baseiam numa matriz de CLB ligados através de interligações programáveis. Estes dispositivos permitem programar hardware diretamente, criando circuitos que poderiam ser fabricados sob a forma de chips por exemplo. Ao contrário dos dispositivos ASIC, onde o dispositivo é fabricado de forma personalizada para um projeto particu- lar, as FPGAs podem ser programadas de acordo com a aplicação pretendida ou os requisitos de funcionalidade. Apesar de estarem disponíveis FPGAs do tipo OTP, o tipo dominante é a FPGA baseada em SRAM, que pode ser programada conforme o desenho vai evoluindo [26].

Estes dispositivos permitem aos programadores mudar os seus projetos à medida que os vão desenvolvendo, mesmo depois do produto final ter sido concluído e testado em cenário real. Permitem fazer mudanças ou upgrades mesmo quando a FPGA já está a desempenhar as suas funções no cenário real, eliminando custos associados ao re-design ou à mudança manual de sistemas eletrónicos [26]. Por- tanto, se algum erro for detetado ou o projeto implementado não for o ideal, há sempre possibilidade de mudar o projeto sem haver a necessidade de comprar um novo dispositivo ou modificar os seus circuitos manualmente. Pode-se afir- mar também que se a FPGA deixar de ser necessária num determinado trabalho, pode sempre ser utilizada noutro contexto, com um programa completamente diferente e executando funções distintas das anteriores, o que a torna num dispo- sitivo altamente rentável. Existem algumas empresas que se dedicam ao fabrico de FPGAs e software associado, as duas mais conhecidas são a Xilinx e a Altera.

As FPGA evoluíram desde o seu aparecimento em 1985, com a FPGA XC2064 da Xilinx [27], e muito para além das capacidades básicas dos seus predecessores. In- corporam blocos de funcionalidades normalmente usadas por quem desenvolve projetos ao nível da eletrónica como RAM, DCM ou DSP. Os componentes básicos gerais, ilustrados na figura 4.1, de uma FPGA são [26]:

- CLB - é a unidade lógica básica da FPGA. O número exato de CLB e os seus recursos variam entre dispositivos, mas cada CLB consiste numa matriz de switches configuráveis com quatro ou seis entradas, alguns circuitos de sele- ção como multiplexers, e flip-flops. A matriz de switches é altamente flexível e pode ser configurada para lidar com lógica combinatorial, shift registers ou RAM.

- Interligações - enquanto os CLB fornecem a capacidade lógica à FPGA, as interligações flexíveis guiam os sinais entre CLB, e de e para os I/Os. Este procedimento tem o nome de routing e é realizado automaticamente pelo software de programação da FPGA, o que reduz a complexidade do design, e escondido do utilizador, a não ser que este opte por saber como se realiza o routing e pode fazê-lo manualmente também.

- IOB - as FPGA atuais fornecem suporte para dezenas de portas de I/O stan- dard, constituindo assim a ponte de interface das FPGA. As IOB nas FPGA estão agrupados em blocos, cada um suportando um standard I/O diferente. - Memória - Existe um bloco de memória RAM embebido, chamado Block RAM (BRAM) na maioria das FPGA, que permite obter memória on-chip para o projeto a ser implementado. As suas capacidades variam entre as FPGA e suportam operações em dual-port.

- DCM - A maioria das FPGAs fornece um sistema de gestão digital do reló- gio, que permite criar um sinal de relógio preciso, entre outras funcionali- dades.

Devido à sua natureza programável, as FPGA são o recurso ideal para vários mercados como o aeroespecial e defesa, automóvel, difusão, eletrónica de con- sumo, computação de alto desempenho, industrial, medicina, comunicações, e para várias tecnologias como áudio, vídeo e imagem [26].

Figura 4.1: Estrutura interna genérica de uma FPGA [26].

O processo geral necessário para implementar um circuito numa FPGA, a partir do programa desenvolvido, consiste nos seguintes passos [28]:

• Otimização lógica - executa minimização a vários níveis de equações Boo- leanas para otimizar área, atrasos ou a combinação de ambos;

• Tecnologia de mapeamento - transforma as equações booleanas num cir- cuito de blocos lógicos na FPGA. Nesta fase também é otimizado o número total de blocos lógicos requeridos (otimização de área) ou o número de blo- cos de memória em caminhos de tempo-crítico (optimização de atrasos); • Placement (localizar) - seleciona a localização específica para cada bloco ló-

gico na FPGA, enquanto tenta minimizar o comprimento total das ligações necessárias;

• Routing - liga os recursos de routing disponíveis na FPGA aos blocos lógi- cos distribuídos pelo dispositivo pela ferramenta de Placement, levando os sinais de onde são gerados até onde são utilizados.

No documento Máquina virtual Java em FPGA (páginas 73-77)

Documentos relacionados