LibCore: Add functions to reserve and commit non-backed address space

This commit is contained in:
Ali Mohammad Pur 2026-04-22 11:45:08 +02:00 committed by Ali Mohammad Pur
parent 26b18f192e
commit 0a7bef349d
3 changed files with 54 additions and 0 deletions

View file

@ -142,6 +142,33 @@ ErrorOr<void> munmap(void* address, size_t size)
return {};
}
ErrorOr<void*> reserve_address_space(size_t size)
{
int flags = MAP_PRIVATE | MAP_ANONYMOUS;
#ifdef MAP_NORESERVE
flags |= MAP_NORESERVE;
#endif
auto* ptr = ::mmap(nullptr, size, PROT_NONE, flags, -1, 0);
if (ptr == MAP_FAILED)
return Error::from_syscall("mmap"sv, errno);
return ptr;
}
ErrorOr<void> commit_memory(void* address, size_t size)
{
auto* ptr = ::mmap(address, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
if (ptr == MAP_FAILED)
return Error::from_syscall("mmap"sv, errno);
return {};
}
ErrorOr<void> release_address_space(void* address, size_t size)
{
if (::munmap(address, size) < 0)
return Error::from_syscall("munmap"sv, errno);
return {};
}
ErrorOr<int> anon_create([[maybe_unused]] size_t size, [[maybe_unused]] int options)
{
int fd = -1;

View file

@ -78,6 +78,9 @@ ErrorOr<struct stat> fstatat(int fd, StringView path, int flags);
CORE_API ErrorOr<int> fcntl(int fd, int command, ...);
ErrorOr<void*> mmap(void* address, size_t, int protection, int flags, int fd, off_t, size_t alignment = 0, StringView name = {});
ErrorOr<void> munmap(void* address, size_t);
CORE_API ErrorOr<void*> reserve_address_space(size_t size);
CORE_API ErrorOr<void> commit_memory(void* address, size_t size);
CORE_API ErrorOr<void> release_address_space(void* address, size_t size);
ErrorOr<int> anon_create(size_t size, int options);
CORE_API ErrorOr<int> open(StringView path, int options, mode_t mode = 0);
ErrorOr<int> openat(int fd, StringView path, int options, mode_t mode = 0);

View file

@ -199,6 +199,30 @@ ErrorOr<void> munmap(void* address, size_t size)
return {};
}
ErrorOr<void*> reserve_address_space(size_t size)
{
void* ptr = VirtualAlloc(nullptr, size, MEM_RESERVE, PAGE_NOACCESS);
if (!ptr)
return Error::from_windows_error();
return ptr;
}
ErrorOr<void> commit_memory(void* address, size_t size)
{
if (!VirtualAlloc(address, size, MEM_COMMIT, PAGE_READWRITE))
return Error::from_windows_error();
return {};
}
ErrorOr<void> release_address_space(void* address, size_t size)
{
// VirtualFree with MEM_RELEASE requires size == 0 and frees the entire reservation.
(void)size;
if (!VirtualFree(address, 0, MEM_RELEASE))
return Error::from_windows_error();
return {};
}
int getpid()
{
return GetCurrentProcessId();