DSLinux
# DSLinux

DSLinux es una adaptación del sistema operativo Linux para la Nintendo DS.

## Software

Ejecuta un versión modificada del núcleo μCLinux y está basado en uCLinux 2.6.14 (Linux-2.6.14-hsc0). Solo se ejecuta en modo texto y Nano-X, el cual es mostrado mediante el Controlador de dispositivo de framebuffer personalizado para la consola. Se interactúa mediante un teclado virtual mostrado en la pantalla táctil de la Nintendo DS. Está compilado usando GCC.

Se han portado las bibliotecas ncurses, libpcap y SDL, junto con otras, así DSLinux es en teoría capaz de ejecutar casi cualquier aplicación cuya interfaz de usuario se base en ncurses o framebuffer. Es capaz de ejecutar aplicaciones shell básicas proporcionadas por Busybox y GNU Coreutils, tales como los editores de texto vi y nano, navegadores web como Links, y reproductores como madplay. La biblioteca estándar de C es uClibc.

## Hardware soportado

A excepción del micrófono, todo el hardware interno de la Nintendo DS, incluyendo la red inalámbrica está soportada por DSLinux. El firmware de Nintendo DS se puede leer desde /dev/firmware, pero el soporte de escritura no se ha incluido por medidas de seguridad. No está soportado por la familia Nintendo DSi.

Soporta almacenamiento de ficheros en ciertos dispositivos de hardware externos. Puede almacenar ficheros en la memoria SRAM en las tarjetas GBA Flash, CompactFlash y SD, a través de los siguientes adaptadores:

* GBAMP
* Tarjetas M3
* SuperCard

Versiones más recientes han incluido soporte para DLDI, permitiendo un más amplio rango de compatibilidad.

También es soportado por emuladores como DeSmuMe, el cual se puede ejecutar usando las imágenes de ROM disponibles.

## Limitaciones de Memoria

La Nintendo DS no tiene Unidad de manejo de memoria (MMU), y consta tan sólo de 4 MB de RAM. Tanto la ejecución espacio de núcleo, como en espacio de usuario "execute in place" XIP, como la reserva de memoria de SLOB fueron las primeras técnicas usadas para incrementar un poco la cantidad disponible de RAM. Posteriormente, el soporte para la RAM interna presente en ciertos dispositivos adicionales, tales como la SuperCard o M3, ha sido añadido, ofreciendo una memoria extra de 32MB.

Esto último no fue trivial, pues las ranuras del bus GBA únicamente soportan escrituras de 16-bits. Si se envía sólo 8 bits por el bus, el resultado que queda en memoria es basura. Un desarrollador, llamado Amadeus, encontró una solución para ello, que requiere del reemplazo de la instrucción de ensamblador ARM "strb" por "swpb" (swap byte). Dicha instrucción primero lee de la dirección de memoria requerida, poblando la caché de datos, entonces una escritura de 8-bit es realizada en la caché. A continuación, cuando la info de la caché es leída, se usan lecturas de 16-bit, eliminando todas las escrituras de 8-bit en el bus. Amadeus modificó la generación de código de GCC para ARM, tal que todo lo compilado para DSLinux usa ahora instrucciones swpb en vez de strb. El código Ensamblador en el núcleo Linux ha tenido que ser adaptado manualmente.

