Portando Linux a la Game Boy Advance en pdf
Transcription
Portando Linux a la Game Boy Advance en pdf
Portando Linux a la Game Boy Advance Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA • Procesador: ARM7TDMI 32bit CPU Modes: ARM(32bit), THUMB(16 bit) Data Formats: 8bit Byte, 16bit - Halfword, 32bit – Word • 37 Registros CPU • 31 generales y 6 de estado R13 (SP) Puntero de la pila R14 (LR) Dirección anterior a la llamada a la subrutina R15 (PC) Dirección a ejecutar • La BIOS ROM • Secuencia de introducción. Logo Nintendo y Gameboy • Funciones SWI: Operaciones matemáticas, descompresión… son las System Call (*) de otros sistemas. Los parámetros (Ent/Sal) son los registros R0,R1,R2,R3 • Arranque múltiple: permite arrancar la GBA desde otros computadores o consolas sin introducir un cartucho. Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA • Interrupciones • GBA: Dispositivo -> -> BUS de Direcciones, Datos y Control (E/S, IRQ) -> Micro (para, guarda, identifica) -> Dirección en la BIOS -> Programa ejecutándose • Se accede a ellas a través de registros I/O • La dirección de los puertos I/O en GBA es 04000000h • Registros LCD (000h) • Registros Sonido (060h) • DMA Transfer Channels (0B0h) • Registros Timer (100h) • Comunicación en serie (120h) • Teclado (130h) • Flags: IME(Act/Des Todas) – IE (Act/Des Indiv.)– IF (pendientes) Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA • Mapa de memoria: • Memoria interna general • • • • • • • • 0000:0000-0000:3FFF 0000:4000-01FF:FFFF 0200:0000-0203:FFFF 0204:0000-02FF:FFFF 0300:0000-0300:7FFF 0300:8000-03FF:FFFF 0400:0000-0400:03FE 0400:0400-04FF:FFFF BIOS - System ROM (16 KBytes) No se usa WRAM – en placaWork RAM (256 KBytes) 2 Wait No se usa WRAM – En chip Work RAM (32 KBytes) No se usa Registros I/O No se usa • Memoria Interna del Display • • • • • • 0500:0000-0500:03FF 0500:0400-05FF:FFFF 0600:0000-0617:FFFF 0618:0000-06FF:FFFF 0700:0000-0700:03FF 0700:0400-07FF:FFFF BG/OBJ Palette RAM (1 Kbyte) No se usa VRAM - Video RAM (96 KBytes) No se usa OAM - OBJ Attributes (1 Kbyte) No se usa • Memoria Externa (Game Pak) • 0800:0000-0FFF:FFFF Game Pak ROM/FlashROM Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Descripción técnica de la GBA • Teclado (Key pad) con 6 botones • XIP ("eXecute In-Place") • No hay duplicación del segmento de código en la RAM • No MMU (Memory Management Unit) • Convertir las direcciones lógicas emitidas por los procesos en direcciones físicas • No fork() copia todo el espacio de direcciones del proceso -> vfork () de BSD los dos procesos se refieren al mismo espacio • No se puede usar las librerías de Linux • glibc librería de propósito general se prioriza la velocidad de ejecución • uClibc librería que prioriza el tamaño • No hay protección de la Memoria Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Arranque y particularidades de GBA • Reset, Logo (GBA BIOS), ROM Cartucho • Cabecera de la ROM - Cartucho • • • • • • • • • • • • • • • • • 000h 4 Punto de entrada de la ROM (32bit ARM branch opcode, eg. "B rom_start") 004h 156 Logo de Nintendo (bitmap requirido!) 0A0h 12 Titulo del Juego (uppercase ascii ) 0ACh 4 Codigo del juego (uppercase ascii, 4 characters) 0B0h 2 Maker Code (uppercase ascii, 2 characters) 0B2h 1 96h (must be 96h, required!) 0B3h 1 00h (00h for current GBA models) 0B4h 1 Tipo de dispositivo 0B5h 7 Area reservada rellena con 00(should be zero filled) 0BCh 1 Versión del software (normalamente 00h) 0BDh 1 Complement check (header checksum, required!) 0BEh 2 Area reservada (should be zero filled) --- Additional Multiboot Header Entries --0C0h 4 Punto de entrada de la RAM (32bit ARM branch opcode, eg. "B ram_start") 0C4h 1 modo de arranque (init as 00h - BIOS overwrites this value!) 0C5h 1 Slace ID Number (init as 00h - BIOS overwrites this value!) 0C6h 26 No se usa (seems to be unused) • Copia el kernel en la RAM y lo ejecuta Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Arranque en Linux • RESET • Registros a valores predefinidos • Se ejecuta el EIP: 0xFFFFFFF0 • BIOS (ROM) • Chequeo del Hardware • Carga el sector de arranque del dispositivo seleccionado • LILO • Carga el arch/i386/boot/setup.S con la cabecera head.S • Carga el kernel en memoria • Y ejecuta la primer instrucción de setup.S Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Arranque en Linux • Núcleo del sistema operativo • setup.S (sigue en modo real) • Configura teclado • Inicializa tarjeta de video • Comprueba si existe el ratón • Establece las tablas GDT y IDT • Mueve el kernel para recuperar el espacio del lilo • head.S (arch/i386/kernel/head.S) • Activa la paginación • Determina el tipo de procesador • Carga IDT y GDT (Tabla Descriptores Global de Segmentos) • Y pasa el control al start_kernel() Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Arranque en Linux • start_kernel() • inicializa parte de hardware // setup_arch() • instala los vectores de interrupción // trap_init() • inicializa IRQ // init_IRQ() • inicializa el planificador //sched_init() • Instala el manejador de las interrupcione de reloj // time_init() • Prepara e inicializa la memoria y los buffers • chequeo de fallos • lanza el primer hilo del kernel // kernel_thread(init, NULL, 0) • y este a su vez llama al primer programa de usuario init • Se ejecuta el hilo cpu_idle() • init (/init/main.c) • Montamos el filesystem • Se prepara la consola Por Sim0n (simon@losInvisibles.net) • ejecuta el primer proceso de usuario init Portando Linux a la Game Boy Advance Integrando Linux y GBA • Fichero arm/armnommu/kernel/head-arm-gba.S es el punto de entrada se añade la cabecera exigida • Copia el núcleo en la RAM y lo ejecuta • Interrupciones • GBA: Dispositivo -> BUS (E/S, IRQ)-> Micro (para, guarda, identifica) ->Dirección en la BIOS -> Programa ejecutándose • En linux: Dispositivo -> BUS (E/S, IRQ)-> PIC -> Micro (para, guarda, identifica) -> Tabla Vectores Interrupción (IDT)) -> función que maneja la interrupción) • En el paso del control al programa de usuario linux recoge el control e introduce su IDT mediante una capa intermedia • GBA llama a un vector de interrupciones propio no configurable de direcciones físicas en la BIOS ROM • El procesador guarda los registros R0-R3, R12 y R14 y para recuperar posteriormente la ejecución Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Integrando Linux y GBA • SWI (Interrupciones por Software) • ARM tiene sus propias interrupciones por software operaciones aritméticas y otras funciones no nos interesan No provee forma de manejar otras interrupciones por software • Linux usa una dirección de la SWI que no se utiliza y a partir de ella y del argumento que se le pasa implementa sus syscalls Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Diferencias de código con Linux-ARM • entry-armv.S: Este fichero contiene las syscalls y el manejo de las rutinas de bajo nivel en el kernel de linux • Funciones que se llaman desde el main.c • setup_arch() Realiza la contabilización de la memoria RAM disponible, mapea toda la memoria física a al espacio de direcciones lógicas del núcleo GBA Linux: se inicializa la consola no tiene memoria virtual • trap_init() Inicializa la IDT, instalando los vectores de interrupción de las excepciones producidas por el procesador GBA Linux: implementa su propia rutina de trabajo con las IDT • init_irq() Se inicializan las interrupciones GBA Linux: Simplemente da valores al los flags IE 0 y IME 0x0001 • time_init() Lee la hora y instala el manejador de interrupciones de la interrupción de reloj • GBA Linux: No hay hora. Las GBA Timers no son programables Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Necesidades • • • • • • Game Boy Advance ROM virgen y escribible Cross-compiler (arm-elf-tools) Emulador de Game Boy Advance (VisualBoy Advance) Librerías de linux para microcontroladores (uClinux) Parches • multiline_strings.patch • uclgba_final_2004-06-16.patch Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Compilando el Kernel • make menuconfig && make dep && make • • • • • • • • • config.in .config archivos fuente son compilados Luego se enlazan (arm-elf-ld) Se crea el System.map (arm-elf-nm linux > System.map) genromfs –f romfs.img -d ./romfs arm-elf-objcopy -O binary -j .text ./linux ./linux.text arm-elf-objcopy -O binary -j .data ./linux ./linux.data cat linux.text linux.data romfs.img > image.bin • ln -s image/romfs.img boot.rom • VisualBoyAdvance image.bin • -d (n 246339, n 446649) Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Syscalls Read() User Process User Mode System Calls Interface Kernel Mode File System I/O Hardware Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Linux en la Game Boy Advance Por Sim0n (simon@losInvisibles.net) Portando Linux a la Game Boy Advance Bibliografía • • • • • • • Linux Port to the Game Boy Advance http://wwwhsse.fh-hagenberg.at/Studierende/hse02006/uclgba/ Gameboy Advance Technical Info http://www.work.de/nocash/gbatek.htm uClinux port to the GBA HOWTO http://wwwhsse.fh-hagenberg.at/Studierende/hse02006/uclgba/gba-howto/ index.html Embedded Linux/Microcontroller Project http://www.uclinux.org/ VisualBoy Advance http://vba.ngemu.com/downloads.shtml Understanding the Linux Kernelt http://www.oreilly.com/catalog/linuxkernel2/ Flash2Advance USB/Parport for Linux http://www.emulinks.de/f2a/ Por Sim0n (simon@losInvisibles.net)