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