zOS (Z-Sistema Operativo)

English

zOS

zOS es un derivado de la aplicacion de prueba ZPUTA, creada para verificar las operaciones de la ZPU Evo y del SoC. ZPUTA evoluciono a medida que varios FPGAs se incluyeron en el alcance de la ZPU Evo, y quedo claro que necesitaba ser mas avanzada debido a los recursos limitados. Cuando ZPUTA alcanzo un grado de sofisticacion similar a un sistema operativo, se dividio y nacio zOS.

Originalmente, los desarrollos de ZPUTA/zOS se dirigian solo a la arquitectura ZPU, y tenian dos metodos de ejecucion principales:
  • como aplicacion arrancada por IOCP,
  • de forma autonoma como firmware de inicio de la ZPU Evo.
El modo de inicio se elige en la configuracion y la funcionalidad es identica. Cuando se arranca como aplicacion desde IOCP, zOS se almacena en una tarjeta SD y se carga durante el arranque. En modo autonomo, zOS se almacena en la flash integrada (o BRAM preconfigurada como ROM).

Recientemente, zOS se ha portado a la arquitectura ARM Cortex-M4, para su uso con el Freescale K64F en el proyecto tranZPUterSW. Dado que el K64F es una CPU/SoC de arquitectura fija, solo existe un metodo de ejecucion: 'autonomo' -- almacenado en la flash integrada e iniciado cuando la CPU se enciende.

En zOS, toda la funcionalidad que no es del sistema operativo se almacena como aplicaciones en una tarjeta SD. Si no hay tarjeta SD disponible, es mejor utilizar ZPUTA, ya que ofrece la posibilidad de tener en cuenta los limitados recursos BRAM del FPGA al permitir habilitar/deshabilitar todas las funciones de ZPUTA dentro de la imagen cargada primariamente.

Para su funcionamiento, zOS requiere una conexion serial (fisica o USB virtual) con preferiblemente un paquete de emulacion de terminal ANSI/VT100. El requisito de un paquete de emulacion de terminal ANSI/VT100 es para que comandos como el editor o readline funcionen correctamente. Un terminal serial simple tambien funcionara, pero con funcionalidad de aplicacion limitada.

Un desarrollo de hardware mas reciente, el tranZPUter SW-700 v1.3, ve a zOS funcionando como sistema operativo host donde el teclado y la pantalla estan bajo su control directo. Para mantener la compatibilidad con las aplicaciones seriales, se ha desarrollado e integrado un emulador de terminal ANSI.

Uso del sistema operativo

A lo largo de mi carrera he utilizado o disenado sistemas donde se podia interactuar en vivo con el producto final para monitorizarlo, adaptar el flujo logico segun los cambios del mercado o resolver problemas en tiempo real. Esto se realizaba normalmente a traves de un procesador de comandos integrado utilizando la conexion cliente-servidor TCP.

Trabajando en algunos de mis proyectos en este repositorio, siempre tuve en mente que queria un entorno similar, incluso en un sistema embebido con recursos limitados, donde pudiera monitorizar, modificar o reparar sobre la marcha.

La interfaz del sistema operativo se escribio considerando que solo esta disponible un terminal textual serial. Algunos componentes como el editor requieren capacidades avanzadas, y para este proposito se eligio la probada emulacion VT100/ANSI como candidato adecuado. La interaccion es basada en teclado y texto (nada de bonitas interfaces GUI!).

Linea de comandos

El primer encuentro con el sistema operativo es un mensaje de inicio de sesion que muestra la CPU, version, etc. y presenta un prompt para la entrada de comandos:

zOS Startup Screen

La interaccion con el sistema operativo no difiere de MSDOS -- se escribe un comando y se recibe una respuesta. La linea de comandos de zOS no es un interprete de shell, sino solo una interfaz de texto simple para emitir comandos incorporados o comandos almacenados en la tarjeta SD. Incluye una funcionalidad readline simplificada con historial para asistir en la entrada y recuperacion de comandos.


Key Action
CTRL-A Go to start of line.
CTRL-B Move cursor one position to the left.
CTRL-C Abort current line and return CTRL-C to calling application.
CTRL-D Not defined in shell, passed to running application.
CTRL-E Go to end of line.
CTRL-F Move cursor one position to the right.
CTRL-K Clear the line.
CTRL-N Recall next historized command.
CTRL-P Recall previous historized command.
HOME Go to start of line.
END Go to end of line.
DEL Delete character under cursor.
BACKSPACE Delete character to left of cursor.
ARROW UP Recall previous historized command.
ARROW DOWN Recall next historized command.
ARROW RIGHT Move cursor one position to the right.
ARROW LEFT Move cursor one position to the left.
Command Action
!<number> Recall and execute given historised command identified by <number>.
hist[ory] List the history buffer.

Aplicaciones

Las aplicaciones actualmente proporcionadas por zOS se encuentran en una tarjeta SD y se resumen a continuacion. Para informacion mas detallada, consulte la seccion de aplicaciones (en la barra de navegacion izquierda).

Las tablas completas de comandos para IO de disco, buffer de disco, sistema de archivos, memoria, hardware, pruebas de rendimiento, ejecucion de programas, comandos diversos, aplicaciones y comandos tranZPUter son identicas a la version en ingles y se enumeran alli.

autoexec.bat

Como en MSDOS, si se crea un archivo llamado 'AUTOEXEC.BAT' en el directorio raiz (nivel superior) del sistema de archivos SD, su contenido sera ejecutado por zOS en el arranque/reset. Utilice este archivo para automatizar la configuracion y el inicio de su aplicacion prevista.

Detalles tecnicos

Esta seccion pretende proporcionar algunos de los detalles internos del sistema operativo.

Organizacion de la memoria

IOCP Memory Map
zOS se utiliza generalmente en su version autonoma, es decir, el sistema operativo arranca como firmware primario. Para compatibilidad con versiones anteriores o para soportar un desarrollo mas rapido de zOS en la ZPU, IOCP puede utilizarse como cargador de arranque para arrancar una imagen zOS desde la tarjeta SD.

IOCP Memory Map

zOS Memory Map
zOS en la ZPU tiene la disposicion de memoria como se muestra en el siguiente diagrama. zOS reside en la BRAM inferior como firmware de arranque con stack/heap en la parte superior de la BRAM utilizable (o RAM/SDRAM). Una aplicacion se carga en la direccion definida en el script de build.

zOS Memory Map for ZPU

El mapa de memoria para el procesador K64F es similar, pero la Flash RAM y la RAM estan definidas de forma fija y no son variables como en la ZPU.

zOS Memory Map for K64F


Interfaz de la aplicacion

Como la mayoria de los sistemas operativos, zOS proporciona una API que una aplicacion debidamente compilada puede utilizar para reducir su tamano y complejidad y reutilizar funciones dentro del sistema operativo como la conexion serial.

En lugar de disenar un conjunto de API personalizado, era mas sensato exponer los metodos dentro de zOS para uso de la aplicacion, por ejemplo printf. Una aplicacion que llama a printf para mostrar la salida en el terminal realmente llama a printf dentro de zOS. Esto se logra creando una tabla de saltos en un vector fijo dentro de zOS.

La tabla completa de vectores API (93 vectores incluyendo Character I/O, I/O formateado, operaciones de sistema de archivos, I/O de disco, gestion de memoria, operaciones de bus Z80 y mas) es identica a la version en ingles y se enumera completamente alli.

El prototipo de la plantilla de la aplicacion es:

 uint32_t app(uint32_t param1, uint32_t param2)
param1 y param2 pueden ser cualquier valor de 32 bits pasado en la llamada fileExec en zOS. En condiciones normales de operacion, zOS llama a una aplicacion con un solo parametro, param1, que es un puntero (char *) a los parametros de la linea de comandos.

El codigo de retorno de la aplicacion a zOS es un entero de 32 bits sin signo. 0 indica ejecucion exitosa, 0xFFFFFFFF indica un error.

Configuracion y compilacion automatizadas (recomendado)

La forma recomendada de compilar zOS es el script de configuracion automatizado para tu plataforma. Comprueba e instala los prerrequisitos, instala la cadena de herramientas ZPU, clona el repositorio (si no estas ya dentro de una copia de trabajo) y ofrece ejecutar la primera compilacion — con valores predeterminados sensatos que puedes aceptar pulsando Enter. Cada script es autonomo: copia unicamente el archivo correspondiente a tu plataforma y ejecutalo. Los pasos manuales mas abajo son para usuarios avanzados, recompilaciones parciales y CI.
La compilacion se controla mediante build.sh, que ensambla/compila IOCP, zOS y las apps para una CPU elegida en una sola pasada. Intervienen dos cadenas de herramientas y los scripts de configuracion proporcionan ambas:
Cadena de herramientas CPU objetivo Origen
ZPU zpu-elf-gcc 3.4.2 Small Medium Flex Evo EvoMin (ZPU) instalada en /opt/zpu (desde ZPU_TOOLCHAIN_URL)
ARM arm-none-eabi K64F (Kinetis / Teensy 3.5) incluida en el repositorio en tools/arm (sin instalacion)

Dado que ambas cadenas de herramientas son binarios Linux / cruzados, la compilacion se ejecuta de forma nativa en Linux, en Docker en macOS (imagen zos-build:latest) y mediante WSL1 en Windows:

Script Plataforma Notas
setup_zOS.sh Linux (nativo) / macOS (Docker) Instala las herramientas base de compilacion + la cadena de herramientas ZPU; en macOS compila dentro de la imagen Docker zos-build:latest.
setup_zOS_windows.cmd Windows 10 / 11 Lanzador de doble clic que invoca el script de PowerShell siguiente.
setup_zOS_windows_native.ps1 Windows 10 / 11 (WSL1) Configura WSL1 y ejecuta la configuracion de Linux dentro de ella.
setup_zOS_wsl1.sh dentro de WSL1 El paso de configuracion de Linux invocado automaticamente dentro de la distribucion WSL1.

Linux / macOS — setup_zOS.sh

chmod +x setup_zOS.sh
./setup_zOS.sh

Windows 10 / 11 — setup_zOS_windows_native.ps1 — haz doble clic en setup_zOS_windows.cmd, o desde un simbolo de PowerShell:

Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass
.\setup_zOS_windows_native.ps1

La configuracion clona ZOS_REPO_URL (por defecto https://git.eaw.app/eaw/zOS.git) en ~/zOS. Una vez finalizada, compila zOS con (build.sh selecciona automaticamente nativo / Docker / WSL1 segun el host):

./build.sh -C Evo  -O zos        # zOS for the Evo ZPU
./build.sh -C K64F -O zos        # zOS for the K64F (ARM Cortex-M4)
./build.sh -h                    # all options (-C CPU, -I IOCP, -O os, -o os ver, addresses, sizes ...)
Las salidas se generan en build/ y build/SD/ — la ROM de arranque (BOOT.ROM / BOOTTINY.ROM), el cargador de arranque IOCP_<func>_<addr>.bin y el .bin de zOS, ademas de los binarios de aplicacion bin/ listos para copiar a una tarjeta SD formateada en FAT.

Modificaciones utiles de variables de entorno:

Variable Proposito
ZOS_REPO_URL Repositorio a clonar (por defecto https://git.eaw.app/eaw/zOS.git).
ZOS_DIR Compilar dentro de una copia de trabajo existente en lugar de clonar.
ZPU_TOOLCHAIN_URL Ubicacion del tarball de la cadena de herramientas zpu-elf-gcc 3.4.2 instalada en /opt/zpu.
ZOS_BUILD_IMAGE Imagen Docker usada para la compilacion en macOS (por defecto zos-build:latest).
ZOS_ASSUME_YES=1 Acepta todos los prompts de forma no interactiva (instalaciones desatendidas / CI).
Si prefieres compilar a mano o estas creando una tuberia de CI, la compilacion manual — las rutas, la lista de herramientas, el arbol de compilacion y la matriz completa de flags de build.sh — esta documentada en la seccion Build del software inmediatamente debajo.


Build del software

Esta seccion muestra como construir un kernel zOS basico. El punto de partida para el build de zOS es el script ‘build.sh’, que contiene toda la logica necesaria.

Rutas

La tabla completa de rutas, la lista de herramientas y la documentacion del arbol de build son identicas a la version en ingles y se describen en detalle alli.

Herramientas

Todo el desarrollo se realizo en Linux, en particular Debian/Ubuntu. Ademas de la cadena de build estandar de Linux, se necesita el siguiente software:

  • ZPU GCC ToolChain - La cadena de herramientas GCC para el desarrollo en la ZPU. Instalar en /opt o un directorio comun similar.
  • Arduino - El entorno de desarrollo Arduino, no realmente necesario excepto cuando se anaden funciones a la version K64F de zOS.
  • Teensyduino - Las extensiones Arduino para Teensy3 para trabajar con la placa Teensy3.5.

La estructura completa del arbol de build, los parametros de build.sh y los ejemplos se encuentran en la version en ingles.