Compilador C GNU(gcc): compilador C usado para generar código objeto. Librería C GNU: esta librería implementa las llamadas al sistema, API,
como open, read. Pueden ser, glibc, uClib, u otras.
Binutils (binary utilities): conjunto de programas necesarios para compilar/enlazar/ensamblar y realizar otras tareas de debugging. Los binarios principales son: ld (GNU linker), as (GNU assembler). Otros son:
addr2line - Converts addresses into filenames and line numbers. ar - A utility for creating, modifying and extracting from archives. c++filt - Filter to demangle encoded C++ symbols.
gprof - Displays profiling information.
nlmconv - Converts object code into an NLM. nm - Lists symbols from object files.
objcopy - Copys and translates object files. objdump - Displays information from object files.
ranlib - Generates an index to the contents of an archive. readelf - Displays information from any ELF format object file. size - Lists the section sizes of an object or archive file. strings - Lists printable strings from files.
strip - Discards symbols.
windres - A compiler for Windows resource files. 2. Librerías C
Dadas las limitaciones de recursos de los sistemas embebidos, el tamaño de la librería C y su funcionalidad es un punto clave a tener en cuenta para la selección de la misma. Su tamaño y funcionalidad son variables directamente proporcionales, por esto, debemos utilizar una librería cuya relación tamaño- funcionalidad sea aceptable.
Existen varias opciones de librerías C para el dispositivo objetivo:
glibc (GNU C library): buena performance, acorde a estándares y buena portabilidad, demasiado grande para sistemas embebidos.
uClibc: librería muy liviana, diseñada para pequeños sistemas embebidos. De 2 a 4 veces mas liviana que glibc. Su origen proviene del proyecto uClinux, desarrollado para microprocesadores que no poséen MMU (memory managment unit). La librería, sin embargo, se ha convertido en un proyecto independiente y da soporte a procesadores con o sin MMU o FPU (float point unit). uClib provee la mayoría de las funcionalidades de glibc.
Newlib
klibc (kernel C library): diseñada para usar en initramfs, no es lo suficientemente elaborada para soportar aplicaciones de BusyBox.
Aquí se describen brevemente definiciones de términos generalmente utilizados en textos sobre sistemas GNU/Linux embebidos
Cross-compilation: la compilación cruzada es el proceso mediante el cual se realiza la compilación en una PC, denominada host (huesped), para ser ejecutado sobre otra arquitectura de hardware, denominado target (objetivo). Se realiza una compilación cruzada sobre un sistema, cuando este produce ejecutables para otro sistema. Esto sucede cuando el sistema target no posee el conjunto de herramientas de compilación nativas o cuando el sistema host es más rápido o posee mejores recursos (cpu, memoria, etc).
Toolchain: conjunto de herramientas, binarios y librerías necesarias para realizar la compilación cruzada (binutils, gcc, glibc).
Virtual file system(VFS): En Linux existen varios sistemas de archivos, estos son administrados por una capa denominada VFS. El VFS provee una vista consistente de los datos almacenados sobre varios dispositivos del sistema. Esto lo hace separando la vista del usuario del FS utilizando llamadas de sistema standard, permitiendo implementar sistemas de archivos lógicos sobre dispositivos físicos.
ELF:Executable Linkage Format, es un tipo de formato ejecutable dentro de los formatos binarios, otros son COFF, flat format (usados en sistemas MMU-less).
Board Support Package o Hardware Abstraction Layer (BSP o HAL): conjunto de programas usados para inicializar los dispositivos de hard sobre la placa e implementar rutinas específicas de la placa que puedan ser usada por el kernel y los drivers. Es en realidad una capa de abstracción del hardware denominada también HAL (hardware abstraction layer). Esta capa oculta los detalles específicos del procesador y del hardware de la placa al resto del SO, por lo tanto la portabilidad de drivers sobre múltiples placas y cpu's es extremadamente simple.
BusyBox: es un conjunto de comandos, los más comunes, que serán almacenados en el RFS del sistema embebido, se lo denomina como "la navaja suiza de los sistemas embebidos".
Buildroot: herramienta que se utiliza para crear el entorno de compilación cruzada (cross-compilation environment) y el sistema de archivos raíz.
Endian: es una descripción de diferentes sistemas, hace referencia al orden en que se almacenan físicamente los bytes (2 bytes), si el byte más significativo (MSB) se almacena después o antes que el byte menos significativo (LSB).
Big endian: se almacena de la forma en que se lo leería, es decir, primero MSB y luego LSB.
Little endian: se almacena de manera inversa, es decir, primero LSB y luego el MSB.
Middle endian: sistemas en los que se utiliza ambos modos (bigendian y littleendian).
initramfs(init ram filesystem): es un nuevo concepto que reemplaza a initrd, initramsf es usado a partir del kernel 2.6
MIPS is one of the first RISC CPU architectures invented around 1985. It was a radical design which removed many features deemed unnecessary, since the goal was to get the best possible performance from a limited transistor count. Back then, MIPS were powerful general purpose CPUs, and very successful in that role, until they lost ground to systems based on cheap mass-produced Intel-compatible CPUs. Later on, the simple and elegant design allowed to create a wide range of low power CPUs targeted for embedded applications. Today, MIPS is a popular architecture for embedded systems, with a strong presence in various networked devices, and spanning a range from 32-bit at 100 MHz to 64-bit at 1.2 Ghz. The current top-end is arguably the SC5832 made by SiCortex, a compact supercomputer with 5832 CPU cores dissipating 600 mW each.
MTD: Las MTD (Memory Technology Devices) son memorias flash, RAM y chips similares, utilizados para almacenar sistemas de archivos en dispositivos embebidos. En la configuración del kernel, es una opción que provee soporte genérico para drivers MTD.
3. Tipos de Kernel
Realtime (RTOS): El espacio de direcciones es plano o lineal, no posee protección de memoria entre las aplicaciones y el Kernel, es decir, el núcleo del Kernel, el subsistema del Kernel y las aplicaciones comparten el mismo espacio de memoria. Se denominan Realtime debido a que no hay sobrecarga por llamadas al sistema, pasaje de mensajes o copia de datos. (Sin protección de memoria).
Monolítico: está diferenciado el espacio de memoria de usuario y Kernel. Las aplicaciones que operan en el espacio de usuario lo hacen sobre direcciones de memoria virtuales por lo tanto no pueden corromper la memoria de otras aplicaciones o del Kernel. Sin embargo, los componentes del Kernel comparten el mismo espacio de direcciones y por ende, un driver o módulo mal programado puede causar la inestabilidad del sistema. La mayoría de los SO Unix son de este tipo.
Microkernel: hace uso de un pequeño SO que provee los servicios básicos y el resto del kernel se ejecuta como aplicaciones. La clave del microkernel surge a partir de un esquema robusto de pasaje de mensajes. (Protección de memoria)
Módulos: Los módulos del Kernel que se cargan dinámicamente son fragmentos de código del Kernel que no fueron incluidos (enlazados-linked)
directamente en el Kernel. Se compilan separadamente, pueden ser cargados o removidos del Kernel que se está ejecutando.