|
LITE_OS_SEC_BSS | SPIN_LOCK_INIT (g_lmsSpin) |
|
STATIC UINT32 | OsLmsPoolResize (UINT32 size) |
|
STATIC LmsMemListNode * | OsLmsGetPoolNode (const VOID *pool) |
|
STATIC LmsMemListNode * | OsLmsGetPoolNodeFromAddr (UINTPTR addr) |
|
STATIC LmsMemListNode * | OsLmsCheckPoolCreate (VOID) |
|
UINT32 | LOS_LmsCheckPoolAdd (const VOID *pool, UINT32 size) |
|
VOID | LOS_LmsCheckPoolDel (const VOID *pool) |
|
STATIC UINT32 | OsLmsInit (VOID) |
| 初始化 LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具 更多...
|
|
STATIC INLINE UINT32 | OsLmsMem2Shadow (LmsMemListNode *node, UINTPTR memAddr, UINTPTR *shadowAddr, UINT32 *shadowOffset) |
|
STATIC INLINE VOID | OsLmsGetShadowInfo (LmsMemListNode *node, UINTPTR memAddr, LmsAddrInfo *info) |
|
VOID | OsLmsSetShadowValue (LmsMemListNode *node, UINTPTR startAddr, UINTPTR endAddr, UINT8 value) |
|
VOID | OsLmsGetShadowValue (LmsMemListNode *node, UINTPTR addr, UINT32 *shadowValue) |
|
VOID | OsLmsSimpleMark (UINTPTR startAddr, UINTPTR endAddr, UINT32 value) |
|
VOID | OsLmsLosMallocMark (const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize) |
|
VOID | OsLmsCheckValid (UINTPTR checkAddr, BOOL isFreeCheck) |
|
VOID | OsLmsLosFreeMark (const VOID *curNodeStart, const VOID *nextNodeStart, UINT32 nodeHeadSize) |
|
VOID | LOS_LmsAddrProtect (UINTPTR addrStart, UINTPTR addrEnd) |
|
VOID | LOS_LmsAddrDisableProtect (UINTPTR addrStart, UINTPTR addrEnd) |
|
STATIC UINT32 | OsLmsCheckAddr (UINTPTR addr) |
|
STATIC INLINE UINT32 | OsLmsCheckAddrRegion (UINTPTR addr, UINT32 size) |
|
VOID | OsLmsPrintPoolListInfo (VOID) |
|
VOID | OsLmsPrintMemInfo (UINTPTR addr) |
|
STATIC VOID | OsLmsGetErrorInfo (UINTPTR addr, UINT32 size, LmsAddrInfo *info) |
|
STATIC VOID | OsLmsPrintErrInfo (LmsAddrInfo *info, UINT32 errMod) |
|
VOID | OsLmsReportError (UINTPTR p, UINT32 size, UINT32 errMod) |
|
VOID | __asan_store1_noabort (UINTPTR p) |
|
VOID | __asan_store2_noabort (UINTPTR p) |
|
VOID | __asan_store4_noabort (UINTPTR p) |
|
VOID | __asan_store8_noabort (UINTPTR p) |
|
VOID | __asan_store16_noabort (UINTPTR p) |
|
VOID | __asan_storeN_noabort (UINTPTR p, UINT32 size) |
|
VOID | __asan_load1_noabort (UINTPTR p) |
|
VOID | __asan_load2_noabort (UINTPTR p) |
|
VOID | __asan_load4_noabort (UINTPTR p) |
|
VOID | __asan_load8_noabort (UINTPTR p) |
|
VOID | __asan_load16_noabort (UINTPTR p) |
|
VOID | __asan_loadN_noabort (UINTPTR p, UINT32 size) |
|
VOID | __asan_handle_no_return (VOID) |
|
| LOS_MODULE_INIT (OsLmsInit, LOS_INIT_LEVEL_KMOD_PREVM) |
|
检测内存主文件
基本概念
LMS全称为Lite Memory Sanitizer,是一种实时检测内存操作合法性的调测工具。LMS能够实时检测缓冲区溢出(buffer overflow),
释放后使用(use after free) 和重复释放(double Free), 在异常发生的第一时间通知操作系统,结合backtrace等定位手段,
能准确定位到产生内存问题的代码行,极大提升内存问题定位效率。
OpenHarmony LiteOS-M内核的LMS模块提供下面几种功能:
支持多内存池检测。
支持LOS_MemAlloc、LOS_MemAllocAlign、LOS_MemRealloc申请出的内存检测。
支持安全函数的访问检测(默认开启)。
支持libc 高频函数的访问检测,包括:memset、memcpy、memmove、strcat、strcpy、strncat、strncpy。
运行机制
LMS使用影子内存映射标记系统内存的状态,一共可标记为三个状态:可读写,不可读写,已释放。影子内存存放在内存池的尾部。
内存从堆上申请后,会将数据区的影子内存设置为“可读写”状态,并将头结点区的影子内存设置为“不可读写”状态。
内存在堆上被释放时,会将被释放内存的影子内存设置为“已释放”状态。
编译代码时,会在代码中的读写指令前插入检测函数,对地址的合法性进行检验。主要是检测访问内存的影子内存的状态值,
若检测到影子内存为不可读写,则会报溢出错误;若检测到影子内存为已释放,则会报释放后使用错误。
在内存释放时,会检测被释放地址的影子内存状态值,若检测到影子内存非可读写,则会报重复释放错误。
- 版本
- 作者
- weharmonyos.com | 鸿蒙研究站 | 每天死磕一点点
- 日期
- 2022-03-22
在文件 los_lms.c 中定义.