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

浏览源代码.

函数

VOID OsMemUsedNodeShow (VOID *pool)
 打印已使用的节点 更多...
 
UINT32 OsMemSystemInit (UINTPTR memStart)
 
STATUS_T OsKHeapInit (size_t size)
 内核空间动态内存(堆内存)初始化 , 争取系统动态内存池 更多...
 
VOID OsDumpMemByte (size_t length, UINTPTR addr)
 
VOID OsMemResetEndNode (VOID *pool, UINTPTR preAddr)
 
UINT32 OsMemLargeNodeFree (const VOID *ptr)
 大内存释放 更多...
 
BOOL OsMemIsHeapNode (const VOID *ptr)
 
UINT32 OsShellCmdMemCheck (INT32 argc, const CHAR *argv[])
 

函数说明

◆ OsDumpMemByte()

VOID OsDumpMemByte ( size_t  length,
UINTPTR  addr 
)

在文件 mempt_shellcmd.c53 行定义.

54{
55 size_t dataLen;
56 UINTPTR *alignAddr = NULL;
57 UINT32 count = 0;
58
59 dataLen = ALIGN(length, sizeof(UINTPTR));
60 alignAddr = (UINTPTR *)TRUNCATE(addr, sizeof(UINTPTR));
61 if ((dataLen == 0) || (alignAddr == NULL)) {
62 return;
63 }
64 while (dataLen) {
65 if (IS_ALIGNED(count, sizeof(CHAR *))) {
66 PRINTK("\n 0x%lx :", alignAddr);
67#ifdef LOSCFG_SAVE_EXCINFO
68 WriteExcInfoToBuf("\n 0x%lx :", alignAddr);
69#endif
70 }
71#ifdef __LP64__
72 PRINTK("%0+16lx ", *alignAddr);
73#else
74 PRINTK("%0+8lx ", *alignAddr);
75#endif
76#ifdef LOSCFG_SAVE_EXCINFO
77#ifdef __LP64__
78 WriteExcInfoToBuf("0x%0+16x ", *alignAddr);
79#else
80 WriteExcInfoToBuf("0x%0+8x ", *alignAddr);
81#endif
82#endif
83 alignAddr++;
84 dataLen -= sizeof(CHAR *);
85 count++;
86 }
87 PRINTK("\n");
88#ifdef LOSCFG_SAVE_EXCINFO
90#endif
91
92 return;
93}
VOID WriteExcInfoToBuf(const CHAR *format,...)
写异常信息到系统异常信息中心
Definition: los_excinfo.c:114
unsigned long UINTPTR
Definition: los_typedef.h:68
unsigned int UINT32
Definition: los_typedef.h:57
char CHAR
Definition: los_typedef.h:63
函数调用图:
这是这个函数的调用关系图:

◆ OsKHeapInit()

STATUS_T OsKHeapInit ( size_t  size)

内核空间动态内存(堆内存)初始化 , 争取系统动态内存池

判断地址是否在堆区

在文件 los_memory.c2095 行定义.

函数调用图:
这是这个函数的调用关系图:

◆ OsMemIsHeapNode()

BOOL OsMemIsHeapNode ( const VOID *  ptr)

在文件 los_memory.c2126 行定义.

2127{
2128 struct OsMemPoolHead *pool = (struct OsMemPoolHead *)m_aucSysMem1;//内核堆区开始地址
2129 struct OsMemNodeHead *firstNode = OS_MEM_FIRST_NODE(pool);//获取内存池首个节点
2130 struct OsMemNodeHead *endNode = OS_MEM_END_NODE(pool, pool->info.totalSize);//获取内存池的尾节点
2131
2132 if (OS_MEM_MIDDLE_ADDR(firstNode, ptr, endNode)) {//如果在首尾范围内
2133 return TRUE;
2134 }
2135
2136#if OS_MEM_EXPAND_ENABLE//内存池经过扩展后,新旧块的虚拟地址是不连续的,所以需要跳块判断
2137 UINT32 intSave;
2138 UINT32 size;//详细查看百篇博客系列篇之 鸿蒙内核源码分析(内存池篇)
2139 MEM_LOCK(pool, intSave); //获取自旋锁
2140 while (OsMemIsLastSentinelNode(endNode) == FALSE) { //哨兵节点是内存池结束的标记
2141 size = OS_MEM_NODE_GET_SIZE(endNode->sizeAndFlag);//获取节点大小
2142 firstNode = OsMemSentinelNodeGet(endNode);//获取下一块的开始地址
2143 endNode = OS_MEM_END_NODE(firstNode, size);//获取下一块的尾节点
2144 if (OS_MEM_MIDDLE_ADDR(firstNode, ptr, endNode)) {//判断地址是否在该块中
2145 MEM_UNLOCK(pool, intSave);
2146 return TRUE;
2147 }
2148 }
2149 MEM_UNLOCK(pool, intSave);
2150#endif
2151 return FALSE;
2152}
UINT8 * m_aucSysMem1
系统动态内存池地址的起始地址 @note_thinking 能否不要用 0,1来命名核心变量 ???
Definition: los_memory.c:108
STATIC INLINE BOOL OsMemIsLastSentinelNode(struct OsMemNodeHead *sentinelNode)
是否为最后一个哨兵节点
Definition: los_memory.c:327
STATIC INLINE VOID * OsMemSentinelNodeGet(struct OsMemNodeHead *node)
Definition: los_memory.c:354
内存池节点
Definition: los_memory.c:169
union OsMemNodeHead::@5 ptr
UINT32 sizeAndFlag
节点总大小+标签
Definition: los_memory.c:178
内存池头信息
Definition: los_memory.c:204
struct OsMemPoolInfo info
记录内存池的信息
Definition: los_memory.c:205
UINT32 totalSize
总大小,确定了内存池的边界
Definition: los_memory.c:196
函数调用图:
这是这个函数的调用关系图:

◆ OsMemLargeNodeFree()

UINT32 OsMemLargeNodeFree ( const VOID *  ptr)

大内存释放

在文件 los_memory.c382 行定义.

383{
384 LosVmPage *page = OsVmVaddrToPage((VOID *)ptr);//获取物理页
385 if ((page == NULL) || (page->nPages == 0)) {
386 return LOS_NOK;
387 }
388 LOS_PhysPagesFreeContiguous((VOID *)ptr, page->nPages);//释放连续的几个物理页
389
390 return LOS_OK;
391}
VOID LOS_PhysPagesFreeContiguous(VOID *ptr, size_t nPages)
释放指定页数地址连续的物理内存
Definition: los_vm_phys.c:494
LosVmPage * OsVmVaddrToPage(VOID *ptr)
通过虚拟地址找映射的物理页框
Definition: los_vm_phys.c:295
物理页框描述符 虚拟内存体现的是程序对内存资源的需求,而物理内存是对该请求的供应。 伙伴算法的思想是:把内存中连续的空闲页框空间看成是空闲页框块,并按照它们的大小(连续页框的数目)分组
Definition: los_vm_page.h:53
UINT16 nPages
Definition: los_vm_page.h:61
函数调用图:
这是这个函数的调用关系图:

◆ OsMemResetEndNode()

VOID OsMemResetEndNode ( VOID *  pool,
UINTPTR  preAddr 
)

◆ OsMemSystemInit()

UINT32 OsMemSystemInit ( UINTPTR  memStart)

◆ OsMemUsedNodeShow()

VOID OsMemUsedNodeShow ( VOID *  pool)

打印已使用的节点

在文件 los_memory.c601 行定义.

602{
603 if (pool == NULL) {
604 PRINTK("input param is NULL\n");
605 return;
606 }
607 if (LOS_MemIntegrityCheck(pool)) {
608 PRINTK("LOS_MemIntegrityCheck error\n");
609 return;
610 }
611 struct OsMemPoolHead *poolInfo = (struct OsMemPoolHead *)pool;
612 struct OsMemNodeHead *tmpNode = NULL;
613 struct OsMemNodeHead *endNode = NULL;
614 UINT32 size;
615 UINT32 intSave;
616 UINT32 count;
617
618#ifdef __LP64__
619 PRINTK("\n\rnode ");
620#else
621 PRINTK("\n\rnode ");
622#endif
623 for (count = 0; count < LOS_RECORD_LR_CNT; count++) {
624#ifdef __LP64__
625 PRINTK(" LR[%u] ", count);
626#else
627 PRINTK(" LR[%u] ", count);
628#endif
629 }
630 PRINTK("\n");
631
632 MEM_LOCK(poolInfo, intSave);
633 endNode = OS_MEM_END_NODE(pool, poolInfo->info.totalSize);
634#if OS_MEM_EXPAND_ENABLE
635 for (tmpNode = OS_MEM_FIRST_NODE(pool); tmpNode <= endNode;
636 tmpNode = OS_MEM_NEXT_NODE(tmpNode)) {
637 if (tmpNode == endNode) {
638 if (OsMemIsLastSentinelNode(endNode) == FALSE) {
639 size = OS_MEM_NODE_GET_SIZE(endNode->sizeAndFlag);
640 tmpNode = OsMemSentinelNodeGet(endNode);
641 endNode = OS_MEM_END_NODE(tmpNode, size);
642 continue;
643 } else {
644 break;
645 }
646 } else {
647 OsMemUsedNodePrint(tmpNode);
648 }
649 }
650#else
651 for (tmpNode = OS_MEM_FIRST_NODE(pool); tmpNode < endNode;
652 tmpNode = OS_MEM_NEXT_NODE(tmpNode)) {
653 OsMemUsedNodePrint(tmpNode);
654 }
655#endif
656 MEM_UNLOCK(poolInfo, intSave);
657}
UINT32 LOS_MemIntegrityCheck(const VOID *pool)
对指定内存池做完整性检查
Definition: los_memory.c:1903
STATIC INLINE VOID OsMemUsedNodePrint(struct OsMemNodeHead *node)
Definition: los_memory.c:580
函数调用图:
这是这个函数的调用关系图:

◆ OsShellCmdMemCheck()

UINT32 OsShellCmdMemCheck ( INT32  argc,
const CHAR argv[] 
)

在文件 mempt_shellcmd.c95 行定义.

96{
97 if (argc > 0) {
98 PRINTK("\nUsage: memcheck\n");
99 return OS_ERROR;
100 }
101
102 if (LOS_MemIntegrityCheck(m_aucSysMem1) == LOS_OK) {
103 PRINTK("system memcheck over, all passed!\n");
104#ifdef LOSCFG_SAVE_EXCINFO
105 WriteExcInfoToBuf("system memcheck over, all passed!\n");
106#endif
107 }
108
109 return 0;
110}
函数调用图:
这是这个函数的调用关系图: