更新日期: 2022/06/01 来源: https://gitee.com/weharmony/kernel_liteos_a_note
los_lms.h 文件参考

浏览源代码.

函数

UINT32 LOS_LmsCheckPoolAdd (const VOID *pool, UINT32 size)
 
VOID LOS_LmsCheckPoolDel (const VOID *pool)
 
VOID LOS_LmsAddrProtect (UINTPTR addrStart, UINTPTR addrEnd)
 
VOID LOS_LmsAddrDisableProtect (UINTPTR addrStart, UINTPTR addrEnd)
 

函数说明

◆ LOS_LmsAddrDisableProtect()

VOID LOS_LmsAddrDisableProtect ( UINTPTR  addrStart,
UINTPTR  addrEnd 
)

在文件 los_lms.c430 行定义.

431{
432 UINT32 intSave;
433 if (addrEnd <= addrStart) {
434 return;
435 }
436 LMS_LOCK(intSave);
437 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr(addrStart);
438 if (node != NULL) {
439 OsLmsSetShadowValue(node, addrStart, addrEnd, LMS_SHADOW_ACCESSABLE_U8);
440 }
441 LMS_UNLOCK(intSave);
442}
STATIC LmsMemListNode * OsLmsGetPoolNodeFromAddr(UINTPTR addr)
Definition: los_lms.c:106
VOID OsLmsSetShadowValue(LmsMemListNode *node, UINTPTR startAddr, UINTPTR endAddr, UINT8 value)
Definition: los_lms.c:255
unsigned int UINT32
Definition: los_typedef.h:57
函数调用图:

◆ LOS_LmsAddrProtect()

VOID LOS_LmsAddrProtect ( UINTPTR  addrStart,
UINTPTR  addrEnd 
)

在文件 los_lms.c416 行定义.

417{
418 UINT32 intSave;
419 if (addrEnd <= addrStart) {
420 return;
421 }
422 LMS_LOCK(intSave);
423 LmsMemListNode *node = OsLmsGetPoolNodeFromAddr(addrStart);
424 if (node != NULL) {
425 OsLmsSetShadowValue(node, addrStart, addrEnd, LMS_SHADOW_REDZONE_U8);
426 }
427 LMS_UNLOCK(intSave);
428}
函数调用图:

◆ LOS_LmsCheckPoolAdd()

UINT32 LOS_LmsCheckPoolAdd ( const VOID *  pool,
UINT32  size 
)

添加指定内存池被检测 将指定内存池的地址范围添加到LMS的内存检测链表上,当访问的地址在链表范围内时,LMS才进行合法性校验; 且LOS_MemInit接口会调用该接口,默认将初始化的内存池挂入到检测链表中。

在文件 los_lms.c141 行定义.

142{
143 UINT32 intSave;
144 UINTPTR poolAddr = (UINTPTR)pool;
145 UINT32 realSize;
146 LmsMemListNode *lmsPoolNode = NULL;
147
148 if (pool == NULL) {
149 return 0;
150 }
151
152 LMS_LOCK(intSave);
153
154 lmsPoolNode = OsLmsGetPoolNodeFromAddr((UINTPTR)pool);
155 if (lmsPoolNode != NULL) { /* if pool range already on checklist */
156 if (lmsPoolNode->poolAddr != (UINTPTR)pool) { /* pool is a subset of lmsPoolNode->poolAddr */
157 /* do not add it again, just return */
158 PRINT_DEBUG("[LMS]pool %p already on lms checklist !\n", pool);
159 LMS_UNLOCK(intSave);
160 return size; /* return size indicate the shadow memory init successful */
161 } else { /* Re-initialize the same pool, maybe with different size */
162 /* delete the old node, then add a new one */
163 lmsPoolNode->used = LMS_POOL_UNUSED;
164 LOS_ListDelete(&(lmsPoolNode->node));
165 }
166 }
167
168 lmsPoolNode = OsLmsCheckPoolCreate();
169 if (lmsPoolNode == NULL) {
170 PRINT_DEBUG("[LMS]the num of lms check pool is max already !\n");
171 LMS_UNLOCK(intSave);
172 return 0;
173 }
174 realSize = OsLmsPoolResize(size);
175
176 lmsPoolNode->poolAddr = poolAddr;
177 lmsPoolNode->poolSize = realSize;
178 lmsPoolNode->shadowStart = (UINTPTR)poolAddr + realSize;
179 lmsPoolNode->shadowSize = poolAddr + size - lmsPoolNode->shadowStart;
180 /* init shadow value */
181 (VOID)memset((VOID *)lmsPoolNode->shadowStart, LMS_SHADOW_AFTERFREE_U8, lmsPoolNode->shadowSize);
182
183 LOS_ListAdd(&g_lmsCheckPoolList, &(lmsPoolNode->node));
184
185 LMS_UNLOCK(intSave);
186 return realSize;
187}
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListDelete(LOS_DL_LIST *node)
Definition: los_list.h:292
LITE_OS_SEC_ALW_INLINE STATIC INLINE VOID LOS_ListAdd(LOS_DL_LIST *list, LOS_DL_LIST *node)
Insert a new node to a doubly linked list.
Definition: los_list.h:217
void * memset(void *addr, int c, size_t len)
Definition: lms_libc.c:36
LITE_OS_SEC_BSS STATIC LOS_DL_LIST g_lmsCheckPoolList
Definition: los_lms.c:66
STATIC UINT32 OsLmsPoolResize(UINT32 size)
Definition: los_lms.c:81
STATIC LmsMemListNode * OsLmsCheckPoolCreate(VOID)
Definition: los_lms.c:125
unsigned long UINTPTR
Definition: los_typedef.h:68
UINT32 shadowSize
Definition: los_lms_pri.h:86
UINTPTR shadowStart
Definition: los_lms_pri.h:85
LOS_DL_LIST node
Definition: los_lms_pri.h:81
UINTPTR poolAddr
Definition: los_lms_pri.h:83
UINT32 poolSize
Definition: los_lms_pri.h:84
函数调用图:
这是这个函数的调用关系图:

◆ LOS_LmsCheckPoolDel()

VOID LOS_LmsCheckPoolDel ( const VOID *  pool)

在文件 los_lms.c189 行定义.

190{
191 UINT32 intSave;
192 if (pool == NULL) {
193 return;
194 }
195
196 LMS_LOCK(intSave);
197 LmsMemListNode *delNode = OsLmsGetPoolNode(pool);
198 if (delNode == NULL) {
199 PRINT_ERR("[LMS]pool %p is not on lms checklist !\n", pool);
200 goto Release;
201 }
202 delNode->used = LMS_POOL_UNUSED;
203 LOS_ListDelete(&(delNode->node));
204Release:
205 LMS_UNLOCK(intSave);
206}
STATIC LmsMemListNode * OsLmsGetPoolNode(const VOID *pool)
Definition: los_lms.c:86
函数调用图:
这是这个函数的调用关系图: