Memory layout: Difference between revisions

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
|
|  
|  
|  
|