• Aucun résultat trouvé

The properties of iron under pressure

3.7 Summary

4.1.1 The properties of iron under pressure

Quando o projeto de um sistema embarcado requer o uso de um sistema operacional, duas questões complementares devem ser consideradas: os recursos da plataforma virtual e o porte do sistema operacional. Tomando como base a plataforma mínima discutida na seção anterior, fez-se necessário incluir novos recursos, tais como, modelo do processador com suporte à interrupção e temporização adequada da plataforma. Por outro lado, uma vez definido o sistema operacional, o porte consistiu em, a partir de uma versão próxima à plataforma alvo, realizar as modificações necessárias no sistema para dar suporte ao novo hardware. Essas modificações serão menores quanto mais próxima for a versão original do sistema operacional da plataforma. No entanto, o porte de um sistema operacional envolveu modificações minuciosas em código dependente de hardware, device drivers e mapeamento de endereços que são extremamente susceptíveis a erros.

Dessa forma, para abordar estas questões, foi desenvolvida uma estratégia para realizar o porte do sistema operacional e a extensão da plataforma virtual em paralelo.

Tese de Doutorado – Exemplo de Desenvolvimento Usando a Linguagem DevC 106

Essa estratégia explorou as características de extensibilidade e flexibilidade da plataforma virtual, o que tornou possível adotar um desenvolvimento incremental, partindo-se de uma plataforma mais simples para uma mais completa, à medida que novas funcionalidades do sistema operacional eram consideradas no processo de porte [70].

Inicialmente, a análise do processo de boot permitiu detectar algumas limitações no processador Archc-Sparc. O modelo original desse processador foi desenvolvido para aplicações do usuário com suporte da ABI (Application Binary Interface). Em geral, essas aplicações não possuem instruções privilegiadas e as chamadas de sistemas são resolvidas pela biblioteca ac_syscall. Por outro lado, a parte dependente de hardware de um sistema operacional inclui instruções privilegiadas que não estavam implementadas no modelo original do processador. Assim, o modelo do processador foi estendido para incluir novas instruções. A Tabela 5.1 lista as instruções adicionadas ao modelo para dar suporte à execução do sistema operacional [20].

Tabela 5.1: Instruções adicionadas ao modelo original do ArchC-Sparc

Instrução Descrição

wrpsr Escreve no registrador PSR (status)

rdpsr Lê o registrador PSR

wrtbr Escreve no registrador TBR (traps) rdtbr Lê do registrador TBR (traps)

windowoverflow Trap de hardware

windowundeflow Trap de hardware

Outro recurso fundamental para permitir a execução de um sistema operacional é o reconhecimento e o tratamento de eventos, através de traps e interrupções, por parte do processador. Estas características são importantes porque algumas partes do sistema operacional dependem da ocorrência de determinados eventos para o seu funcionamento correto. Por exemplo, o escalonador funciona com base nas temporizações oriundas do sistema de tempo da plataforma que, por sua vez, gera interrupções em um intervalo de

Tese de Doutorado – Exemplo de Desenvolvimento Usando a Linguagem DevC 107

tempo predeterminado. Além disso, a interrupção é um dos principais mecanismos de sincronização com os dispositivos de entrada e saída. O modelo original do processador foi estendido para reconhecer e tratar os eventos necessários à execução de uma imagem do sistema operacional. A Tabela 5.2 mostra a especificação do modelo do processador em ArchC para adicionar tais recursos.

Tabela 5.2: Parte da especificação em ArchC

Recursos Instruções 1. AC_ARCH(sparcv8){ 2. 3. ac_tlm_intr_port intrp; 4. 5. ac_tlm_port debug_mode:1; 6. 7. ac_tlm_port irq_resp:1; 8. . 9. . 10. . 11. 12. } 1. AC_ISA(sparcv8){ 2.

3. ac_instr<Type_F3A> wrtbr_reg, wrpsr_reg, wrwim_reg; 4. ac_instr<Type_F3B> rdtbr, wrtbr_imm, rdpsr, wrpsr_imm, 5. rdwim, wrwim_imm; 6. 7. ac_instr<Type_F3A> rett_reg; 8. 9. ac_instr<Type_F3B> rett_imm; 10. ... 11. 12. ISA_CTOR(sparcv8){ 13. rdtbr.set_decoder(op=0x02, op3=0x2b);

14. wrtbr_reg.set_decoder(op=0x02, op3=0x33, is=0x00); 15. wrtbr_imm.set_decoder(op=0x02, op3=0x33, is=0x01); 16. wrpsr_reg.set_decoder(op=0x02, op3=0x31, is=0x00); 17. wrpsr_imm.set_decoder(op=0x02, op3=0x31, is=0x01); 18. rdwim.set_decoder(op=0x02, op3=0x2a);

19. wrwim_reg.set_decoder(op=0x02, op3=0x32, is=0x00); 20. wrwim_imm.set_decoder(op=0x02, op3=0x32, is=0x01); 21. rett_reg.set_decoder(op=0x02, op3=0x39, is=0x00); 22. rett_imm.set_decoder(op=0x02, op3=0x39, is=0x01); 23. ...

24. } 25. ... 26.} 27.

Na primeira coluna, têm-se as declarações dos recursos estruturais adicionados ao processador. As portas para interrupção são declaradas nas linhas 3 e 7. A porta intrp recebe uma solicitação de interrupção e a porta intr_resp responde ao controlador que a mesma será atendida. Essas portas seguem o padrão TLM (Transaction Level Modeling) para comunicação entre componentes de uma plataforma [72]. Na linha 5 é adicionada uma porta para se comunicar com o depurador (sparc-elf-gdb). O processo de depuração usando o sparc-elf-gdb foi fundamental para a realização do porte do sistema operacional na plataforma virtual baseada no processador Archc-Sparc.

Na coluna ao lado (Tabela 5.2) estão as instruções do sparc que foram adicionadas ao modelo. Nas linhas de 3 a 5 são declaradas as instruções para acessar os registradores PSR, TBR e WIN do sparc [20]. As linhas 7 e 9 declaram as instruções para o retorno do tratamento de traps e interrupções. Os códigos de operação de cada instrução estão especificados nas linhas de 13 a 22, de acordo com a sintaxe de ArchC [69].

Tese de Doutorado – Exemplo de Desenvolvimento Usando a Linguagem DevC 108

Além da extensão do modelo ArchC do processador, algumas modificações foram realizadas diretamente nos arquivos C++ gerados pela ferramenta acsim – gerador do simulador do ArchC [69]. Novas funcionalidades foram adicionadas principalmente no comportamento do processador relativo ao tratamento de traps e interrupções. Com isso, o modelo do processador estava totalmente apto a suportar a execução de um sistema operacional. As modificações no processador Archc-Sparc foram realizadas em cooperação com a equipe de desenvolvimento e suporte do Archc [24] do Instituto de Computação (IC) da Universidade de Campinas (Unicamp).

Outros componentes foram necessários para dar suporte à execução de um sistema operacional embarcado, além do modelo do processador estendido (ver Figura 5.2). A plataforma mínima não dispunha de um sistema de temporização, recurso necessário para o funcionamento de alguns componentes do SO, principalmente o escalonador de processos. Assim, foi projetado um timer em SystemC baseado no componente da plataforma LEON [73]. O modelo simplificado possui dois registradores de carga, um registrador de controle e dois contadores: prescaler e timer. O componente gera uma interrupção para o processador em uma frequência que depende dos valores configurados em seus registradores. O prescaler funciona como um divisor de frequência. Ele é decrementado a cada pulso de clock da plataforma e quando ocorre um underflow, ele gera um pulso para o timer. Então, esse contador é decrementado e quando o seu conteúdo chega a zero, ocorre um underflow e uma interrupção é gerada. O sistema operacional deve configurar os registradores do temporizador ainda na inicialização do sistema (processo de boot).

Um controlador de interrupção também foi adicionado à plataforma. Ele foi desenvolvido em SystemC com base no modelo de simulação da biblioteca scml disponibilizado pela coware [35]. As portas de interrupção dos vários periféricos convergem para o controlador que, por sua vez, conecta-se a porta de interrupção do Archc-Sparc. Com isso, o processador só necessita de uma porta para interrupção.

Finalmente, um componente de entrada e saída foi desenvolvido para possibilitar a comunicação serial da plataforma com o mundo exterior. A UART (Universal

Assynchronous Receive Transmit), baseada no modelo da plataforma do LEON [73], foi implementada em SystemC. Essa UART implementa as operações de transmissão e

Tese de Doutorado – Exemplo de Desenvolvimento Usando a Linguagem DevC 109

recepção de dados em frames de 8 bits, além dos bits de start e stop. As operações de envio e recepção podem ser sincronizadas com o driver através dos mecanismos de

polling ou interrupção. A UART foi implementada com um canal socket para possibilitar que um terminal virtual do usuário, executando no mesmo computador ou em computador remoto, pudesse ser conectado à plataforma e, com isso, possibilitou que o usuário interaja diretamente com o software embarcado executando no modelo da plataforma simulável. A Figura 5.2 apresenta a plataforma com os componentes necessários para a execução do sistema operacional.

Figura 5.2: Plataforma com suporte à execução de um sistema operacional

Concomitantemente ao desenvolvimento da plataforma, foi realizado o porte do sistema operacional uclinux.