address
address 提供内存地址操作与动态内存管理功能,支持物理/虚拟地址转换、IO (Input/Output) 重映射、内存池管理及用户空间与内核空间数据拷贝。
头文件清单
接口清单
| 接口名称 | 功能简述 |
|---|---|
| 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
头文件清单
功能说明
- 注册指定内存地址,用于请求指定内存
- 适用于需要使用指定内存区域的场景
- 支持 linux、liteos、freertos 系统
前置条件
- addr 参数指向的内存空间已申请成功
- 系统已初始化
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| addr | void * | 需要注册的内存块的起始地址 | 非NULL,指向有效内存地址 |
osal_kmalloc
头文件清单
功能说明
- 分配指定大小的动态内存块
- 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMIC、OSAL_GFP_DMA、OSAL_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
头文件清单
功能说明
- 分配指定大小的动态内存块,并将内存块清零
- 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMIC、OSAL_GFP_DMA、OSAL_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
头文件清单
功能说明
- 分配指定大小且起始地址按指定边界对齐的内存块
- 对齐参数值必须为2的幂次且最小值为4
- 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMIC、OSAL_GFP_DMA、OSAL_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
头文件清单
功能说明
- 分配指定大小且起始地址按指定边界对齐的内存块,并将内存块清零
- 对齐参数值必须为2的幂次且最小值为4
- 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMIC、OSAL_GFP_DMA、OSAL_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
头文件清单
功能说明
- 修改已动态分配内存的大小
- ptr 指向先前由 osal_kmalloc、osal_kzalloc 或 osal_krealloc 动态分配的内存块
- 在 linux 下需通过 osal_gfp_flag 指定内存分配类型,须包含 OSAL_GFP_ATOMIC、OSAL_GFP_DMA、OSAL_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
头文件清单
功能说明
- 释放指定的动态内存
- 调用后更新模块内存使用统计
- 支持 linux、liteos、freertos 系统
前置条件
- addr 指向先前由 osal_kmalloc、osal_kzalloc、osal_kmalloc_align、osal_kzalloc_align 或 osal_krealloc 动态分配的内存块
- 同一内存块只能释放一次
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| addr | void * | 需要释放的内存块的起始地址 | 非NULL,由先前动态分配获得 |
osal_vmalloc
头文件清单
功能说明
- 分配虚拟地址连续的内存空间
- 适用于需要大块连续虚拟内存的场景
- 支持 linux、liteos、freertos 系统
前置条件
- size 参数值需大于 0
- 调用前系统内存管理已初始化
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| size | unsigned long | 需要分配的内存字节数 | 大于0 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 分配成功,返回指向虚拟内存的指针 | 内存分配成功 |
| NULL | 分配失败 | 内存不足 |
osal_vzalloc
头文件清单
功能说明
- 分配虚拟地址连续的内存空间,并将内存空间清零
- 适用于需要大块连续虚拟内存且需要初始化为零的场景
- 支持 linux、liteos、freertos 系统
前置条件
- size 参数值需大于 0
- 调用前系统内存管理已初始化
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| size | unsigned long | 需要分配的内存字节数 | 大于0 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 分配成功,返回指向虚拟内存的指针 | 内存分配成功 |
| NULL | 分配失败 | 内存不足 |
osal_vfree
头文件清单
功能说明
- 释放由 osal_vmalloc 或 osal_vzalloc 分配的虚拟连续内存
- 支持 linux、liteos、freertos 系统
前置条件
- addr 指向先前由 osal_vmalloc 或 osal_vzalloc 分配的虚拟内存
- 同一内存块只能释放一次
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| addr | void * | 需要释放的内存块的起始地址 | 非NULL,由 osal_vmalloc 或 osal_vzalloc 分配获得 |
osal_pool_mem_init
头文件清单
功能说明
- 初始化双链表的动态内存池
- 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
头文件清单
功能说明
- 扩展初始化双链表的动态内存池,支持指定内存属性
- 参数输入必须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
头文件清单
功能说明
- 从指定内存池中分配指定大小的内存块,并更新模块内存使用统计
- 输入的 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
头文件清单
功能说明
- 从指定内存池中分配指定大小且起始地址按指定边界对齐的内存块,并更新模块内存使用统计
- 输入的 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
头文件清单
功能说明
- 释放指定内存池中已分配的动态内存
- 输入的 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
头文件清单
功能说明
- 去初始化双链表的动态内存
- 支持 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
头文件清单
功能说明
- 获取块内存状态
- 根据物理地址和大小判断块内存的有效性
- 支持 linux 系统
前置条件
- phyaddr 参数须为有效的物理地址
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| phyaddr | unsigned long | 物理地址 | 有效的物理地址 |
| size | unsigned int | 待操作的地址大小 | 大于0 |
返回值
- 返回类型:osal_blockmem_status
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| OSAL_BLOCKMEM_VALID(0) | 块内存有效 | 物理地址和大小均有效 |
| OSAL_BLOCKMEM_INVALID_PHYADDR(1) | 物理地址无效 | 物理地址无效 |
| OSAL_BLOCKMEM_INVALID_SIZE(2) | 大小无效 | 大小无效 |
osal_ioremap
头文件清单
功能说明
- 将设备内存映射到CPU空间,映射类型为设备内存且不使用缓存
- 适用于访问设备寄存器等场景
- 支持 linux、liteos 系统
前置条件
- phys_addr 参数须为有效的总线地址
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| phys_addr | unsigned long | 内存的总线地址 | 有效的总线地址 |
| size | unsigned long | 待映射的资源大小 | 大于0 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 映射成功,返回映射到的虚拟地址 | 映射成功 |
| NULL | 映射失败 | 映射失败 |
osal_ioremap_nocache
头文件清单
功能说明
- 将总线内存映射到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
头文件清单
功能说明
- 将设备内存映射到CPU空间,映射类型为普通内存且使用缓存
- 使用缓存可加速内存访问,提升系统性能
- 支持 linux、liteos 系统
前置条件
- phys_addr 参数须为有效的总线地址
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| phys_addr | unsigned long | 内存的总线地址 | 有效的总线地址 |
| size | unsigned long | 待映射的资源大小 | 大于0 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 映射成功,返回映射到的虚拟地址 | 映射成功 |
| NULL | 映射失败 | 映射失败 |
osal_iounmap
头文件清单
功能说明
- 释放IO重映射
- 支持 linux、liteos、freertos 系统
前置条件
- addr 参数须为先前 ioremap_* 系列函数返回的虚拟地址
- 同一指针只进行一次取消映射
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| addr | void * | 来自 ioremap_* 的虚拟地址 | 非NULL,由 ioremap_* 系列函数返回 |
| size | unsigned long | 待映射的资源大小 | 大于0 |
osal_ioremap_wc
头文件清单
功能说明
- 将内存映射到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
头文件清单
功能说明
- 将物理地址转换为虚拟地址
- 适用于需要通过物理地址访问内存的场景
- 支持 linux、liteos、freertos 系统
前置条件
- addr 参数须为有效的物理地址
- 物理地址与虚拟地址映射关系已建立
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| addr | unsigned long | 物理地址 | 有效的物理地址 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 转换成功,返回映射到的虚拟地址 | 地址转换成功 |
| NULL | 转换失败 | 地址转换失败 |
osal_virt_to_phys
头文件清单
功能说明
- 将虚拟地址转换为物理地址
- 支持 linux、liteos 系统
前置条件
- virt_addr 参数须为有效的虚拟地址
- 虚拟地址与物理地址映射关系已建立
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| virt_addr | const void * | 虚拟地址 | 有效的虚拟地址 |
返回值
- 返回类型:unsigned long
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非零值 | 转换成功,返回物理地址 | 地址转换成功 |
| 0 | 转换失败 | 地址转换失败 |
osal_blockmem_vmap
头文件清单
功能说明
- 将物理地址映射到连续的内核虚拟空间
- 仅支持 VM_MAP 与 PAGE_KERNEL 标志
- 支持 linux 系统
前置条件
- phys_addr 参数须为有效的物理地址
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| phys_addr | unsigned long | 物理地址 | 有效的物理地址 |
| size | unsigned long | 待操作的地址大小 | 大于0 |
返回值
- 返回类型:void *
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 非NULL指针 | 映射成功,返回虚拟地址 | 映射成功 |
| NULL | 映射失败 | 映射失败 |
osal_blockmem_vunmap
头文件清单
功能说明
- 释放由 osal_blockmem_vmap 创建的虚拟连续内存区域
- 支持 linux 系统
前置条件
- virt_addr 参数须为先前 osal_blockmem_vmap 返回的虚拟地址
- 调用上下文约束:禁止在中断上下文中调用
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| virt_addr | const void * | 虚拟地址 | 非NULL,由 osal_blockmem_vmap 返回 |
osal_blockmem_free
头文件清单
功能说明
- 释放已在产品中定义的预留内存
- 支持 linux 系统
前置条件
- phys_addr 参数须为有效的物理地址
- size 参数须大于 0
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| phys_addr | unsigned long | 物理地址 | 有效的物理地址 |
| size | unsigned long | 待操作的地址大小 | 大于0 |
osal_copy_from_user
头文件清单
功能说明
- 从用户空间拷贝数据到内核空间
- 支持 linux、liteos、freertos 系统
前置条件
- to 参数指向的内核空间已申请成功,长度不小于 n
- from 参数指向的用户空间内存可读
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| from | const void * | 待拷贝数据的用户空间地址 | 非NULL,可读 |
| n | unsigned long | 待拷贝的数据长度(单位:字节) | 大于0 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| to | void * | 拷贝完成后,内核地址中存储从用户空间拷贝的数据 |
返回值
- 返回类型:unsigned long
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 拷贝成功 | 数据全部拷贝完成 |
| 非零值 | 未拷贝的字节数 | 部分数据拷贝失败 |
osal_copy_to_user
头文件清单
功能说明
- 从内核空间拷贝数据到用户空间
- 支持 linux、liteos、freertos 系统
前置条件
- to 参数指向的用户空间内存可写,长度不小于 n
- from 参数指向的内核空间内存可读
入参
| 名称 | 参数类型 | 详细说明 | 约束取值范围 |
|---|---|---|---|
| from | const void * | 待拷贝数据的内核空间地址 | 非NULL,可读 |
| n | unsigned long | 待拷贝的数据长度(单位:字节) | 大于0 |
出参
| 名称 | 数据类型 | 输出说明 |
|---|---|---|
| to | void * | 拷贝完成后,用户空间地址中存储从内核空间拷贝的数据 |
返回值
- 返回类型:unsigned long
| 返回值 | 文字含义 | 触发场景 |
|---|---|---|
| 0 | 拷贝成功 | 数据全部拷贝完成 |
| 非零值 | 未拷贝的字节数 | 部分数据拷贝失败 |
osal_access_ok
头文件清单
功能说明
- 检查用户空间内存块是否可用
- 根据访问类型验证用户空间地址的合法性
- 支持 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 | 枚举边界值 |