No edit summary |
|||
Line 23: | Line 23: | ||
! Offset !! Taille !! Description | ! Offset !! Taille !! Description | ||
|- | |- | ||
| 0x000 || 4 × 18 || Offsets des sections - indique où commence la section par rapport au début du dol. 0 pour une section non utilisée. | | 0x000 || style="width:10%;" | 4 × 18 || Offsets des sections - indique où commence la section par rapport au début du dol. 0 pour une section non utilisée. | ||
|- | |- | ||
| 0x048 || 4 × 18 || Adresses virtuelles des sections - indique où chaque section doit être copiée par le loader en adressage virtuel. 0 pour une section non utilisée. | | 0x048 || 4 × 18 || Adresses virtuelles des sections - indique où chaque section doit être copiée par le loader en adressage virtuel. 0 pour une section non utilisée. |
Revision as of 06:36, 22 April 2022
Cet article est pour le format de fichier DOL. Voir DOL (Gotcha Force) pour les recherches en cours sur les dol Gotcha Force.
Les fichiers DOL (pour le nom de code de la gamecube dolphin) sont des des fichiers que l'on retrouve dans les iso/GCM GameCube ou Wii. Les observations se concentrent ici sur les dol GameCube.
Format
Le fichier dol est un fichier système de la GameCube et il se place directement dans l'iso/GCM indépendamment du système de fichiers (FST). Son offset dans l'iso est stocké à l'offset 0x420 de l'iso.
Header
Le header fait 0x100 octets. Il décrit comment le fichier doit être chargé en mémoire et où aller quand on l'exécute.
Header du fichier | ||
---|---|---|
Offset | Taille | Description |
0x000 | 4 × 18 | Offsets des sections - indique où commence la section par rapport au début du dol. 0 pour une section non utilisée. |
0x048 | 4 × 18 | Adresses virtuelles des sections - indique où chaque section doit être copiée par le loader en adressage virtuel. 0 pour une section non utilisée. |
0x090 | 4 × 18 | Taille des sections en octets. 0 pour une section non utilisée. |
0x0d8 | 4 | Adresse virtuelle du bss - le début de la zone des variables non initialisées (.bss), initialisé à 0. |
0x0dc | 4 | Taille du bss en octets. |
0x0e0 | 4 | Entry point - indique l'adresse virtuelle de la fonction principale à exécuter après avoir chargé le dol en mémoire. Cette fonction ne doit pas se terminer. |
0x0e4 | 0x1c | Padding. |
0x100 | Fin du header. Début des données des sections. |
Les 7 première sections sont des sections .text qui contiennent du bytecode exécutable. On peut y retrouver des routines capturant des interruptions ainsi que du padding.
Les 11 sections suivantes sont des sections .data qui contiennent des données initialisées.
L’intervalle du .bss peut contenir des intervalles .text ou .data. Le .bss est alors automatiquement splitté lors de sa création pour ne pas écraser les sections déjà existantes.
Les sections doivent être alignée sur 32 octets. L'apploader aligne la taille sur les 32 octets supérieurs.
Organisation de la mémoire
Yet Another GameCube Documentation / YAGCD propose une très bonne documentation sur le fonctionnement matériel de la GameCube.
Organisation globale de la mémoire
L'organisation globale de la mémoire décrit comment l'adressage utilisé dans le dol permet d'accéder aux différents composants matériels de la GameCube. Ceci est très intéressant notamment pour les accès aux différents bus / interfaces.
Mapping mémoire | |||
---|---|---|---|
Début | Fin | Taille | Description |
0x00000000 | 0x017fffff | 24MB | Adresses physique de la RAM |
0x80000000 | 0x817fffff | 24MB | Adresses logiques (Virtuelles) de la RAM, mises en cache |
0xC0000000 | 0xC17fffff | 24MB | Adresses logiques (Virtuelles) de la RAM, sans cache |
0xc8000000 | 2MB | Embedded Framebuffer (EFB) | |
0xCC000000 | Hardware registers | ||
0xCC000000 | CP - Command Processor | ||
0xCC001000 | PE - Pixel Engine | ||
0xCC002000 | VI - Video Interface | ||
0xCC003000 | PI - Processor Interface (Interrupt Interface) | ||
0xCC004000 | MI - Memory Interface | ||
0xCC005000 | AI - Audio Interface | ||
0xCC006000 | DI - DVD Interface | ||
0xCC006400 | SI - Serial Interface | ||
0xCC006800 | EXI - External Interface | ||
0xCC006C00 | Streaming Interface | ||
0xCC008000 | GX FIFO (Graphic display lists) | ||
0xe0000000 | 0xe0003fff | 16k | L2 Cache |
0xfff00000 | 1MB | IPL (mappé ici lors du boot) |
La taille des registres matériels semble être renseignée dans un module Ghidra permettant de loader les fichiers dol.
Mémoire du programme (dol)
L'espace utilisateur se situe dans les 24MB de la RAM en adressage virtuel mis en cache, des adresses 0x80003100 à 0x817fffff.
Les 0x3100 premiers octets contiennent des informations système ("Dolphin OS Globals") notamment les routines appelées lors des interruptions spécifique à powerpc. On y retrouvera aussi tout un tas d'information sur l'iso ou encore l'offset de la FST etc.
Mapping mémoire | |||
---|---|---|---|
Adresse | Description | ||
0x80003100 | Début du mapping des sections .text (généralement) | ||
0x80003140 | Entry point (early SDK v1.0 applications) | ||
0x81200000 | Adresse de chargement de l'Apploader | ||
0x81300000 | Adresse de chargement du Bootrom/IPL | ||
? | Stack - pile du programme | ||
? | Heap - mémoire tas - ArenaLo décrit le bas et ArenaHigh le haut collé à la FST | ||
? | FST - Taille variable | ||
0x817fffff | Fin de l'adressage virtuel |
Il est tout d'abord intéressant de noter que la mémoire tas et la pile sont dans l'intervalle 0x80120000 - 0x817fffff. Leur taille varie. La pile est gérée par le registre r1 et augmente dans les adresses positives. La mémoire tas quand à elle est allouée via l'api du SDK.
Le dol peut être mappé de 0x80003100 à 0x81200000 ce qui laisse 18 Mo pour le programme. Il est alors à préciser que le mapping des sections du dol initial en mémoire délimite une partie de ce que le programme utilise. En effet, les adresses qui n'appartiennent pas aux sections sont utilisées dans le programme.
La FST est chargée en fonction de son positionnement par rapport au dol dans l'iso/GCM:
- dol_offset_FST < dol_offset_iso -> virtual_address_FST > dol_address_FST
- dol_offset_FST > dol_offset_iso -> virtual_address_FST < dol_address_FST
SI - Serial Interface
Les sources de Dolphin Emulator donnent des indices sur l'usage du registre hardaware SI. On y retrouve la connexion des périphériques GBA (Game Boy Advance), CONTROLLER, KEYBOARD, STEERING, TARUKONGA. L'interface SI utilise le protocole Joybus.
EXI
Les sources de Dolphin Emulator montrent l'usage de EXI. On y retrouve MemoryCard, MaskROM, AD16, Microphone, Ethernet, AGP, EthernetXLink, EthernetTapServer.
Logiciels
Ces logiciels ci-dessous permettent de manipuler les fichiers dol :
- doltool.py, proposé par Virtual World RE.
- GeckoLoader, proposé par JoshuaMKW, sup32.