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)