跳转至

address

address 提供内存地址操作与动态内存管理功能,支持物理/虚拟地址转换、IO (Input/Output) 重映射、内存池管理及用户空间与内核空间数据拷贝。

头文件清单

#include "include/osal/memory/osal_addr.h"

接口清单

接口名称 功能简述
osal_mem_specified_addr_register 注册指定内存地址
osal_kmalloc 分配动态内存
osal_kzalloc 分配动态内存并清零
osal_kmalloc_align 分配对齐动态内存
osal_kzalloc_align 分配对齐动态内存并清零
osal_krealloc 重新分配动态内存
osal_kfree 释放动态内存
osal_vmalloc 分配虚拟连续内存
osal_vzalloc 分配虚拟连续内存并清零
osal_vfree 释放虚拟连续内存
osal_pool_mem_init 初始化内存池
osal_pool_mem_init_ext 初始化内存池(带属性配置)
osal_pool_mem_alloc 从内存池分配内存
osal_pool_mem_alloc_align 从内存池分配对齐内存
osal_pool_mem_free 释放内存池中的内存
osal_pool_mem_deinit 去初始化内存池
osal_blockmem_get_status 获取块内存状态
osal_ioremap 将总线内存映射到CPU空间
osal_ioremap_nocache 将总线内存映射到CPU空间(非缓存)
osal_ioremap_cached 将总线内存映射到CPU空间(缓存)
osal_iounmap 释放IO重映射
osal_ioremap_wc 将内存映射到CPU空间(写合并)
osal_phys_to_virt 物理地址转虚拟地址
osal_virt_to_phys 虚拟地址转物理地址
osal_blockmem_vmap 将物理地址映射到连续内核虚拟空间
osal_blockmem_vunmap 释放虚拟连续内存区域
osal_blockmem_free 释放预留内存
osal_copy_from_user 从用户空间拷贝数据到内核空间
osal_copy_to_user 从内核空间拷贝数据到用户空间
osal_access_ok 检查用户空间内存块是否可用

Functions

osal_mem_specified_addr_register

void osal_mem_specified_addr_register(void *addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 注册指定内存地址,用于请求指定内存
  • 适用于需要使用指定内存区域的场景
  • 支持 linux、liteos、freertos 系统

前置条件

  • addr 参数指向的内存空间已申请成功
  • 系统已初始化

入参

名称 参数类型 详细说明 约束取值范围
addr void * 需要注册的内存块的起始地址 非NULL,指向有效内存地址

osal_kmalloc

void *osal_kmalloc(unsigned long size, unsigned int osal_gfp_flag)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配指定大小的动态内存块
  • 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMICOSAL_GFP_DMAOSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO 使内存清零
  • 在 liteos 和 freertos 下 osal_gfp_flag 参数不生效
  • 支持 linux、liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • 调用前系统内存管理已初始化

入参

名称 参数类型 详细说明 约束取值范围
size unsigned long 需要分配的内存字节数 大于0
osal_gfp_flag unsigned int 内存分配类型标志 linux下须包含 OSAL_GFP_ATOMIC/OSAL_GFP_DMA/OSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO;liteos/freertos下不生效

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配内存块的指针 内存分配成功
NULL 分配失败 内存不足或参数非法

osal_kzalloc

void *osal_kzalloc(unsigned long size, unsigned int osal_gfp_flag)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配指定大小的动态内存块,并将内存块清零
  • 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMICOSAL_GFP_DMAOSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO 使内存清零
  • 在 liteos 和 freertos 下 osal_gfp_flag 参数不生效
  • 支持 linux、liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • 调用前系统内存管理已初始化

入参

名称 参数类型 详细说明 约束取值范围
size unsigned long 需要分配的内存字节数 大于0
osal_gfp_flag unsigned int 内存分配类型标志 linux下须包含 OSAL_GFP_ATOMIC/OSAL_GFP_DMA/OSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO;liteos/freertos下不生效

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配内存块的指针 内存分配成功
NULL 分配失败 内存不足或参数非法

osal_kmalloc_align

void *osal_kmalloc_align(unsigned int size, unsigned int osal_gfp_flag, unsigned int boundary)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配指定大小且起始地址按指定边界对齐的内存块
  • 对齐参数值必须为2的幂次且最小值为4
  • 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMICOSAL_GFP_DMAOSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO
  • 在 liteos 和 freertos 下 osal_gfp_flag 参数不生效
  • 支持 liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • boundary 参数值必须为2的幂次且最小值为4

入参

名称 参数类型 详细说明 约束取值范围
size unsigned int 需要分配的内存字节数 大于0
osal_gfp_flag unsigned int 内存分配类型标志 linux下须包含 OSAL_GFP_ATOMIC/OSAL_GFP_DMA/OSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO;liteos/freertos下不生效
boundary unsigned int 内存对齐边界(单位:字节) 2的幂次,最小值4

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配对齐内存块的指针 内存分配成功
NULL 分配失败 内存不足或参数非法

osal_kzalloc_align

void *osal_kzalloc_align(unsigned int size, unsigned int osal_gfp_flag, unsigned int boundary)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配指定大小且起始地址按指定边界对齐的内存块,并将内存块清零
  • 对齐参数值必须为2的幂次且最小值为4
  • 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMICOSAL_GFP_DMAOSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO
  • 在 liteos 和 freertos 下 osal_gfp_flag 参数不生效
  • 支持 liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • boundary 参数值必须为2的幂次且最小值为4

入参

名称 参数类型 详细说明 约束取值范围
size unsigned int 需要分配的内存字节数 大于0
osal_gfp_flag unsigned int 内存分配类型标志 linux下须包含 OSAL_GFP_ATOMIC/OSAL_GFP_DMA/OSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO;liteos/freertos下不生效
boundary unsigned int 内存对齐边界(单位:字节) 2的幂次,最小值4

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配对齐内存块的指针 内存分配成功
NULL 分配失败 内存不足或参数非法

osal_krealloc

void *osal_krealloc(void *ptr, unsigned long size, unsigned int osal_gfp_flag)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 修改已动态分配内存的大小
  • ptr 指向先前由 osal_kmalloc、osal_kzalloc 或 osal_krealloc 动态分配的内存块
  • 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMICOSAL_GFP_DMAOSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO
  • 在 liteos 和 freertos 下 osal_gfp_flag 参数不生效
  • 支持 linux、liteos、freertos 系统

前置条件

  • ptr 指向先前由 osal_kmalloc、osal_kzalloc 或 osal_krealloc 动态分配的内存块
  • size 参数值需大于 0

入参

名称 参数类型 详细说明 约束取值范围
ptr void * 指向需要重新分配的内存块 非NULL,由先前动态分配获得
size unsigned long 需要分配的内存字节数 大于0
osal_gfp_flag unsigned int 内存分配类型标志 linux下须包含 OSAL_GFP_ATOMIC/OSAL_GFP_DMA/OSAL_GFP_KERNEL 之一,可按位或 OSAL_GFP_ZERO;liteos/freertos下不生效

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 重新分配成功,返回指向新内存块的指针 内存重新分配成功
NULL 重新分配失败 内存不足或参数非法

osal_kfree

void osal_kfree(void *addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放指定的动态内存
  • 调用后更新模块内存使用统计
  • 支持 linux、liteos、freertos 系统

前置条件

  • addr 指向先前由 osal_kmalloc、osal_kzalloc、osal_kmalloc_align、osal_kzalloc_align 或 osal_krealloc 动态分配的内存块
  • 同一内存块只能释放一次

入参

名称 参数类型 详细说明 约束取值范围
addr void * 需要释放的内存块的起始地址 非NULL,由先前动态分配获得

osal_vmalloc

void *osal_vmalloc(unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配虚拟地址连续的内存空间
  • 适用于需要大块连续虚拟内存的场景
  • 支持 linux、liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • 调用前系统内存管理已初始化

入参

名称 参数类型 详细说明 约束取值范围
size unsigned long 需要分配的内存字节数 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向虚拟内存的指针 内存分配成功
NULL 分配失败 内存不足

osal_vzalloc

void *osal_vzalloc(unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 分配虚拟地址连续的内存空间,并将内存空间清零
  • 适用于需要大块连续虚拟内存且需要初始化为零的场景
  • 支持 linux、liteos、freertos 系统

前置条件

  • size 参数值需大于 0
  • 调用前系统内存管理已初始化

入参

名称 参数类型 详细说明 约束取值范围
size unsigned long 需要分配的内存字节数 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向虚拟内存的指针 内存分配成功
NULL 分配失败 内存不足

osal_vfree

void osal_vfree(void *addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放由 osal_vmalloc 或 osal_vzalloc 分配的虚拟连续内存
  • 支持 linux、liteos、freertos 系统

前置条件

  • addr 指向先前由 osal_vmalloc 或 osal_vzalloc 分配的虚拟内存
  • 同一内存块只能释放一次

入参

名称 参数类型 详细说明 约束取值范围
addr void * 需要释放的内存块的起始地址 非NULL,由 osal_vmalloc 或 osal_vzalloc 分配获得

osal_pool_mem_init

int osal_pool_mem_init(void *pool, unsigned int size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 初始化双链表的动态内存池
  • LiteOS 启动时需调用此接口初始化动态内存
  • 参数输入必须4或8字节对齐
  • 初始化区域 [pool, pool + size] 不应与其他内存池冲突
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • size 参数值须小于或等于内存池大小
  • size 参数值须大于各系统 min_pool_size
  • 参数输入必须4或8字节对齐
  • 初始化区域 [pool, pool + size] 不应与其他内存池冲突

入参

名称 参数类型 详细说明 约束取值范围
pool void * 内存起始地址 非NULL,4或8字节对齐
size unsigned int 内存大小 大于系统min_pool_size,小于等于内存池大小

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 初始化成功 内存池初始化成功
OSAL_FAILURE(-1) 初始化失败 内存池初始化失败

osal_pool_mem_init_ext

int osal_pool_mem_init_ext(void *pool, unsigned int size, unsigned int attr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 扩展初始化双链表的动态内存池,支持指定内存属性
  • 参数输入必须4或8字节对齐
  • 初始化区域 [pool, pool + size] 不应与其他内存池冲突
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • size 参数值须小于或等于内存池大小
  • size 参数值须大于各系统 min_pool_size
  • 参数输入必须4或8字节对齐
  • 初始化区域 [pool, pool + size] 不应与其他内存池冲突

入参

名称 参数类型 详细说明 约束取值范围
pool void * 内存起始地址 非NULL,4或8字节对齐
size unsigned int 内存大小 大于系统min_pool_size,小于等于内存池大小
attr unsigned int 内存属性 如 LOS_MEM_INIT_ATTR_SLAB_MSK

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 初始化成功 内存池初始化成功
OSAL_FAILURE(-1) 初始化失败 内存池初始化失败

osal_pool_mem_alloc

void *osal_pool_mem_alloc(void *pool, unsigned int size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 从指定内存池中分配指定大小的内存块,并更新模块内存使用统计
  • 输入的 pool 参数必须通过 osal_pool_mem_init 初始化
  • 输入的 size 参数不能大于 osal_pool_mem_init 时指定的内存池大小
  • 输入的 size 参数必须4字节对齐
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • pool 参数必须通过 osal_pool_mem_init 初始化
  • size 参数不能大于内存池初始化时指定的大小
  • size 参数必须4字节对齐

入参

名称 参数类型 详细说明 约束取值范围
pool void * 指向包含待分配内存块的内存池 非NULL,已通过 osal_pool_mem_init 初始化
size unsigned int 待分配的内存块大小(单位:字节) 4字节对齐,不大于内存池大小

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配内存块的指针 内存分配成功
NULL 内存分配失败 内存不足或参数非法

osal_pool_mem_alloc_align

void *osal_pool_mem_alloc_align(void *pool, unsigned int size, unsigned int boundary)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 从指定内存池中分配指定大小且起始地址按指定边界对齐的内存块,并更新模块内存使用统计
  • 输入的 pool 参数必须通过 osal_pool_mem_init 初始化
  • 对齐参数值必须为2的幂次且最小值为4
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • pool 参数必须通过 osal_pool_mem_init 初始化
  • size 参数不能大于内存池初始化时指定的大小
  • boundary 参数必须为2的幂次且最小值为4

入参

名称 参数类型 详细说明 约束取值范围
pool void * 指向包含待分配内存块的内存池 非NULL,已通过 osal_pool_mem_init 初始化
size unsigned int 待分配的内存块大小(单位:字节) 不大于内存池大小
boundary unsigned int 内存对齐边界(单位:字节) 2的幂次,最小值4

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 分配成功,返回指向已分配对齐内存块的指针 内存分配成功
NULL 内存分配失败 内存不足或参数非法

osal_pool_mem_free

void osal_pool_mem_free(void *pool, const void *addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放指定内存池中已分配的动态内存
  • 输入的 pool 参数必须通过 osal_pool_mem_init 初始化
  • 输入的 addr 参数必须由 osal_pool_mem_alloc 或 osal_pool_mem_alloc_align 分配
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • pool 参数必须通过 osal_pool_mem_init 初始化
  • addr 参数必须由 osal_pool_mem_alloc 或 osal_pool_mem_alloc_align 分配获得

入参

名称 参数类型 详细说明 约束取值范围
pool void * 指向包含待释放内存块的内存池 非NULL,已通过 osal_pool_mem_init 初始化
addr const void * 待释放的内存块的起始地址 非NULL,由 osal_pool_mem_alloc 或 osal_pool_mem_alloc_align 分配获得

osal_pool_mem_deinit

int osal_pool_mem_deinit(void *pool)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 去初始化双链表的动态内存
  • 支持 liteos、seliteos、freertos 系统

前置条件

  • pool 参数必须通过 osal_pool_mem_init 初始化
  • 内存池中所有已分配的内存块已释放

入参

名称 参数类型 详细说明 约束取值范围
pool void * 内存起始地址 非NULL,已通过 osal_pool_mem_init 初始化

返回值

  • 返回类型:int
返回值 文字含义 触发场景
OSAL_SUCCESS(0) 去初始化成功 动态内存去初始化成功
OSAL_FAILURE(-1) 去初始化失败 动态内存去初始化失败

osal_blockmem_get_status

osal_blockmem_status osal_blockmem_get_status(unsigned long phyaddr, unsigned int size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 获取块内存状态
  • 根据物理地址和大小判断块内存的有效性
  • 支持 linux 系统

前置条件

  • phyaddr 参数须为有效的物理地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phyaddr unsigned long 物理地址 有效的物理地址
size unsigned int 待操作的地址大小 大于0

返回值

返回值 文字含义 触发场景
OSAL_BLOCKMEM_VALID(0) 块内存有效 物理地址和大小均有效
OSAL_BLOCKMEM_INVALID_PHYADDR(1) 物理地址无效 物理地址无效
OSAL_BLOCKMEM_INVALID_SIZE(2) 大小无效 大小无效

osal_ioremap

void *osal_ioremap(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将设备内存映射到CPU空间,映射类型为设备内存且不使用缓存
  • 适用于访问设备寄存器等场景
  • 支持 linux、liteos 系统

前置条件

  • phys_addr 参数须为有效的总线地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 内存的总线地址 有效的总线地址
size unsigned long 待映射的资源大小 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 映射成功,返回映射到的虚拟地址 映射成功
NULL 映射失败 映射失败

osal_ioremap_nocache

void *osal_ioremap_nocache(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将总线内存映射到CPU空间,功能与 osal_ioremap 相同,保留用于向后兼容
  • 映射后须使用 osal_iounmap 释放
  • 支持 linux、liteos、freertos 系统

前置条件

  • phys_addr 参数须为有效的总线地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 内存的总线地址 有效的总线地址
size unsigned long 待映射的资源大小 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 映射成功,返回映射到的虚拟地址 映射成功
NULL 映射失败 映射失败

osal_ioremap_cached

void *osal_ioremap_cached(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将设备内存映射到CPU空间,映射类型为普通内存且使用缓存
  • 使用缓存可加速内存访问,提升系统性能
  • 支持 linux、liteos 系统

前置条件

  • phys_addr 参数须为有效的总线地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 内存的总线地址 有效的总线地址
size unsigned long 待映射的资源大小 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 映射成功,返回映射到的虚拟地址 映射成功
NULL 映射失败 映射失败

osal_iounmap

void osal_iounmap(void *addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放IO重映射
  • 支持 linux、liteos、freertos 系统

前置条件

  • addr 参数须为先前 ioremap_* 系列函数返回的虚拟地址
  • 同一指针只进行一次取消映射
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
addr void * 来自 ioremap_* 的虚拟地址 非NULL,由 ioremap_* 系列函数返回
size unsigned long 待映射的资源大小 大于0

osal_ioremap_wc

void *osal_ioremap_wc(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将内存映射到CPU空间,使用写合并(write combined)模式
  • 映射后须使用 osal_iounmap 释放
  • 支持 linux、liteos 系统

前置条件

  • phys_addr 参数须为有效的总线地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 内存的总线地址 有效的总线地址
size unsigned long 待映射的资源大小 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 映射成功,返回映射到的虚拟地址 映射成功
NULL 映射失败 映射失败

osal_phys_to_virt

void *osal_phys_to_virt(unsigned long addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将物理地址转换为虚拟地址
  • 适用于需要通过物理地址访问内存的场景
  • 支持 linux、liteos、freertos 系统

前置条件

  • addr 参数须为有效的物理地址
  • 物理地址与虚拟地址映射关系已建立

入参

名称 参数类型 详细说明 约束取值范围
addr unsigned long 物理地址 有效的物理地址

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 转换成功,返回映射到的虚拟地址 地址转换成功
NULL 转换失败 地址转换失败

osal_virt_to_phys

unsigned long osal_virt_to_phys(const void *virt_addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将虚拟地址转换为物理地址
  • 支持 linux、liteos 系统

前置条件

  • virt_addr 参数须为有效的虚拟地址
  • 虚拟地址与物理地址映射关系已建立

入参

名称 参数类型 详细说明 约束取值范围
virt_addr const void * 虚拟地址 有效的虚拟地址

返回值

  • 返回类型:unsigned long
返回值 文字含义 触发场景
非零值 转换成功,返回物理地址 地址转换成功
0 转换失败 地址转换失败

osal_blockmem_vmap

void *osal_blockmem_vmap(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 将物理地址映射到连续的内核虚拟空间
  • 仅支持 VM_MAP 与 PAGE_KERNEL 标志
  • 支持 linux 系统

前置条件

  • phys_addr 参数须为有效的物理地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 物理地址 有效的物理地址
size unsigned long 待操作的地址大小 大于0

返回值

  • 返回类型:void *
返回值 文字含义 触发场景
非NULL指针 映射成功,返回虚拟地址 映射成功
NULL 映射失败 映射失败

osal_blockmem_vunmap

void osal_blockmem_vunmap(const void *virt_addr)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放由 osal_blockmem_vmap 创建的虚拟连续内存区域
  • 支持 linux 系统

前置条件

  • virt_addr 参数须为先前 osal_blockmem_vmap 返回的虚拟地址
  • 调用上下文约束:禁止在中断上下文中调用

入参

名称 参数类型 详细说明 约束取值范围
virt_addr const void * 虚拟地址 非NULL,由 osal_blockmem_vmap 返回

osal_blockmem_free

void osal_blockmem_free(unsigned long phys_addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 释放已在产品中定义的预留内存
  • 支持 linux 系统

前置条件

  • phys_addr 参数须为有效的物理地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
phys_addr unsigned long 物理地址 有效的物理地址
size unsigned long 待操作的地址大小 大于0

osal_copy_from_user

unsigned long osal_copy_from_user(void *to, const void *from, unsigned long n)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 从用户空间拷贝数据到内核空间
  • 支持 linux、liteos、freertos 系统

前置条件

  • to 参数指向的内核空间已申请成功,长度不小于 n
  • from 参数指向的用户空间内存可读

入参

名称 参数类型 详细说明 约束取值范围
from const void * 待拷贝数据的用户空间地址 非NULL,可读
n unsigned long 待拷贝的数据长度(单位:字节) 大于0

出参

名称 数据类型 输出说明
to void * 拷贝完成后,内核地址中存储从用户空间拷贝的数据

返回值

  • 返回类型:unsigned long
返回值 文字含义 触发场景
0 拷贝成功 数据全部拷贝完成
非零值 未拷贝的字节数 部分数据拷贝失败

osal_copy_to_user

unsigned long osal_copy_to_user(void *to, const void *from, unsigned long n)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 从内核空间拷贝数据到用户空间
  • 支持 linux、liteos、freertos 系统

前置条件

  • to 参数指向的用户空间内存可写,长度不小于 n
  • from 参数指向的内核空间内存可读

入参

名称 参数类型 详细说明 约束取值范围
from const void * 待拷贝数据的内核空间地址 非NULL,可读
n unsigned long 待拷贝的数据长度(单位:字节) 大于0

出参

名称 数据类型 输出说明
to void * 拷贝完成后,用户空间地址中存储从内核空间拷贝的数据

返回值

  • 返回类型:unsigned long
返回值 文字含义 触发场景
0 拷贝成功 数据全部拷贝完成
非零值 未拷贝的字节数 部分数据拷贝失败

osal_access_ok

int osal_access_ok(int type, const void *addr, unsigned long size)

头文件清单

#include "include/osal/memory/osal_addr.h"

功能说明

  • 检查用户空间内存块是否可用
  • 根据访问类型验证用户空间地址的合法性
  • 支持 linux、liteos 系统

前置条件

  • addr 参数须指向用户空间地址
  • size 参数须大于 0

入参

名称 参数类型 详细说明 约束取值范围
type int 访问类型 OSAL_VERIFY_READ(0) / OSAL_VERIFY_WRITE(1)
addr const void * 指向待检查的用户空间内存块起始地址 非NULL,用户空间地址
size unsigned long 待检查的内存块大小 大于0

返回值

  • 返回类型:int
返回值 文字含义 触发场景
true(非0) 用户空间内存块可用 地址验证通过
false(0) 用户空间内存块不可用 地址验证失败

Enumerations

osal_blockmem_status

typedef enum {
    OSAL_BLOCKMEM_VALID = 0,
    OSAL_BLOCKMEM_INVALID_PHYADDR = 1,
    OSAL_BLOCKMEM_INVALID_SIZE = 2,
    OSAL_BLOCKMEM_MAX,
} osal_blockmem_status;
枚举成员 取值 描述
OSAL_BLOCKMEM_VALID 0 块内存有效
OSAL_BLOCKMEM_INVALID_PHYADDR 1 物理地址无效
OSAL_BLOCKMEM_INVALID_SIZE 2 大小无效
OSAL_BLOCKMEM_MAX 3 枚举边界值

Macros

OSAL_GFP_ZERO

#define OSAL_GFP_ZERO (0x1)

OSAL_GFP_ATOMIC

#define OSAL_GFP_ATOMIC (0x1 << 1)

OSAL_GFP_DMA

#define OSAL_GFP_DMA (0x1 << 2)

OSAL_GFP_KERNEL

#define OSAL_GFP_KERNEL (0x1 << 3)

OSAL_VERIFY_READ

#define OSAL_VERIFY_READ 0

OSAL_VERIFY_WRITE

#define OSAL_VERIFY_WRITE 1

OSAL_SUCCESS

#define OSAL_SUCCESS 0

OSAL_FAILURE

#define OSAL_FAILURE (-1)