• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2023 Huawei Technologies Co., Ltd. All rights reserved.
3  *
4  * UniProton is licensed under Mulan PSL v2.
5  * You can use this software according to the terms and conditions of the Mulan PSL v2.
6  * You may obtain a copy of Mulan PSL v2 at:
7  *          http://license.coscl.org.cn/MulanPSL2
8  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
9  * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
10  * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
11  * See the Mulan PSL v2 for more details.
12  * Create: 2009-12-22
13  * Description: 内存基本功能对外头文件。
14  */
15 #ifndef PRT_MEM_H
16 #define PRT_MEM_H
17 
18 #include "prt_module.h"
19 #include "prt_errno.h"
20 
21 #ifdef __cplusplus
22 #if __cplusplus
23 extern "C" {
24 #endif /* __cpluscplus */
25 #endif /* __cpluscplus */
26 /*
27  * 内存错误码:动态内存释放时,发现内存越界。
28  *
29  * 值: 0x02000101
30  *
31  * 解决方案:使用时注意内存申请时大小,使用大小不要超过内存本身大小。
32  */
33 #define OS_ERRNO_MEM_OVERWRITE OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x01)
34 
35 /*
36  * 内存错误码:释放的地址为空。
37  *
38  * 值: 0x02000102
39  *
40  * 解决方案:请检查释放的内存块地址是否正确。
41  */
42 #define OS_ERRNO_MEM_FREE_ADDR_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x02)
43 
44 /*
45  * 内存错误码:内存初始化时,地址为空,初始化失败。
46  *
47  * 值: 0x02000103
48  *
49  * 解决方案: 内存初始化时,地址不能为空。
50  */
51 #define OS_ERRNO_MEM_INITADDR_ISINVALID OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x03)
52 
53 /*
54  * 内存错误码:内存申请时申请的大小太大(可能为负值)。
55  *
56  * 值: 0x02000104
57  *
58  * 解决方案: 增大分区大小,或减小要申请的内存大小。
59  */
60 #define OS_ERRNO_MEM_ALLOC_SIZETOOLARGE OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x04)
61 
62 /*
63  * 内存错误码:内存初始化时,内存分区大小非4字节对齐。
64  *
65  * 值: 0x02000105
66  *
67  * 解决方案: 内存分区大小需4字节对齐。
68  */
69 #define OS_ERRNO_MEM_INITSIZE_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x05)
70 
71 /*
72  * 内存错误码:内存初始化时,地址要4字节对齐,初始化失败。
73  *
74  * 值: 0x02000106
75  *
76  * 解决方案: 内存初始化时,地址要4字节对齐。
77  */
78 #define OS_ERRNO_MEM_INITADDR_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x06)
79 
80 /*
81  * 内存错误码:分区初始化时的分区大小太小。
82  *
83  * 值: 0x02000107
84  *
85  * 解决方案: 初始化分区大小改大。
86  */
87 #define OS_ERRNO_MEM_PTCREATE_SIZE_ISTOOSMALL OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x07)
88 
89 /*
90  * 内存错误码:分区初始化时的分区大小太大。
91  *
92  * 值: 0x02000108
93  *
94  * 解决方案: 初始化分区大小改小。
95  */
96 #define OS_ERRNO_MEM_PTCREATE_SIZE_ISTOOBIG OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x08)
97 
98 /*
99  * 内存错误码:申请的内存块大小为0。
100  *
101  * 值: 0x02000109
102  *
103  * 解决方案:请检查申请内存大小的有效性。
104  */
105 #define OS_ERRNO_MEM_ALLOC_SIZE_ZERO OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x09)
106 
107 /*
108  * 内存错误码:对齐方式不合法。
109  *
110  * 值: 0x0200010b
111  *
112  * 解决方案:请检查入参对齐方式。
113  */
114 #define OS_ERRNO_MEM_ALLOC_ALIGNPOW_INVALID OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x0a)
115 
116 /*
117  * 动态内存错误码:动态内存释放时要释放的内存块的头被破坏,或已释放。
118  *
119  * 值: 0x0200010d
120  *
121  * 解决方案: 保证对内存写操作时,不要出现写越界。
122  *
123  */
124 #define OS_ERRNO_MEM_FREE_SH_DAMAGED OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x0b)
125 
126 /*
127  * OS缺省私有FSC内存错误码:从私有FSC分区中申请内存时,找不到空闲内存,申请失败。
128  *
129  * 值: 0x0200010f
130  *
131  * 解决方案: 增大私有FSC内存分区大小。
132  */
133 #define OS_ERRNO_FSCMEM_ALLOC_NO_MEMORY OS_ERRNO_BUILD_ERROR(OS_MID_MEM, 0x0c)
134 
135 /*
136  * 系统缺省的内存分区数量。
137  */
138 #define OS_MEM_DEFAULT_PT0 0
139 #define OS_MEM_DEFAULT_PT1 1
140 #define OS_MEM_DEFAULT_PTNUM 2
141 
142 /*
143  * 缺省私有FSC内存分区。
144  */
145 #define OS_MEM_DEFAULT_FSC_PT (OS_MEM_DEFAULT_PT0)
146 
147 /*
148  * 申请的内存地址对齐标准:4/8字节对齐。
149  */
150 #define OS_MEM_ADDR_ALIGN sizeof(uintptr_t)
151 
152 /*
153  * 内存算法类型。
154  */
155 enum MemArith {
156     MEM_ARITH_FSC,          // 私有FSC算法
157     MEM_ARITH_BUTT          // 内存算法非法
158 };
159 
160 /*
161  * 内存对齐方式。
162  */
163 enum MemAlign {
164     MEM_ADDR_ALIGN_004 = 2, /* 4字节对齐 */
165     MEM_ADDR_ALIGN_008 = 3, /* 8字节对齐 */
166     MEM_ADDR_ALIGN_016 = 4, /* 16字节对齐 */
167     MEM_ADDR_ALIGN_032 = 5, /* 32字节对齐 */
168     MEM_ADDR_ALIGN_064 = 6, /* 64字节对齐 */
169     MEM_ADDR_ALIGN_128 = 7, /* 128字节对齐 */
170     MEM_ADDR_ALIGN_256 = 8, /* 256字节对齐 */
171     MEM_ADDR_ALIGN_512 = 9, /* 512字节对齐 */
172     MEM_ADDR_ALIGN_1K = 10, /* 1K字节对齐 */
173     MEM_ADDR_ALIGN_2K = 11, /* 2K字节对齐 */
174     MEM_ADDR_ALIGN_4K = 12, /* 4K字节对齐 */
175     MEM_ADDR_ALIGN_8K = 13, /* 8K字节对齐 */
176     MEM_ADDR_ALIGN_16K = 14, /* 16K字节对齐 */
177     MEM_ADDR_BUTT /* 字节对齐非法 */
178 };
179 
180 /*
181  * @brief 向已创建的指定分区申请内存。
182  *
183  * @par 描述
184  * <li>在分区号为ptNo的分区中,申请大小为size的内存。</li>
185  * @attention
186  * <ul>
187  * <li>申请内存时的分区号,根据实际创建的分区号来使用。</li>
188  * <li>调用函数后,注意判断返回的地址是否为空以避免后续访问空指针。</li>
189  * <li>对于FSC内存算法,申请到的内存首地址是按4字节对齐的 </li>
190  * <li>如果内存申请失败,返回值为NULL,而导致失败的原因将记录在错误处理空间中。</li>
191  * </ul>
192  *
193  * @param mid  [IN]  类型#U32,申请的模块号。
194  * @param ptNo [IN]  类型#U8,分区号,范围[0,#OS_MEM_MAX_PT_NUM+2)。
195  * @param size [IN]  类型#U32,申请的大小。
196  *
197  * @retval #NULL  0,申请失败。
198  * @retval #!NULL 内存首地址值。
199  * @par 依赖
200  * <ul><li>prt_mem.h:该接口声明所在的头文件。</li></ul>
201  * @see PRT_MemFree
202  */
203 extern void *PRT_MemAlloc(U32 mid, U8 ptNo, U32 size);
204 
205 /*
206  * @brief 向已创建的指定分区申请指定大小且指定对齐方式的内存块。
207  *
208  * @par 描述
209  * <li>在分区号为ptNo的分区中,申请大小为size的内存,对齐方式为alignPow。</li>
210  * @attention
211  * <ul>
212  * <li>申请内存分区时的分区号,根据实际创建的分区号来使用。</li>
213  * <li>调用函数后,注意判断返回的地址是否为空以避免后续访问空指针。</li>
214  * <li>如果内存申请失败,返回值为NULL,而导致失败的原因将记录在错误处理空间中。</li>
215  * </ul>
216  *
217  * @param mid      [IN]  类型#U32,申请的模块号。
218  * @param ptNo     [IN]  类型#U8,分区号,范围[0,#OS_MEM_MAX_PT_NUM+2)。
219  * @param size     [IN]  类型#U32,申请的大小。
220  * @param alignPow [IN]  类型#enum MemAlign,动态对齐。
221  *
222  * @retval #NULL  0,申请失败。
223  * @retval #!NULL 内存首地址值。
224  * @par 依赖
225  * <ul><li>prt_mem.h:该接口声明所在的头文件。</li></ul>
226  * @see PRT_MemFree
227  */
228 extern void *PRT_MemAllocAlign(U32 mid, U8 ptNo, U32 size, enum MemAlign alignPow);
229 
230 /*
231  * @brief 释放申请的内存。
232  *
233  * @par 描述
234  * 该接口根据内存块的地址addr,找到该内存块所属的内存分区,再根据分区号和用户使用的地址addr释放该内存。
235  * @attention
236  * <ul>
237  * <li>如果返回值不是#OS_OK,则内存不会被释放。</li>
238  * <li>被破坏的内存不能被释放。</li>
239  * <li>对于入参addr,OS已做基本校验,无法校验所有非法地址,其合法性由业务保证。</li>
240  * </ul>
241  *
242  * @param mid  [IN]  类型#U32,要释放的模块号。
243  * @param addr [IN]  类型#void *,释放的地址。
244  *
245  * @retval #OS_OK  0x00000000,内存释放成功。
246  * @retval #其它值,释放失败。
247  * @par 依赖
248  * <ul><li>prt_mem.h:该接口声明所在的头文件。</li></ul>
249  * @see PRT_MemAlloc
250  */
251 extern U32 PRT_MemFree(U32 mid, void *addr);
252 
253 #ifdef __cplusplus
254 #if __cplusplus
255 }
256 #endif /* __cpluscplus */
257 #endif /* __cpluscplus */
258 
259 #endif /* PRT_MEM_H */
260