---
# System prepended metadata

title: Virtual memory implementation

---

# Virtual memory implementation

## Original mechanisms

Since originally Phantom worked on 32-bit architecture it has 32-bit address space.

## Memory layout

It is lower 2GB of the address space that is mapped 1 to 1 to the physical memory

> based on sources and https://github.com/dzavalishin/phantomuserland/wiki/KernelMemoryMap

- `0x0 - 0x500` = BIOS data area, preserved

- `0x500 - 0x100000` = low memory. Allocable except for I/O and ROM area (1mb-640k)
    - Allocation via:
        - `phantom_phys_alloc_page(), phantom_phys_alloc_region()` using `low_map` arena in `hal_physmem.c`
    - What stores:
        - Structures specific to certain devices
        - ???
    - Who uses:
        - Device drivers
        - ???

- `0x100000 - 0x???????` = Kernel (size: 1mb - ?mb)

- `<kernel end> - 0x40000000` = kernel heap, mapped as is (will be mapped not as is later)
    - Allocation via: 
        - `malloc()`
    - What stores: 
        - all dynamically allocated kernel structures
    - Who uses:
        - kernel

- `0x40000000 - 0x80000000` = unmapped, used to allocate unbacked address space (mem mapped devices, etc)
    - Allocation via: 
        - `hal_alloc_phys_page()`
        - `phantom_phys_alloc_page(), phantom_phys_alloc_region()` using `pm_map` arena in `hal_physmem.c`
    - What stores: 
        - Any allocated physical page that is not backed by disk and mapped onto object space
    - Who uses:
        - Pager (when handling page faults)
        - Device drivers

- `0x80000000 - 0xC0000000` = foreground, objects space
    - Allocation via:
        - `hal_alloc_vaddress()`, `hal_pv_alloc()`
        - `phantom_phys_alloc_page(), phantom_phys_alloc_region()` using `vm_map` arena in `hal_physmem.c`
    - Who uses:
        - Virtual machine
        - Drivers (to store some state)

## Implementation

Several mechanisms to allocate physical/virtual memory are available inside Phantom:

- Main physical memory allocator
- Address space allocator
- P+V allocator
- Kernel heap
- Pools

They are described in the corresponding section of the book:

- https://github.com/dzavalishin/phantomuserland/wiki/KernelMemoryMap

## Proposed implementation

### Layout

Ideally, first 32 GBs of virtual address space can be used as a kernel heap and the rest can be used for persistent memory. However, while internal Phantom memory structures are not adapted to 64 bits, only first 3 GBs will be used in the following way:

- 0 - 2GB = kernel heap
- 2 - 3GB = persistent memory
- 3GB - 2^64B = unmapped

### Implementation

TODO : What to describe?
- Access to API to map virtual pages
- Pseudo-physical space and rationale behind it
- Object space with dedicated page fault handler
- Why malloc from Genode's libc and why not own implementation?
- Why malloc and Phantom's physical page allocation will not intersect?
