2009-12-02 50 views
5

Secondo Wikipedia, l'N64 ha solo 4 MB di RDRAM (8 MB con l'Expansion Pack) e le altre quantità sono simili (4 KB circa di cache L1). Tuttavia, i documenti tecnici che ho trovato su Google affermano che i suoi indirizzi di memoria vanno da $ 0000: 0000 a $ FFFF: FFFF - questo è 4 GB! Poiché gli emulatori N64 esistenti come Project64 non utilizzano 4 GB di RAM, come funziona la mappa della memoria? Ho provato a guardare attraverso vari documenti e simili, e tutti sembrano differire almeno leggermente. Qualcuno ha qualche consiglio su questo problema?Come si struttura la mappa di memoria in un emulatore N64?

In particolare, ecco la mappa di memoria che ho trovato:

0x0000 0000 to 0x03EF FFFF RDRAM Memory 
0x03F0 0000 to 0x03FF FFFF RDRAM Registers 
0x0400 0000 to 0x040F FFFF SP Registers 
0x0410 0000 to 0x041F FFFF DP Command Registers 
0x0420 0000 to 0x042F FFFF DP Span Registers 
0x0430 0000 to 0x043F FFFF MIPS Interface (MI) Registers 
0x0440 0000 to 0x044F FFFF Video Interface (VI) Registers 
0x0450 0000 to 0x045F FFFF Audio Interface (AI) Registers 
0x0460 0000 to 0x046F FFFF Peripheral Interface (PI) Registers 
0x0470 0000 to 0x047F FFFF RDRAM Interface (RI) Registers 
0x0480 0000 to 0x048F FFFF Serial Interface (SI) Registers 
0x0490 0000 to 0x04FF FFFF Unused 
0x0500 0000 to 0x05FF FFFF Cartridge Domain 2 Address 1 
0x0600 0000 to 0x07FF FFFF Cartridge Domain 1 Address 1 
0x0800 0000 to 0x0FFF FFFF Cartridge Domain 2 Address 2 
0x1000 0000 to 0x1FBF FFFF Cartridge Domain 1 Address 2 
0x1FC0 0000 to 0x1FC0 07BF PIF Boot ROM 
0x1FC0 07C0 to 0x1FC0 07FF PIF RAM 
0x1FC0 0800 to 0x1FCF FFFF Reserved 
0x1FD0 0000 to 0x7FFF FFFF Cartridge Domain 1 Address 3 
0x8000 0000 to 0xFFFF FFFF External SysAD Device 
+0

Forse sono segmenti: indirizzi di offset, come x86 a 16 bit? –

risposta

1

Indipendentemente dalla quantità di memoria si sta emulando, non lo fai necessità che quantità di memoria disponibile sulla macchina host (non lo fai bisogno di 4 GB, e non hai nemmeno bisogno di 4 MB). Utilizzare invece una struttura dati in cui è possibile accedere alla memoria emulata in base al valore dell'indirizzo. Assegna solo spazio nella tua vera memoria quando hai bisogno di immagazzinare qualcosa nella tua memoria emulata.

Tuttavia, potrebbe essere banale allocare effettivamente la quantità di memoria interna sopra descritta.

Come Simon, vorrei anche assumere per primo il segmento: teoria degli offset, ma l'intervallo degli intervalli elencato sopra sembra contraddire completamente tale teoria. Inoltre, l'intera cosa dello spazio degli indirizzi a 64 "bit.

Si noti che la maggior parte dello spazio degli indirizzi è allocata alle interfacce esterne (cartucce, ecc.), Non alle risorse hardware interne.

+0

Hm, suppongo che sia vero. Dovrebbe averlo capito. Grazie! –

2

La mappa che hai è astratta, se guardi un more detailed memory map, noterai grandi vuoti di memoria non mappata. A parte la mappatura della cartuccia esterna ROM (ecc.), Sommare ogni parte della memoria utilizzabile. Finirai per allocare poco più di 4 MB, inclusa la RDRAM. Si noti inoltre che gli indirizzi su 0x80000000 sono effettivamente specchi di indirizzi inferiori, con la differenza che alcuni sono mappati direttamente (memoria fisica) e alcuni sono mappati TLB (memoria virtuale).

0x00000000 - 0x7fffffff KUSEG TLB mapping 
0x80000000 - 0x9fffffff KSEG0 Direct map, cache 
0xa0000000 - 0xbfffffff KSEG1 Direct map, non-cache 
0xc0000000 - 0xdfffffff KSSEG TLB mapping 
0xe0000000 - 0xffffffff KSEG3 TLB mapping 

Inoltre, notare che la memoria della cartuccia è mappata a 0xb0000000. Questo non è mostrato esplicitamente nella mappa della memoria.

0

AFAIK Il processore del sistema può avere fino a 4 GB senza problemi, ma lo stesso n64 non utilizzava questa funzionalità. Quindi penso che se il processore richiedesse i dati da quella regione, restituirebbe semplicemente 00.