77 lines
2.4 KiB
C
77 lines
2.4 KiB
C
/// @file vmem_map.h
|
|
/// @brief Virtual memory mapping routines.
|
|
/// @copyright (c) 2014-2022 This file is distributed under the MIT License.
|
|
/// See LICENSE.md for details.
|
|
|
|
#pragma once
|
|
|
|
#include "mem/buddysystem.h"
|
|
#include "mem/zone_allocator.h"
|
|
#include "mem/paging.h"
|
|
|
|
/// Size of the virtual memory.
|
|
#define VIRTUAL_MEMORY_SIZE_MB 128
|
|
|
|
/// @brief Virtual mapping manager.
|
|
typedef struct virt_map_page_manager_t {
|
|
/// The buddy system used to manage the pages.
|
|
bb_instance_t bb_instance;
|
|
} virt_map_page_manager_t;
|
|
|
|
/// @brief Virtual mapping.
|
|
typedef struct virt_map_page_t {
|
|
/// A buddy system page.
|
|
bb_page_t bbpage;
|
|
} virt_map_page_t;
|
|
|
|
/// @brief Initialize the virtual memory mapper
|
|
void virt_init(void);
|
|
|
|
/// @brief Map a page range to virtual memory
|
|
/// @param page The start page of the mapping
|
|
/// @param pfn_count The number of pages to map
|
|
/// @return The virtual address of the mapping
|
|
uint32_t virt_map_physical_pages(page_t *page, int pfn_count);
|
|
|
|
/// @brief Allocate a virtual page range of the specified size.
|
|
/// @param size The required amount.
|
|
/// @return Pointer to the allocated memory.
|
|
virt_map_page_t *virt_map_alloc(uint32_t size);
|
|
|
|
/// @brief Map a page to a memory area portion.
|
|
/// @param mm The memory descriptor.
|
|
/// @param vpage Pointer to the virtual page.
|
|
/// @param vaddr The starting address of the are.
|
|
/// @param size The size of the area.
|
|
/// @return Address of the mapped area.
|
|
uint32_t virt_map_vaddress(mm_struct_t *mm,
|
|
virt_map_page_t *vpage,
|
|
uint32_t vaddr,
|
|
uint32_t size);
|
|
|
|
/// @brief Checks if an address belongs to the virtual memory mapping.
|
|
/// @param addr The address to check.
|
|
/// @return 1 if it belongs to the virtual memory mapping, 0 otherwise.
|
|
int virtual_check_address(uint32_t addr);
|
|
|
|
/// @brief Unmap an address.
|
|
/// @param addr The address to unmap.
|
|
void virt_unmap(uint32_t addr);
|
|
|
|
/// @brief Unmap a page.
|
|
/// @param page Pointer to the page to unmap.
|
|
void virt_unmap_pg(virt_map_page_t *page);
|
|
|
|
/// @brief Memcpy from different processes virtual addresses
|
|
/// @param dst_mm The destination memory struct
|
|
/// @param dst_vaddr The destination memory address
|
|
/// @param src_mm The source memory struct
|
|
/// @param src_vaddr The source memory address
|
|
/// @param size The size in bytes of the copy
|
|
void virt_memcpy(
|
|
mm_struct_t *dst_mm,
|
|
uint32_t dst_vaddr,
|
|
mm_struct_t *src_mm,
|
|
uint32_t src_vaddr,
|
|
uint32_t size);
|