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. | |
| status_t | resize_area (area_id hArea, size_t nNewSize, bool bAtomic) |
| Resizes the specified area. | |
| status_t | delete_area (area_id hArea) |
| Deletes the specified area. | |
| 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. | |
| 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. | |
| 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. | |
| status_t | sys_delete_area (area_id hArea) |
| Deletes the specified area. | |
| status_t | get_area_physical_address (area_id hArea, uintptr_t *pnAddress) |
| Returns the starting physical memory address for the specified area. | |
| status_t | get_area_info (area_id hArea, AreaInfo_s *psInfo) |
Returns an AreaInfo_s for the specified area. | |
| status_t | sys_get_area_info (area_id hArea, AreaInfo_s *psInfo) |
Returns an AreaInfo_s for the specified area. | |
| status_t | sys_remap_area (area_id hArea, void *pPhysAddress) |
| Remaps the specified area to use a different region of physical memory. | |
| status_t | remap_area (area_id hArea, void *pPhysAddress) |
| Remaps the specified area to use a different region of physical memory. | |
| status_t | memcpy_to_user (void *pDst, const void *pSrc, size_t nSize) |
| Copies a region of memory from kernel space into user space. | |
| status_t | memcpy_from_user (void *pDst, const void *pSrc, size_t nSize) |
| Copies a region of memory from user space into kernel space. | |
| status_t | strncpy_from_user (char *pzDst, const char *pzSrc, size_t nMaxLen) |
| Copies a string from user space into kernel space. | |
| 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. | |
| status_t | strcpy_to_user (char *pzDst, const char *pzSrc) |
| Copies a string from kernel space into user space. | |
| status_t | strlen_from_user (const char *pzString) |
| Returns the length of the specified string. | |
| status_t | verify_mem_area (const void *pAddress, size_t nSize, bool bWriteAccess) |
| Verifies a region of user memory for kernel access. | |
| void * | sys_sbrk (int nDelta) |
| Adjusts the upper bound of a user process's data segment. | |
| 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). | |
| status_t | update_inactive_ctx (MemArea_s *psOriginalArea, area_id hCloneArea, uintptr_t nOffset) |
| |
| void | init_kernel_mem_context () |
| Creates the memory context for the kernel. | |
| void | init_areas (void) |
| Initializes the area manager. | |
Variables | |
| MultiArray_s | g_sAreas |
| A private shared MultiArray for managing areas. | |
| sem_id | g_hAreaTableSema = -1 |
| A semaphore to control access to g_sAreas. | |
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_ids 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 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.
1.5.1