36、【OS】【Nuttx】OSTest分析(2):环境变量测试
背景
2025.1.29 蛇年快乐!
接之前wiki
35、【OS】【Nuttx】OSTest分析(1):stdio测试(五)
已经分析完了第一个测试项,输入输出端口测试,接下来分析下环境变量测试,也比较简单
测试内容
主要测试设置环境变量和获取环境变量的接口是否正常,在软件工程里面,很多功能,模块提供的无非也是读和写,设置和获取,输入和输出等等
测试内容虽然简单,但仍有几个关键点值得注意:
- 嵌入式实时操作系统(RTOS)如 Nuttx,环境变量的管理方式与传统桌面或服务器OS有所不同。NuttX 是一个微内核架构的OS,资源非常有限(与桌面或服务器OS相比),特别注重资源隔离和任务独立性。因此,环境变量通常不是全局共享的,而是通过任务组管理。
- 环境变量的内存管理策略,也是通过内存动态分配和预分配策略实现(之前wiki 31、【OS】【Nuttx】OSTest分析(1):stdio测试(一) 有简单分析文件系统内存分配)
- 环境变量可以为任务组中的任务成员提供资源共享能力,在任务运行中起作用,生命周期仅限于任务的执行期间,任务结束后,这些变量通常会被释放
- 环境变量管理的是较小字符串(通常几十个字节到几百个字节不等)
接口分析
来看测试的主要几个接口
- putenv:主要是对 setenv 的封装,这里不分析
- setenv:设置环境变量,下面分析
- show_environment:主要通过 getenv 获取环境变量,下面会分析 getenv
setenv 接口:
来分析下 setenv 的三个成员:
- name:环境变量名,字符串
- value:环境变量值,字符串,最后存储字符串 “name=value”
- overwrite:是否覆盖原来的值,非零值为覆盖,0为不覆盖(目前没看到overwrite=0的用法)
在修改环境变量前,先进入临界区,防止修改冲突;然后取出当前任务所在分组,对当前任务分组的私有环境变量进行修改
给当前修改的环境变量申请内存(需要多两个字节,‘=’,‘\0’),使用 group_malloc 进行内存分配,下面来看下 group_malloc 定义
当定义配置项 CONFIG_MM_KERNEL_HEAP 之后,可开启内存组管理模块,管理模块会将任务组按权限进行分类,其中内核任务为高权限任务组,用户任务为低权限任务组
Nuttx 将根据用户组类型选择合适的内存分配函数:
kmm_malloc:kernel memory management
kumm_malloc:user memory management
因为没有开启内存组管理模块,更详细的内存分配细节这里先不分析,主要是针对Nuttx中的特定堆进行内存管理,允许更细粒度的控制和多个独立的内存区域
在 sim 环境中,这里使用的是普通的 malloc 函数,malloc 适用于一般的应用程序开发,在不需要特别复杂的内存管理策略时使用,比如内存管够的 sim 环境
接下来可以看到环境变量内存的预分配策略,SCHED_ENVIRON_RESERVED 用于预留一定数量的环境变量槽位,确保系统有足够的空间来存储关键的环境变量,预留槽位可以防止动态分配内存时出现频繁的重新分配和拷贝操作,以提高性能并减少内存碎片。另外,这里会额外预留两个槽位,一个用于存储新的环境变量(name=value),另一个用于终止符(通常是 NULL),以标记环境变量数组的结束
最终字符串会以(name=value)形式,存入任务组中的环境变量数组中,最后一个元素为终止符NULL
下面来看 getenv 接口,返回值为环境变量的值,类型也为字符串。
需要注意的是,这里返回的直接是环境变量存储的位置,而不是一个拷贝副本,这意味着如果用户拿到这个指针后,如果修改其内容,将直接修改环境变量的值,因此返回值标注了(Read-only),提醒用户不应该去修改其内容
测试结果
- putenv 设置 Variable1 = BadValue3,此时 Variable1 为 BadValue3
- setenv 设置 Variable1 = GoodValue1,由于 Overwrite 为 True,此时 Variable1 被重置 GoodValue1
- setenv 设置 Variable2 = BadValue1,即使此时 Overwrite 为 False,但由于是初次设置,故 Variable2 为 BadValue1
- setenv 设置 Variable2 = GoodValue2,由于 Overwrite 为 True,此时 Variable2 被重置为 GoodValue2
- setenv 设置 Variable3 = GoodValue3,即使此时 Overwrite 为 False,但由于是初次设置,故 Variable3 为 GoodValue3
- setenv 设置 Variable3 = BadValue2,由于 Overwrite 为 False,此时 Variable3 保持原来的值 GoodValue3 不变