Line 1: |
Line 1: |
| = Userspace = | | = Userspace = |
− | The userspace virtual address space has 38 bits. It seems that when the IPC protocol was designed, it was only 36 bits leading to a weird encoding format. | + | The userspace virtual address space can be either 32 or 36 bits. [2.0.0+] introduced support for 38 bit address spaces. |
| | | |
− | There are several regions maintained by the kernel, each one starting at the upper bits bit37-21 randomized: | + | There are two regions randomized and enforced by the kernel, each one with upper bits random and 2MB-aligned: |
− | * Main binary region.
| + | * Heap region, available from [[SVC#svcGetInfo]]. |
− | * Heap region. | |
| * Stack mapping region, available from [[SVC#svcGetInfo]]. | | * Stack mapping region, available from [[SVC#svcGetInfo]]. |
| | | |
− | For the stack mapping region, the userland randomizes a page-offset where to start inside the region.
| + | The main binary is placed at an address that is provided to the kernel by Loader via [[SVC#svcCreateProcess]]. |
− | This adds some additional entropy.
| |
| | | |
− | Binaries mapped by RO seems to be mapped randomly everywhere in the entire address space. The random base address for each NRO has bits 37-12 randomized, unlike the main binary region. | + | Typically on 2.0.0+ systems, the main binary region has randomness in bits 37-21. |
| + | |
| + | For the stack mapping region, the userland randomizes a page-offset where to start inside the region. This adds some additional entropy. |
| + | |
| + | Binaries mapped by RO are mapped randomly everywhere in the entire address space. The base address for each NRO has all bits randomized and are 4K-aligned. This means that typically, on 2.0.0+ systems, bits 37-12 of the NRO base address are random. |
| | | |
| For all binaries(main area / NROs), the R-- section is always located immediately after R-X. The RW- section is always located immediately after the R-- section. Hence, there's no extra randomization / guard-pages for these sections. | | For all binaries(main area / NROs), the R-- section is always located immediately after R-X. The RW- section is always located immediately after the R-- section. Hence, there's no extra randomization / guard-pages for these sections. |