portando linux a la gameboy advance de nintendo

19
Portando Linux a la Game Boy Advance Por Sim0n ([email protected] t)

Upload: sim0nkxk

Post on 12-Apr-2017

4.915 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Portando Linux a la GameBoy Advance de Nintendo

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 2: Portando Linux a la GameBoy Advance de Nintendo

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 pilaR14 (LR) Dirección anterior a la llamada a la subrutinaR15 (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 ([email protected])

Portando Linux a la Game Boy Advance

Page 3: Portando Linux a la GameBoy Advance de Nintendo

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 ([email protected])

Portando Linux a la Game Boy Advance

Page 4: Portando Linux a la GameBoy Advance de Nintendo

Descripción técnica de la GBA• Mapa de memoria:

• Memoria interna general• 0000:0000-0000:3FFF BIOS - System ROM (16 KBytes) • 0000:4000-01FF:FFFF No se usa • 0200:0000-0203:FFFF WRAM – en placaWork RAM (256 KBytes) 2 Wait • 0204:0000-02FF:FFFF No se usa • 0300:0000-0300:7FFF WRAM – En chip Work RAM (32 KBytes) • 0300:8000-03FF:FFFF No se usa • 0400:0000-0400:03FE Registros I/O • 0400:0400-04FF:FFFF No se usa

• Memoria Interna del Display• 0500:0000-0500:03FF BG/OBJ Palette RAM (1 Kbyte) • 0500:0400-05FF:FFFF No se usa • 0600:0000-0617:FFFF VRAM - Video RAM (96 KBytes) • 0618:0000-06FF:FFFF No se usa • 0700:0000-0700:03FF OAM - OBJ Attributes (1 Kbyte) • 0700:0400-07FF:FFFF No se usa

• Memoria Externa (Game Pak)• 0800:0000-0FFF:FFFF Game Pak ROM/FlashROM Por Sim0n

([email protected])

Portando Linux a la Game Boy Advance

Page 5: Portando Linux a la GameBoy Advance de Nintendo

Descripción técnica de la GBA

Por Sim0n ([email protected])

Portando Linux a la Game Boy Advance

Page 6: Portando Linux a la GameBoy Advance de Nintendo

Descripción técnica de la GBA

Por Sim0n ([email protected])

Portando Linux a la Game Boy Advance

Page 7: Portando Linux a la GameBoy Advance de Nintendo

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 ([email protected])

Portando Linux a la Game Boy Advance

Page 8: Portando Linux a la GameBoy Advance de Nintendo

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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 9: Portando Linux a la GameBoy Advance de Nintendo

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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 10: Portando Linux a la GameBoy Advance de Nintendo

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()

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 11: Portando Linux a la GameBoy Advance de Nintendo

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• ejecuta el primer proceso de usuario init

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 12: Portando Linux a la GameBoy Advance de Nintendo

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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 13: Portando Linux a la GameBoy Advance de Nintendo

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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 14: Portando Linux a la GameBoy Advance de Nintendo

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 interrupcionesGBA 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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 15: Portando Linux a la GameBoy Advance de Nintendo

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

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 16: Portando Linux a la GameBoy Advance de Nintendo

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)

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 17: Portando Linux a la GameBoy Advance de Nintendo

Syscalls

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

User Process

System Calls InterfaceUser Mode

Kernel ModeFile System

Hardware

Read()

I/O

Page 18: Portando Linux a la GameBoy Advance de Nintendo

Linux en la Game Boy Advance

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])

Page 19: Portando Linux a la GameBoy Advance de Nintendo

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/

Portando Linux a la Game Boy Advance

Por Sim0n ([email protected])