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.