#ifndef __KERNEL_VMM_H #define __KERNEL_VMM_H #ifdef __cplusplus extern "C" { #endif #include <kernel/proc.h> #include <kernel/fs.h> typedef struct vm_area_t vm_area_t; #define VM_AREA_NORMAL 0 #define VM_AREA_MAP 1 #define VM_AREA_SHARED 2 #define VM_AREA_FILE 3 //! Describes an area of memory allocated within the address space of a //! particular process. struct vm_area_t { //! Points to the previous vm_area_t in the owning process vm_area_t *prev; //! Points to the next vm_area_t in the owning process vm_area_t *next; process_t *owner; //! Indicates the start of the area in the owning process's address space void* start; //! Specifies the number of pages spanned by the area size_t pages; //! Specifies the MEM_xxx flags associated with the area dword flags; //bool is_committed; //! Specifies the type of the memory area unsigned type; union { addr_t phys_map; vm_area_t* shared_from; file_t *file; } dest; }; /* vmmAlloc flags are in os/os.h */ /* create a vm_area_t */ void* vmmMap(process_t* proc, size_t pages, addr_t virt, void *dest, unsigned type, dword flags); /* create a normal vm area */ void* vmmAlloc(process_t* proc, size_t pages, addr_t start, dword flags); /* create a shared vm area */ void* vmmShare(vm_area_t* area, process_t* proc, addr_t start, dword flags); /* create a mapped file vm area */ void* vmmMapFile(process_t *proc, addr_t start, size_t pages, file_t *file, dword flags); void vmmFree(vm_area_t* area); bool vmmCommit(vm_area_t* area, addr_t start, size_t pages); void vmmUncommit(vm_area_t* area); void vmmInvalidate(vm_area_t* area, addr_t start, size_t pages); vm_area_t* vmmArea(process_t* proc, const void* ptr); #ifdef __cplusplus } #endif #endif