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. | 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.
| void init_kernel_mem_context | ( | void | ) |
Creates the memory context for the kernel.
This context holds all kernel areas below AREA_FIRST_USER_ADDRESS.
| 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.
| pzName | a pointer to the string containing the name of 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. | |
| 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. | |
| hSrcArea | the area_id of the area to clone. |
-EFAULT if there is a memory access violation while copying pzName; -EINVAL if the preferred starting address at *ppAddress is not a multiple of PAGE_SIZE; the area_id of the new area otherwise. | 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.
| 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. | |
| 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. |
-EFAULT if there is a memory access violation while copying pzName; -EINVAL if the preferred start 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 sys_delete_area | ( | area_id | hArea | ) |
Deletes the specified area.
| hArea | a handle to the area to delete. |
-EINVAL if the area handle is invalid or if the area doesn't belong to this process; 0 otherwise. | status_t sys_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; -EFAULT if there is a memory access violation while copying to psInfo; 0 otherwise. | status_t sys_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. | void* sys_sbrk | ( | int | nDelta | ) |
Adjusts the upper bound of a user process's data segment.
| nDelta | the number of bytes by which to increase or decrease the data segment. |
-1 if there was an error adjusting the data segment; otherwise, the old upper bound of the process's data segment.
1.5.1