Documents
Resources
Learning Center
Upload
Plans & pricing Sign in
Sign Out

RT-Linux Sistemas Operacionais de Tempo Real

VIEWS: 403 PAGES: 15

									RTLinux - Sistema Operacional de Tempo Real baseado em Linux
por Denisângelo de Moura Rabelo Jorge Fabrício Lopes

Seminário de Sistemas de Tempo Real Mestrado em Mecatrônica

Universidade Federal da Bahia Salvador-Ba 10 de agosto de 2005

SUMÁRIO

1 Introdução 2 Arquitetura 3 Implementação 3.1 Emulando interrupções 3.2 Escalonamento 3.3 Comunicação entre processos 4 Aplicações 5 Como instalar o RTLinux 6 Conclusão 7 Bibliografia

1 INTRODUÇÃO

O RTLinux é um sistema operacional de tempo real crítico. Seu kernel é uma extensão do Linux que se propõe a suportar tarefas com restrições temporais. Neste documento não serão abordados conceitos sobre sistemas de tempo real como também sobre o SO Linux. O seu desenvolvimento foi iniciado no Departamento de Ciência da Computação do Instituto Tecnológico do Novo México, por Michael Barabanov e Victor Yodaiken. Atualmente, o seu desenvolvimento e suporte técnico estão por conta da empresa FSM Labs, que recentemente patenteou uma arquitetura original no qual é baseado o RTLinux.

2 ARQUITETURA É importante não confundir a versão do RTLinux com a versão do kernel do Linux. RTLinux não é um código independente, isto é, não é uma nova versão de Linux. Parte da distribuição do RTLinux é um "patch" sobre o kernel do Linux e a outra parte são módulos carregáveis. Cada versão do RTLinux está moldada para funcionar sobre uma versão do kernel do Linux. O RTLinux é um sistema operacional no qual um kernel de tempo real coexiste com o kernel do Linux. O objetivo deste modelo é permitir e facilitar que aplicações utilizem os serviços do Linux (comunicação com a rede, sistema de arquivos, controle de processos etc.). O Linux é responsável até mesmo pela inicialização do RTLinux e pelos drivers. O kernel de tempo real situa-se entre o kernel do Linux padrão e o hardware (figura 1.2). Além disso, o kernel de tempo real executa o kernel convencional como sua tarefa de mais baixa prioridade (tarefa Linux), usando o conceito de máquina virtual para tornar o kernel convencional e todas as suas aplicações completamente interrompíveis.

Figura 1.1: Detalhes do Kernel do Linux

Figura 1.2: Detalhes do kernel do RT-Linux Na Figura 1.1 é mostrado o Kernel básico do Linux sem suporte de tempo real. Pode-se observar que o Kernel do Linux separa o hardware das tarefas de nível de usuário. O Kernel tem a função de gerenciar todas as tarefas de nível de usuário. Por exemplo, a tarefa de controle de um braço robótico. O Kernel padrão do Linux poderá interromper a tarefa e dar o processador a uma tarefa de menor prioridade. Conseqüentemente, o braço não irá funcionar pela falta de

sincronismo. Assim, ao tentar ser "justo" (compartilhando o uso da CPU) a todas as tarefas, o Kernel pode impedir que os eventos de maior prioridade ocorram. Na Figura 1.2 é mostrado o kernel do Linux modificado para suportar tempo real. É introduzida uma camada adicional de abstração – denominada “máquina virtual" - entre o kernel padrão do Linux e o hardware do computador. Isso é muito importante, pois esta nova camada introduz seu próprio escalonamento de prioridades fixas. Este escalonamento atribui prioridade mais baixa para o kernel padrão de Linux, que funciona então como uma tarefa independente. A camada de abstração introduzida pelo RTLinux trabalha interceptando todas as interrupções de hardware. As interrupções de hardware não relacionadas às tarefas de tempo real, como interrupção de software, são passadas então ao kernel do Linux para serem executadas. Caso a tarefa seja de tempo real, a rotina de serviço de tempo real apropriada é executada. As tarefas de tempo real têm dois atributos especiais: são “privilegiadas" (isto é, têm o acesso direto ao hardware), e não usam a memória virtual. As tarefas de tempo real são escritas como os módulos que podem ser dinamicamente carregados na memória. As tarefas de tempo real não esperam para executar as chamadas de sistema Linux. Quando um módulo é carregado, os atributos das tarefas de tempo real (deadline, período, e restrições temporais) são informados ao RTLinux. As tarefas nãoperiódicas são suportadas através do uso de interrupções.

3 IMPLEMENTAÇÃO 3.1 Emulando Interrupções Um dos problemas de tempo real crítico em sistemas Linux é o fato de que o kernel desabilita as interrupções temporariamente como forma de sincronização ou controle de acesso a regiões críticas. Ao desabilitar as interrupções, o relógio

de interrupções fica bloqueado e conseqüentemente há uma perda de precisão temporal. O RTLinux implementa uma camada de emulação entre o Kernel do Linux e o controlador de interrupções de hardware. Todas a chamadas para cli, sti, iret (chamadas assembler que modificam o estado das interrupções) são repassadas pelas macros S_CLI, S_STI e S_IRET que emulam as chamadas cli, sti e iret respectivamente. Desta forma o Linux nunca poderá desabilitar as interrupções. Sempre quando surge uma interrupção o emulador checa suas variáveis. Se a interrupção for ativada pelo Linux, o controlador de interrupção do Linux é invocado imediatamente. Se, por outro lado, as interrupções de Linux são desabilitadas, o controlador não é invocado. Ao invés disto, um bit é ajustado na variável que contém a informação de todas as interrupções pendentes. Quando o Linux reabilita as interrupções o controlador executa as interrupções pendentes. Cada interrupção simulada é chamada de interrupção de software. Desde que o Linux não tenha controle sobre o controlador de interrupções isto não influencia no processamento das interrupções de tempo real que não passam através do emulador. Todas as macros são escritas em assembler. A macro S_CLI simplesmente reinicia a variável que contém o estado das interrupções Linux. A macro S_STI atualiza a pilha como se uma interrupção estivesse sendo manipulada, e então usa a macro S_IRET para emular o retorno. Esse trabalho é devido à macro S_IRET habilitar as interrupções de software somente quando a iret é invocada. 3.2 Escalonamento A principal função de um escalonador de tempo real é satisfazer os requisitos temporais das tarefas. Existem muitas formas de garantir as restrições

temporais e há também muitas políticas de escalonamento, sendo que, uma política dificilmente é apropriada para todas as aplicações. O RTLinux permite a possibilidade de um programador escrever o seu próprio escalonador (Figura 1.3). Os escalonadores podem ser implementados e carregados como módulos de kernel. Isto torna possível o programador testar facilmente diferentes políticas e algoritmos de escalonamento a fim de escolher o melhor para a sua aplicação. Dois escalonadores podem ser bem implementados. Um deles é baseado em prioridade fixa, onde cada tarefa é determinada com uma única prioridade. Se houver diversas tarefas que estão prontas para executar, a tarefa com maior prioridade é executada. Sempre que as tarefas se tornam prontas para serem executadas então a tarefa em execução é interrompida se esta for de baixa prioridade. O escalonador suporta diretamente tarefas periódicas. O período e o tempo de ativação são especificados para cada tarefa. Uma tarefa esporádica pode ser implementada definindo uma interrupção para ativá-la quando necessário. Para tarefas periódicas com os fins do prazo iguais aos períodos uma maneira natural de atribuir prioridades é dada pelo algoritmo de escalonamento rate monotonic. Este algoritmo diz que as tarefas com períodos mais curtos têm maior prioridade. As tarefas Linux são tratadas como tarefas de baixa prioridade. Assim o Linux funciona somente quando o sistema do tempo do real não tem nada para fazer.

Outro escalonador é o que foi implementado por Ismael Ripoll, onde ele usa o algoritmo Earliest Deadline First (EDF). Neste algoritmo as tarefas não têm prioridade. Assim, as tarefas com menor deadline possuem maior prioridade.

Figura 1.3: Modelo de escalonamento em RTLinux

3.3 Comunicação entre processos Desde que o Linux possa ser preemptado por qualquer tarefa de tempo real a qualquer momento, nenhuma rotina Linux pode ser chamada de forma segura a partir de uma tarefa de tempo real. Porém, alguns mecanismos de comunicação devem estar presentes. Filas FIFO são usados pelo RTLinux para manipular informações entre processos Linux ou entre o kernel do Linux e processos de tempo real. As filas RT-FIFO são alocados no nível do kernel e são referenciadas por números inteiros. Existe um limite estático para o número de filas FIFOs que podem ser mudadas durante a recompilação do kernel.

Contudo, processos Linux enxergam as filas FIFOs como arquivos especiais de caracteres. Normalmente estão no diretório /dev/rtf0, dev/rtf1, etc. As FIFOs são utilizadas como se fossem arquivos normais (open read/write close). Para poder utilizá-las, elas devem ter sido criadas antes que um processo normal do Linux possa fazer um open sobre ela.

4 APLICAÇÕES O campo de aplicação de RTLinux é muito amplo, com ele podemos tomar o controle total do PC. Em uma tarefa de tempo real, podemos acessar todas as portas do PC, instalar controladores de interrupções, desabilitar temporariamente as interrupções, ou seja, pode-se deixar a máquina em suspenso, como se tratasse de um Windows. Atualmente é utilizado em plantas industriais, na forma de controle e automatização, onde um simples erro pode provocar um desastre. Também é utilizado como componentes na fabricação de produtos tais como roteadores, receptores GPS e sistemas embarcados, no caso da automação e controle industrial. O RTLinux se integra facilmente com os sistemas corporativos, tais como acesso à base de dados como Oracle e o DB2 e servidores Web. Muitas empresas utilizam o RTLinux em suas instalações e atividades tais como: a Agencia Espacial Norte Americana (NASA), utiliza RT Linux para científicos, a Siemens automatizou sua fábrica com RTLinux. controle de mísseis, a Fujitsu utiliza-o em controle de robôs, telescópios e outros projetos

5 COMO INSTALAR O RT LINUX

Antes

de

tudo

é

necessário

fazer

o

download

dos

arquivos

prepatched_linux_kernel-2.4.29-rtl.tgz , que é o kernel do linux já com os patchs instalados para rodar o RTLinux, e o do arquivo rtlinux-3.2-rc1.tgz, que é kernel do RT-Linux, seus módulos e alguns exemplos de aplicações em tempo-real. A seguir os passos desde a recompilação do novo kernel até a instalação do RT-Linux. Todos os comandos devem ser usados como root. Antes de qualquer coisa dentro de /usr/src digitar os comandos: tar -zxvf prepatched_linux_kernel-2.4.29-rtl.tgz tar -zxvf rtlinux-3.1-rc1.tgz 1 – Dentro de /usr/src criar um link simbólico para o arquivo do kernel: ln -s linux-2.4.29-rtl linux-2.4-rtl 2 – Dentro da pasta linux-2.4.29-rtl digitar: make mrproper 3 – Copiar a configuração atual do Kernel usando: cp /boot/config-2.4.xxx /usr/src/linux-2.4.29-rtl/.config 4 – Dentro de /usr/src/linux-2.4.29-rtl executar o comando: make xconfig Escolher a opção “Load Configuration from File”, depois escolher “/usr/src/linux-2.4.29-rtl/.config” e apertar ENTER. Em “Processor types and features”, marcar MTRR como "n", depois ir em “Processor family” e selecionar "386". Marcar "RTLinuxHall" com "y". Em "General Support" marcar "n" tanto para "APM BIOS" quanto para "Power Management Support". Por fim, Selecionar EXIT, clicar em ENTER novamente e quando aparecer a mensagem “Do you wish to save your new kernel

configuration?”, selecionar “YES” e ENTER mais uma vez. 5 – Executar em /usr/src/linux-2.4.29-rtl os comandos: make clean make dep 6 – Para compilar e gerar a imagem do kernel digitar: make bzImage Obs. em bzImage, o "i" é maiúsculo "I". 7 – Executar o comando: make modules Assim que o mesmo terminar executar: make modules_install Correspondem respectivamente a compilação e instalação dos módulos. A instalação é feita no diretório /lib/modules/2.4.29-rtl-3.1. 8 – Bem, aqui são feitas cópias de 2 arquivos que serão necessários para a inicialização do sistema: cp /usr/src/linux-2.4.29-rtl/arch/i386/boot/bzImage /boot/vmlinux-2.4.29-rtl cp /usr/src/linux-2.4.29-rtl/System.map /boot/System.map-2.4.29-rtl 9 – Em /boot, criar um link simbólico para o arquivo System.map-2.4.29-rtl assim: ln -s System.map-2.4.29-rtl System.map-rtl

10 – Dentro de /boot, criar o arquivo initrd-2.4.29-rtl.img que irá carregar os módulos do kernel durante a inicialização, com o comando:

mkinitrd /boot/initrd-2.4.29-rtl.img 2.4.29-rtl-3.1 11 – Configurar o gerenciador de boot, /boot/grub/menu.lst. É só acrescentar as linhas: title RT - Linux root (hd0,0) kernel /vmlinux-2.4.29-rtl initrd /initrd-2.4.29-rtl.img 12 – Reiniciar o sistema e testar o novo kernel. 13 – Caso o sistema reinicie normalmente com o novo kernel, pode -se então instalar o RTLinux. Entrar no diretório com os fontes do RTLinux: cd /usr/src/rtlinux-3.2-rc1 14 – Configurar o RTLinux: make xconfig Não há necessidade de nenhuma alteração. 15 - Checar dependências (opcional, normalmente o comando "make" realizará este procedimento se for pulado. Aconselha-se então a pular): make dep 16 – Gerar o kernel RTLinux e seus módulos: make 17 – Gerar dispositivos e instalar o RTLinux: make install 18 – Testar o RTLinux e seus módulos: make regression

Isto verificará se o kernel do linux ou o RTLinux foi mal configurado ou mal recompilado. Todos os resultados devem aparecer [OK]. 19 – Para iniciar o RTLinux: rtlinux start Esse comando fará exibir algumas mensagens como estas, dependendo da configuração do RTLinux. (+)rtl.o (+)rtl_fifo.o (+)mbuff.o ... (+) significa que o módulo foi carregado com sucesso e (-), que não foi carregado. 20 – Verificar o estado do RTLinux: rtlinux status Exibe os módulos carregados e descarregados (+/-) com o comando "rtlinux start". 21 – Parar o RTLinux: rtlinux stop Descarrega todos os módulos: (-)rtl.o (-)rtl_fifo.o (-)mbuff.o ... 6 CONCLUSÃO

Este documento procurou mostrar como o sistema operacional linux trabalha em tempo real, tendo em vista que o mesmo não foi desenvolvido com esse fim específico, no entanto algumas modificações em seu Kernel pode habilitá-lo a tratar questões dessa magnitude. O texto tratou sobre o RTLinux, sistema operacional de tempo real critico onde seu kernel suporta tarefas com restrições temporais criticas, tornando o Linux utilizável para situações que envolva tempo real. Foi feito um estudo minucioso acerca da arquitetura do RTLinux, evidenciando o tratamento das tarefas entre o mesmo e o Linux, onde é introduzida o conceito de camada de abstração entre o kernel do Linux e o hardware do computador. Também foi assinalado como é realizado as interrupções e o escalonamento, já que o RTLinux coexiste com o kernel do Linux. Por fim foi mostrado algumas necessidades da utilização de sistemas de tempo real Linux, bem como as suas infinitas possibilidades de aplicações. A mensagem central que esse documento procura transmitir é que sistemas de tempo real são cada vez mais requisitados e que um melhor aproveitamento de sistemas operacionais como Linux pode ajudar no tratamento a essas questões.

7 BIBLIOGRAFIA [1] M. Barabanov; A Linux-based Real-Time Operanting System, M.S. Thesis, New Mexico Institute of Technology, 1997.

[2] V. Yodaikien; The RTLinux Manifesto, New Mexico intitute of Technology, 1999. [3] RTLinuxFree documentation. Disponível em www.rtlinuxfree.com.


								
To top