EMPOTRANDO LINUX EN EL
386EX
Introducción
A continuación se describe la
forma de correr Linux con extenxiones RT en un sistema empotrado sin disco
duro. La aplicación a la
que se destina es el control distribuido
de un robot movil autoguiado.
Cada nodo del control del robot
esta formado por una plataforma basada en el Intel 386 ejecutando RT-Linux,
donde se ejecuta un conjunto de tareas de control que gobiernan los comportamientos
del robot.
i386-Engine
Se trata de un sistema microprocesador
de 32 bits basado en un Intel386Ex a 33 Mhz, diseñado para sistemas
empotrados. Es compatible PC, lo cual tiene la ventaja de permitir ejecutar
la gran cantidad de software disponible para esta plataforma.

Consideraciones iniciales
Consola
Evidentemente, la plataforma comentada
no dispone de soporte VGA. Es por tanto que necesitaremos un mecanismo
alternativo para operar sobre el sistema empotrado.
Linux soporta directamente consolas
sobre puertos serie, por tanto tenemos la ventaja de que podemos trabajar
directamente sobre el sistema gracias al soporte del sistema operativo.
Por otro lado, al ser el kernel
de Linux tan genérico, existe una gran cantidad de código
de inicialización en él para detectar el tipo de VGA del
sistema y configurarlo. En nuestro caso, todo este código es inecesario
y ocupa un espacio en memoria precioso, por lo que será eliminado
del kernel.
Memoria Virtual.
Otra caracteristica estandar del kernel
es el manejo de memoria virtual. Esta capacidad permite ejecutar programas
que usan mas memoria de la que existe en el sistema utilizando un medio
de almacenamiento secundario.
Obviamente, en un sistema que no
dispone de este medio no tiene utilidad la memoria virtual, por lo que
tambien podemos pensar en elmininar todo el código al respecto.
Además, en un sistema de tiempo real, las criticas restricciones
temporales no pueden verse afectadas por la variabilidad incontrolada que
este mecanismo introduce en los tiempos de ejecucion.
Sin embargo, la eliminación
de esta parte del código no es deseable, puesto que ademas soporta:
-
la compartición de páginas
de código, caracteristica que ya comentamos al principio que hacia
a Linux ventajoso.
-
Protección de paginas de memoria.
Por tanto, si eliminamos el código
de gestión de Memoria Virtual, además de invertir un esfuerzo
considerable en programación más el peligro de provocar inestabilidades
en el kernel, eliminamos esta característica.
La solución: La memoria virtual
puede ser anulada simplemente estableciendo el tamaño del espacio
de intercambio ( SWAP ) a cero.
Esto no tiene ninguna repercusion
en el sistema, puesto que:
-
Si un programa no cabe en la memoria
fisica, el kernel no lo ejecutará. Será responsabilidad del
programador cuidar el tamaño.
-
Si un programa en ejecución
solicita mas memoria, la llamada "malloc" del Kernel devolvera un error,
exactamente igual que cuando en un sistema con Memoria Virtual, esta se
agota.
Sistema de archivos
Nuestro sistema no dispone de unidades
de disco. Sin embargo, Linux no necesita un disco para arrancar y tampoco
para funcionar.
Las aplicaciones pueden ser compiladas
e incluidas junto con la imagen del kernel y por tanto cargadas y ejecutadas
directamente en el arranque del sistema desde nuestra EPROM.
Esto, que puede servir para sistemas
simples, obviamente reduce la flexibilidad del sistema, y también
la de linux, siendo este el sistema operativo que en la actualidad es capaz
de gestionar mas sistemas de archivos distintos.
Linux, gracias a su sistema virtual
de ficheros ( VFS ), es capaz de acceder a sistemas tanto remotos como
locales abstrayendo las posibles diferencias entre ellos.
En nuestro caso se ha optado por
un driver de EPROM por la facilidad y bajo coste que esto supone,
y ademas pensando en una futura ampliación, la inclusión
de un driver para un sistema de archivos via CAN (CANFS) y uno para serie
( SERIALFS).
Obviamente, incluyendo el hardware
adecuado, el sistema puede beneficiarse de sistema NFS, soportado directamente
por Linux, y que permitiria que el sistema empotrado utlizase el disco
montado fisicamente en otra máquina.
También existen soluciones
comerciales para incluir DiskOnChip, o discos de estado sólido,
si bien esta posibilidad es por ahora prohibitiva por su elevado coste.
Operación del sistema.
La máquina arranca desde un
sistema de archivos simulado sobre una EPROM. En esta misma EPROM se encuentra
la imagen del kernel y a continuación la imagen del sistema
de archivos.
|
0000
|
KERNEL
|
|
offset kernel
|
SISTEMA DE ARCHIVOS
|
Tras el arranque, el control lo
toma un pequeño Shell de Linux. Podemos optar entonces entre:
-
Trabajo Off-line: La máquina
es un sistema Linux, donde podemos operar para cargar programas, compilar,
depurar, etc...
-
Trabajo On-Line: Desde el sistema Linux,
arrancamos el conjunto de tareas de control. En ese momento Linux pasa
a ser la tarea menos prioritaria sin ningún proceso en ejecución,
pues el sistema esta dedicado al control.
Por tanto, el proceso de arranque quedará:
-
Encendido, test de arranque por parte
de la BIOS.
-
Ejecucion del cargador del kernel desde
la EPROM.
-
Descompresion y ejecucion del kernel.
-
Montaje del disco EPROM como sistema
root de Linux.
-
Ejecucion del Shell.
-
Opcionalmente, ejecucion de un script
que arranque las tareas.
Sistema de Desarrollo.
Con la configuración comentada
anteriormente no existe distinción entre el sistema utlizado para
desarrollar y el sistema objetivo, lo cual puede ser muy ventajoso pues
permite depuración y operaciones de mantenimiento sobre el propio
sistema de control.
Por otro lado, para generar el sistema
empotrado, necesitamos inicialmente un sistema de desarrollo. Se ha optado
por una distribucion de Linux SuSe 6.1 para tal fin. El sistema necesita
al menos un disco duro de 1 Gb, donde tendremos una partición del
sistema de al menos 800 Mb, para contener las herramientas y los fuentes
necesarios.
Adicionalmente es necesaria una
segunda partición, que nos servira para crear el sistema de archivos
que finalmente utilizara el sistema empotrado y que se grabará en
una EPROM junto con el kernel.
El sistema usado queda:
-
/dev/hda1: Sistema Linux
completo, para desarrollo.
-
/dev/hda2: Particion libre,
para crear sistema de archivos.
Es también posible prescindir
de la partición hda2 y usar un disco ram para generar tal sistema
de archivos, siempre y cuando este sea menor de 4 Mb que es el limite máximo
del disco ram. Es posible usar tamaños posibles, pero deberemos
recompilar el kernel.
Para hacer pruebas, se ha optado
por utilizar un segundo PC, cuya único requisito es que tenga disponible
una unidad de disquete. El PC simulará el 386ex, algo engorroso
para manejar en las pruebas y la disquetera simulará la EPROM
final. En el sistema de desarrollo podemos ir generando imagenes de arranque
sobre un disquete que probaremos sobre el PC de pruebas.
También será necesario
tener libre en el sistema de desarrollo un puerto serie, pues la consola
del sistema empotrado se realiza por un puerto serie RS-232 utlizando un
cable null-modem.
El mecanismo de comprobación
es por tanto:
-
Generación del disco de arranque
con el kernel empotrado.
-
Arranque de un terminal en el sistema
de desarrollo.
-
Arranque del PC de prueba desde el
disquete.
Desde el sistema de desarrollo podemos
operar sobre el sistema empotrado a traves de un emulador de terminal vt100
y ejecutar los programas desarrollados.
Estos últimos comprenden:
-
Adaptación del kernel a la plataforma.
-
Inclusión de las extensiones
RT en el kernel anterior.
-
Desarrollo de un driver de disco para
simular uno sobre EPROM.
-
Creación del sistema de ficheros
necesario para el sistema empotrado.
-
Desarrollo de las tareas de control
sobre el sistema empotrado