vm: replace vm-region with address-space

address-space is a non-recursive data structure, which contains a flat list of vm_areas representing
mapped vm-objects.

userspace programs can no longer create sub-address-spaces. instead, they can reserve portions of
the address space, and use that reserved space to create mappings.
This commit is contained in:
2026-03-13 19:44:50 +00:00
parent c6b0bee827
commit c628390f4a
28 changed files with 1719 additions and 2612 deletions

View File

@@ -1,9 +1,9 @@
#ifndef KERNEL_SYSCALL_H_
#define KERNEL_SYSCALL_H_
#include <kernel/address-space.h>
#include <kernel/handle.h>
#include <kernel/task.h>
#include <kernel/vm-region.h>
#include <kernel/vm.h>
#include <mango/status.h>
#include <mango/syscall.h>
@@ -28,13 +28,13 @@ static inline bool __validate_access(
vm_prot_t flags)
{
unsigned long irq_flags;
vm_region_lock_irqsave(task->t_address_space, &irq_flags);
bool result = vm_region_validate_access(
address_space_lock_irqsave(task->t_address_space, &irq_flags);
bool result = address_space_validate_access(
task->t_address_space,
(virt_addr_t)ptr,
len,
flags | VM_PROT_USER);
vm_region_unlock_irqrestore(task->t_address_space, irq_flags);
address_space_unlock_irqrestore(task->t_address_space, irq_flags);
return result;
}
@@ -85,29 +85,19 @@ extern kern_status_t sys_vm_object_copy(
size_t count,
size_t *nr_copied);
extern kern_status_t sys_vm_region_create(
kern_handle_t parent,
const char *name,
size_t name_len,
off_t offset,
size_t region_len,
vm_prot_t prot,
kern_handle_t *out,
virt_addr_t *out_base_address);
extern kern_status_t sys_vm_region_kill(kern_handle_t region);
extern kern_status_t sys_vm_region_read(
extern kern_status_t sys_address_space_read(
kern_handle_t region,
void *dst,
off_t offset,
virt_addr_t base,
size_t count,
size_t *nr_read);
extern kern_status_t sys_vm_region_write(
extern kern_status_t sys_address_space_write(
kern_handle_t region,
const void *src,
off_t offset,
virt_addr_t base,
size_t count,
size_t *nr_read);
extern kern_status_t sys_vm_region_map_absolute(
extern kern_status_t sys_address_space_map(
kern_handle_t region,
virt_addr_t map_address,
kern_handle_t object,
@@ -115,21 +105,18 @@ extern kern_status_t sys_vm_region_map_absolute(
size_t length,
vm_prot_t prot,
virt_addr_t *out_base_address);
extern kern_status_t sys_vm_region_map_relative(
extern kern_status_t sys_address_space_unmap(
kern_handle_t region,
off_t region_offset,
kern_handle_t object,
off_t object_offset,
size_t length,
vm_prot_t prot,
virt_addr_t *out_base_address);
extern kern_status_t sys_vm_region_unmap_absolute(
kern_handle_t region,
virt_addr_t address,
virt_addr_t base,
size_t length);
extern kern_status_t sys_vm_region_unmap_relative(
extern kern_status_t sys_address_space_reserve(
kern_handle_t region,
off_t offset,
virt_addr_t base,
size_t length,
virt_addr_t *out_base_address);
extern kern_status_t sys_address_space_release(
kern_handle_t region,
virt_addr_t base,
size_t length);
extern kern_status_t sys_kern_log(const char *s);