Memory layout: Difference between revisions
Vgturtle127 (talk | contribs) |
|||
Line 382: | Line 382: | ||
! Physical Address Base | ! Physical Address Base | ||
! Region Max Size | ! Region Max Size | ||
! Address-range available for svcMapMemoryBlock | |||
! Description | ! Description | ||
|- | |- | ||
Line 387: | Line 388: | ||
| | | | ||
| 0x03F00000 | | 0x03F00000 | ||
| No | |||
| The [[ExeFS]]:/.code is loaded here, executables must be loaded to the 0x00100000 region when the exheader "special memory" flag is clear. The 0x03F00000-byte size restriction only applies when this flag is clear. Executables are usually loaded to 0x14000000 when the exheader "special memory" flag is set, however this address can be arbitrary. | | The [[ExeFS]]:/.code is loaded here, executables must be loaded to the 0x00100000 region when the exheader "special memory" flag is clear. The 0x03F00000-byte size restriction only applies when this flag is clear. Executables are usually loaded to 0x14000000 when the exheader "special memory" flag is set, however this address can be arbitrary. | ||
|- | |- | ||
Line 392: | Line 394: | ||
| ? | | ? | ||
| ? | | ? | ||
| No | |||
| Used for mapping buffers during IPC, see [[IPC Command Structure]]. | | Used for mapping buffers during IPC, see [[IPC Command Structure]]. | ||
|- | |- | ||
Line 397: | Line 400: | ||
| Main stack physaddr - <heap size for the allocated vaddr 0x08000000 memory> | | Main stack physaddr - <heap size for the allocated vaddr 0x08000000 memory> | ||
| 0x08000000 | | 0x08000000 | ||
| Yes | |||
| Heap mapped by [[SVC|ControlMemory]] | | Heap mapped by [[SVC|ControlMemory]] | ||
|- | |- | ||
Line 402: | Line 406: | ||
| .bss physical address - total stack pages | | .bss physical address - total stack pages | ||
| StackSize from process exheader | | StackSize from process exheader | ||
| | |||
| Stack for the main-thread, initialized by the ARM11 kernel. The StackSize from the exheader is usually 0x4000, therefore the stack-bottom is usually 0x0FFFC000. The stack for the other threads is normally located in the process .data section however this can be arbitrary. | | Stack for the main-thread, initialized by the ARM11 kernel. The StackSize from the exheader is usually 0x4000, therefore the stack-bottom is usually 0x0FFFC000. The stack for the other threads is normally located in the process .data section however this can be arbitrary. | ||
|- | |- | ||
Line 407: | Line 412: | ||
| | | | ||
| 0x04000000 | | 0x04000000 | ||
| Yes | |||
| [[SVC|Shared]] memory | | [[SVC|Shared]] memory | ||
|- | |- | ||
Line 412: | Line 418: | ||
| FCRAM+0 | | FCRAM+0 | ||
| 0x08000000 | | 0x08000000 | ||
| No | |||
| Can be mapped by [[SVC|ControlMemory]], this is used for processes' [[SVC|LINEAR]]/GSP heap. | | Can be mapped by [[SVC|ControlMemory]], this is used for processes' [[SVC|LINEAR]]/GSP heap. | ||
|- | |- | ||
Line 417: | Line 424: | ||
| 0x1F000000 | | 0x1F000000 | ||
| 0x00400000 | | 0x00400000 | ||
| No | |||
| [[New_3DS]] additional memory, access to this is specified by the exheader. Added with [[8.0.0-18]], see above section regarding this memory. | | [[New_3DS]] additional memory, access to this is specified by the exheader. Added with [[8.0.0-18]], see above section regarding this memory. | ||
|- | |- | ||
Line 422: | Line 430: | ||
| 0x10100000 | | 0x10100000 | ||
| 0x01000000 | | 0x01000000 | ||
| No | |||
| [[IO]] registers, the mapped IO pages which each process can access is specified in the [[NCCH#CXI|CXI]] exheader.(Applications normally don't have access to registers in this range) | | [[IO]] registers, the mapped IO pages which each process can access is specified in the [[NCCH#CXI|CXI]] exheader.(Applications normally don't have access to registers in this range) | ||
|- | |- | ||
Line 427: | Line 436: | ||
| 0x18000000 | | 0x18000000 | ||
| 0x00600000 | | 0x00600000 | ||
| No | |||
| VRAM, access to this is specified by the exheader. | | VRAM, access to this is specified by the exheader. | ||
|- | |- | ||
Line 432: | Line 442: | ||
| 0x1FF00000 | | 0x1FF00000 | ||
| 0x00080000 | | 0x00080000 | ||
| No | |||
| DSP memory, access to this is specified by the exheader. | | DSP memory, access to this is specified by the exheader. | ||
|- | |- | ||
Line 437: | Line 448: | ||
| FCRAM memory page allocated by the ARM11 kernel. | | FCRAM memory page allocated by the ARM11 kernel. | ||
| 0x1000 | | 0x1000 | ||
| No | |||
| [[Configuration Memory]], all processes have read-only access to this. | | [[Configuration Memory]], all processes have read-only access to this. | ||
|- | |- | ||
Line 442: | Line 454: | ||
| FCRAM memory page allocated by the ARM11 kernel. | | FCRAM memory page allocated by the ARM11 kernel. | ||
| 0x1000 | | 0x1000 | ||
| No | |||
| [[Configuration Memory|Shared]] page, all processes have read-access to this. Write access to this is specified by the exheader "Shared page writing" kernel flag. | | [[Configuration Memory|Shared]] page, all processes have read-access to this. Write access to this is specified by the exheader "Shared page writing" kernel flag. | ||
|- | |- | ||
Line 447: | Line 460: | ||
| ? | | ? | ||
| ? | | ? | ||
| No | |||
| [[Thread Local Storage]] | | [[Thread Local Storage]] | ||
|- | |- | ||
Line 452: | Line 466: | ||
| FCRAM+0 | | FCRAM+0 | ||
| 0x08000000(Old3DS) / 0x10000000([[New_3DS]]) | | 0x08000000(Old3DS) / 0x10000000([[New_3DS]]) | ||
| No | |||
| This LINEAR memory mapping was added with [[8.0.0-18]], see [[SVC#enum_MemoryOperation|here]]. This replaces the original 0x14000000 mapping, for system(memory-region=BASE)/newer titles. The Old3DS kernel uses size 0x08000000 for LINEAR-memory address range checks, while the New3DS kernel uses size 0x10000000 for those range checks. Old3DS/New3DS system-module code doing vaddr->phys-addr conversion uses size 0x10000000. | | This LINEAR memory mapping was added with [[8.0.0-18]], see [[SVC#enum_MemoryOperation|here]]. This replaces the original 0x14000000 mapping, for system(memory-region=BASE)/newer titles. The Old3DS kernel uses size 0x08000000 for LINEAR-memory address range checks, while the New3DS kernel uses size 0x10000000 for those range checks. Old3DS/New3DS system-module code doing vaddr->phys-addr conversion uses size 0x10000000. | ||
|- | |- | ||
| 0x20000000 / 0x40000000 | | 0x20000000 / 0x40000000 | ||
| | |||
| | | | ||
| | | |