Pyro Kernel
|
This file contains functions for manipulating regions of virtual memory known as areas. More...
Functions | |
void | list_areas (MemContext_s *psCtx) |
Prints all areas in the specified memory context to the debug console. | |
void | validate_kernel_pages (void) |
status_t | put_area (MemArea_s *psArea) |
status_t | alloc_area_list (uint32_t nProtection, uint32_t nLockMode, uintptr_t nAddress, uint_fast32_t nCount, const char *const *apzNames, size_t *panOffsets, size_t *panSizes, area_id *panAreas) |
Allocates an array of areas with the specified names, starting offsets and sizes. More... | |
status_t | resize_area (area_id hArea, size_t nNewSize, bool bAtomic) |
Resizes the specified area. More... | |
status_t | delete_area (area_id hArea) |
Deletes the specified area. More... | |
void | empty_mem_context (MemContext_s *psCtx) |
Deletes all areas in the specified memory context. | |
void | delete_mem_context (MemContext_s *psCtx) |
Deletes the specified memory context and all of its areas. | |
status_t | clone_page_pte (pte_t *pDst, pte_t *pSrc, bool bCow) |
Copies a page-table entry, optionally setting up copy-on-write semantics. | |
MemContext_s * | clone_mem_context (MemContext_s *psOrig) |
Clones the specified memory context. | |
status_t | map_area_to_file (area_id hArea, File_s *psFile, flags_t nProtection __attribute__((unused)), off_t nOffset, size_t nSize) |
Maps the specified area onto a file. | |
area_id | sys_clone_area (const char *pzName, void **ppAddress, flags_t nProtection, flags_t nLockMode, area_id hSrcArea) |
Clones the specified area at a new address. More... | |
area_id | create_area (const char *pzName, void **ppAddress, size_t nSize, size_t nMaxSize, flags_t nProtection, flags_t nLockMode) |
Creates a new memory area in the current process. More... | |
area_id | sys_create_area (const char *pzName, void **ppAddress, size_t nSize, flags_t nProtection, flags_t nLockMode) |
Creates a new memory area with the specified attributes. More... | |
status_t | sys_delete_area (area_id hArea) |
Deletes the specified area. More... | |
status_t | get_area_physical_address (area_id hArea, uintptr_t *pnAddress) |
Returns the starting physical memory address for the specified area. More... | |
status_t | get_area_info (area_id hArea, AreaInfo_s *psInfo) |
Returns an AreaInfo_s for the specified area. More... | |
status_t | sys_get_area_info (area_id hArea, AreaInfo_s *psInfo) |
Returns an AreaInfo_s for the specified area. More... | |
status_t | sys_remap_area (area_id hArea, void *pPhysAddress) |
Remaps the specified area to use a different region of physical memory. More... | |
status_t | remap_area (area_id hArea, void *pPhysAddress) |
Remaps the specified area to use a different region of physical memory. More... | |
status_t | memcpy_to_user (void *pDst, const void *pSrc, size_t nSize) |
Copies a region of memory from kernel space into user space. More... | |
status_t | memcpy_from_user (void *pDst, const void *pSrc, size_t nSize) |
Copies a region of memory from user space into kernel space. More... | |
status_t | strncpy_from_user (char *pzDst, const char *pzSrc, size_t nMaxLen) |
Copies a string from user space into kernel space. More... | |
status_t | strndup_from_user (const char *pzSrc, size_t nMaxLen, char **ppzDst) |
Copies a string from user space into a newly allocated kernel region. More... | |
status_t | strcpy_to_user (char *pzDst, const char *pzSrc) |
Copies a string from kernel space into user space. More... | |
status_t | strlen_from_user (const char *pzString) |
Returns the length of the specified string. More... | |
status_t | verify_mem_area (const void *pAddress, size_t nSize, bool bWriteAccess) |
Verifies a region of user memory for kernel access. More... | |
void * | sys_sbrk (int nDelta) |
Adjusts the upper bound of a user process's data segment. More... | |
area_id | clone_from_inactive_ctx (MemArea_s *psArea, uintptr_t nOffset, size_t nLength) |
clone_from_inactive_ctx() and update_inactive_ctx() are used to access an inactive address space / memory context (the associated process is not currently running, page directory is not loaded into CR3). More... | |
status_t | update_inactive_ctx (MemArea_s *psOriginalArea, area_id hCloneArea, uintptr_t nOffset) |
int | sys_munmap (void *pStart, size_t nLen) |
int | sys_mprotect (void *pStart, size_t nLen, int nProt) |
status_t | msync (uint32 nAddr, size_t nLen, int nFlags) |
Write dirty pages back to the file backing the area. | |
int | sys_msync (void *pStart, size_t nLen, int nFlags) |
void | init_kernel_mem_context () |
Creates the memory context for the kernel. More... | |
void | init_areas (void) |
Initializes the area manager. | |
Variables | |
MultiArray_s | g_sAreas |
A private shared MultiArray for managing areas. More... | |
sem_id | g_hAreaTableSema = -1 |
A semaphore to control access to g_sAreas. More... | |
This file contains functions for manipulating regions of virtual memory known as areas.
An area can exist in one of several states depending on its access privileges and whether or not it is currently located in physical memory.
NULL
a_psFile
entry and the PTE has the value 0. NULL
a_psFile
entry and the PTE is marked present. AREA_SHARED
flag set and the PTE is marked not present. status_t alloc_area_list | ( | uint32_t | nProtection, |
uint32_t | nLockMode, | ||
uintptr_t | nAddress, | ||
uint_fast32_t | nCount, | ||
const char *const * | apzNames, | ||
size_t * | panOffsets, | ||
size_t * | panSizes, | ||
area_id * | panAreas | ||
) |
Allocates an array of areas with the specified names, starting offsets and sizes.
All areas will have the same protection mask and locking mode.
nProtection | a protection bitmask containing any combination of: AREA_READ , AREA_WRITE , AREA_EXEC , AREA_KERNEL , and AREA_WRCOMB . |
nLockMode | the locking mode to use: AREA_NO_LOCK , AREA_LAZY_LOCK , AREA_FULL_LOCK , or AREA_CONTIGUOUS . |
nAddress | the base virtual memory address for the new areas. Each area will start at (nAddress + panOffsets[i]) . |
nCount | the number of areas to create. apzNames , panOffsets , panSizes , and panAreas are arrays of this size. |
apzNames | an array of pointers to strings containing the names to use for each area. Any entry can be NULL to create an unnamed area, or a NULL pointer can be passed here to create all areas without names. |
panOffsets | an array of byte offsets from nAddress to use as the start address for each area. |
panSizes | an array of sizes in bytes for each area. |
panAreas | the area_id s of the new areas will be copied to this array. |
-EINVAL
if any of the areas to create would overlap or if the starting offsets are not in sequential order, -ENOADDRSPC
if there isn't enough free virtual address space for the new areas, -ENOMEM
if there isn't enough physical memory available; 0
otherwise. area_id clone_from_inactive_ctx | ( | MemArea_s * | psArea, |
uintptr_t | nOffset, | ||
size_t | nLength | ||
) |
clone_from_inactive_ctx() and update_inactive_ctx() are used to access an inactive address space / memory context (the associated process is not currently running, page directory is not loaded into CR3).
clone_from_inactive_ctx() will create in kernel space a clone of (a part of) the specified area. If you have written to the cloned area, call update_inactive_ctx() to make sure that pages allocated by the copy-on-write mechanism are transfered to the originating memory context.
area_id create_area | ( | const char * | pzName, |
void ** | ppAddress, | ||
size_t | nSize, | ||
size_t | nMaxSize, | ||
flags_t | nProtection, | ||
flags_t | nLockMode | ||
) |
Creates a new memory area in the current process.
pzName | a pointer to the string containing the name for the new area. |
ppAddress | a pointer to the variable where the start address of the new area will be stored, or NULL . If non- NULL , the previous value of the variable it points to will be used as the preferred start address of the new area. |
nSize | the size in bytes of the requested area. |
nMaxSize | the maximum size in bytes of the requested area. |
nProtection | a protection bitmask containing any combination of: AREA_READ , AREA_WRITE , AREA_EXEC , AREA_KERNEL , and AREA_WRCOMB . |
nLockMode | the locking mode to use: AREA_NO_LOCK , AREA_LAZY_LOCK , AREA_FULL_LOCK , or AREA_CONTIGUOUS . |
-EINVAL
if the preferred starting address at *ppAddress is not a multiple of PAGE_SIZE
; -ENOADDRSPC
if there isn't enough virtual address space, -ENOMEM
if there isn't enough physical memory; the area_id
of the new area otherwise. status_t delete_area | ( | area_id | hArea | ) |
Deletes the specified area.
hArea | a handle to the area to resize. |
-EINVAL
if the area handle is invalid, -ENOADDRSPC
if there isn't enough virtual address space available, -ENOMEM
if there isn't enough physical memory available; 0
otherwise. status_t get_area_info | ( | area_id | hArea, |
AreaInfo_s * | psInfo | ||
) |
Returns an AreaInfo_s
for the specified area.
hArea | a handle to the area for which to return info. |
psInfo | a pointer to the AreaInfo_s in which to store the results. |
-EINVAL
if the area handle is invalid or the area doesn't belong to this process; 0
otherwise. status_t get_area_physical_address | ( | area_id | hArea, |
uintptr_t * | pnAddress | ||
) |
Returns the starting physical memory address for the specified area.
hArea | a handle to the area. |
pnAddress | a pointer to the variable where the starting physical address for hArea will be copied. |
-EINVAL
if hArea is invalid; 0
otherwise. void init_kernel_mem_context | ( | void | ) |
Creates the memory context for the kernel.
This context holds all kernel areas below AREA_FIRST_USER_ADDRESS.
status_t memcpy_from_user | ( | void * | pDst, |
const void * | pSrc, | ||
size_t | nSize | ||
) |
Copies a region of memory from user space into kernel space.
pDst | the starting address of the destination region. |
pSrc | the starting address of the source region. |
nSize | the number of bytes to copy. |
0
otherwise. status_t memcpy_to_user | ( | void * | pDst, |
const void * | pSrc, | ||
size_t | nSize | ||
) |
Copies a region of memory from kernel space into user space.
pDst | the starting address of the destination region. |
pSrc | the starting address of the source region. |
nSize | the number of bytes to copy. |
0
otherwise. status_t remap_area | ( | area_id | hArea, |
void * | pPhysAddress | ||
) |
Remaps the specified area to use a different region of physical memory.
hArea | a handle to the area to remap. |
pPhysAddress | the new start address in physical memory for the region. |
-EINVAL
if the area handle is invalid or if nPhysAddress isn't a multiple of PAGE_SIZE
; 0
otherwise. status_t resize_area | ( | area_id | hArea, |
size_t | nNewSize, | ||
bool | bAtomic | ||
) |
Resizes the specified area.
hArea | a handle to the area to resize. |
nNewSize | the new area size in bytes. |
bAtomic | if true , resize_area() will repeatedly shrink the block cache by 64K and try again if an -ENOMEM error is returned by alloc_area_pages() or alloc_area_page_tables(). |
-EINVAL
if the area handle is invalid, -ENOADDRSPC
if there isn't enough virtual address space available, -ENOMEM
if there isn't enough physical memory available; 0
otherwise. status_t strcpy_to_user | ( | char * | pzDst, |
const char * | pzSrc | ||
) |
Copies a string from kernel space into user space.
pzDst | the starting address of the destination region. |
pzSrc | the address of the string to copy. |
0
otherwise. status_t strlen_from_user | ( | const char * | pzString | ) |
Returns the length of the specified string.
pzString | the starting address of the string. |
status_t strncpy_from_user | ( | char * | pzDst, |
const char * | pzSrc, | ||
size_t | nMaxLen | ||
) |
Copies a string from user space into kernel space.
pzDst | the starting address of the destination region. |
pzSrc | the address of the string to copy. |
nMaxLen | the maximum size of the string to copy. |
0
otherwise. status_t strndup_from_user | ( | const char * | pzSrc, |
size_t | nMaxLen, | ||
char ** | ppzDst | ||
) |
Copies a string from user space into a newly allocated kernel region.
pzSrc | the address of the string to copy. |
nMaxLen | the maximum size of the string to copy. |
ppzDst | a pointer to the variable in which to store a pointer to the new string. |
-ENAMETOOLONG
if the length of the string, including the trailing '\0'
, is greater than nMaxLen, -ENOMEM
if there isn't enough free memory for kmalloc(), any error code from verify_mem_area() on failure; 0
otherwise. status_t update_inactive_ctx | ( | MemArea_s * | psOriginalArea, |
area_id | hCloneArea, | ||
uintptr_t | nOffset | ||
) |
status_t verify_mem_area | ( | const void * | pAddress, |
size_t | nSize, | ||
bool | bWriteAccess | ||
) |
Verifies a region of user memory for kernel access.
pAddress | the start address of the region to lock. |
nSize | the size in bytes of the region to lock. |
bWriteAccess | true to lock the region for write access; false otherwise. |
-EFAULT
if pAddress points to an address in kernel space, doesn't correspond to an area in user space, or if (pAddress + nSize - 1)
extends beyond the end of the area; -ENOMEM
if there isn't enough physical memory available; 0
otherwise. sem_id g_hAreaTableSema = -1 |
A semaphore to control access to g_sAreas.
MultiArray_s g_sAreas |
A private shared MultiArray for managing areas.