I have a feeling the questions are more basic things such as how does a hypervisor for a system without a MMU work in the first place?
That is simple we only emulate parts of the memory range
This is the
GBA Memory Map
General Internal Memory
00000000-00003FFF BIOS - System ROM (16 KBytes)
00004000-01FFFFFF Not used
02000000-0203FFFF WRAM - On-board Work RAM (256 KBytes) 2 Wait
02040000-02FFFFFF Not used
03000000-03007FFF WRAM - On-chip Work RAM (32 KBytes)
03008000-03FFFFFF Not used
04000000-040003FE I/O Registers
04000400-04FFFFFF Not used
Internal Display Memory
05000000-050003FF BG/OBJ Palette RAM (1 Kbyte)
05000400-05FFFFFF Not used
06000000-06017FFF VRAM - Video RAM (96 KBytes)
06018000-06FFFFFF Not used
07000000-070003FF OAM - OBJ Attributes (1 Kbyte)
07000400-07FFFFFF Not used
External Memory (Game Pak)
08000000-09FFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 0
0A000000-0BFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 1
0C000000-0DFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 2
0E000000-0E00FFFF Game Pak SRAM (max 64 KBytes) - 8bit Bus width
0E010000-0FFFFFFF Not used
Unused Memory Area
10000000-FFFFFFFF Not used (upper 4bits of address bus unused)
and the DS arm9 (this is where the emulator runs)
NDS9 Memory Map
00000000h Instruction TCM (32KB) (not moveable) (mirror-able to 1000000h)
0xxxx000h Data TCM (16KB) (moveable)
02000000h Main Memory (4MB)
03000000h Shared WRAM (0KB, 16KB, or 32KB can be allocated to ARM9)
04000000h ARM9-I/O Ports
05000000h Standard Palettes (2KB) (Engine A BG/OBJ, Engine B BG/OBJ)
06000000h VRAM - Engine A, BG VRAM (max 512KB)
06200000h VRAM - Engine B, BG VRAM (max 128KB)
06400000h VRAM - Engine A, OBJ VRAM (max 256KB)
06600000h VRAM - Engine B, OBJ VRAM (max 128KB)
06800000h VRAM - "LCDC"-allocated (max 656KB)
07000000h OAM (2KB) (Engine A, Engine B)
08000000h GBA Slot ROM (max. 32MB)
0A000000h GBA Slot RAM (max. 64KB)
FFFF0000h ARM9-BIOS (32KB) (only 3K used)
nds 00000000h Instruction TCM (32KB)
gba 00000000-00003FFF BIOS - System ROM (16 KBytes)
emu code to manage the interrupts for the hypervisor and fast code, parts do the same thing as the gba BIOS
pu settings read only
nds 0xxxx000h Data TCM (16KB) (moveable)
gba not existing
emu hypervisor stack and fast access data
nds 02000000h Main Memory (4MB)
gba 02000000-0203FFFF WRAM - On-board Work RAM (256 KBytes)
emu hypervisor code and data
gba 08000000h GBA Slot ROM (max. 32MB) parts of gba code to execute is mapped here with various tricks
nds 03000000h Shared WRAM 32KB allocated to ARM9
gba 03000000-03007FFF WRAM - On-chip Work RAM (32 KBytes)
nds 04000000h ARM9-I/O Ports
gba 04000000-040003FE I/O
emu full emulated
08000000-09FFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 0
0A000000-0BFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 1
0C000000-0DFFFFFF Game Pak ROM/FlashROM (max 32MB) - Wait State 2
reads with full address are emulated manually executings are remapped to a big buffer with the first 3MB of the rom. executes above this address causes random behaver
rest is the same