1.概述
环境变量在操作系统中扮演着重要的角色,它提供了一种机制来存储和传递关于系统环境的关键信息。
- 简化程序配置:
- 环境变量允许程序在运行时访问必要的配置信息,而无需将这些信息硬编码到程序代码中。
- 通过环境变量,可以轻松地更改配置而不必重新编译程序。
- 资源定位:
- 环境变量可以帮助程序找到所需的文件或资源的位置,比如配置文件、库文件或数据文件。
- 例如,
PATH
环境变量告诉系统去哪里查找可执行文件。
- 提高可移植性:
- 环境变量使得程序可以在不同的环境中使用相同的配置逻辑,而不需要修改程序本身。
- 这样可以更容易地将程序部署到不同的系统上。
- 增加安全性:
- 敏感信息(如密码或API密钥)可以通过环境变量传递给程序,而不是直接写入源代码,从而增加了安全性。
- 在多用户环境中,环境变量可以限制敏感信息的暴露范围。
- 跨程序共享信息:
- 不同的应用程序可以通过环境变量来共享配置信息,而不需要额外的通信机制。
- 例如,邮件客户端可以通过环境变量来确定用户的邮件目录。
- 方便系统管理:
- 系统管理员可以通过设置环境变量来调整系统行为,例如设置默认的语言环境或临时文件夹的位置。
- 支持多用户环境:
- 环境变量可以区分不同用户的个性化设置,例如每个用户的主目录或临时文件夹。
- 易于调试和维护:
- 通过更改环境变量,可以快速测试不同的配置选项,而不需要重新编译或重新部署程序。
设置和获取环境变量可以通过编程接口(API)和命令行工具(Shell 命令)来实现。
2.设计
2.1 设计目标:
- 内核态管理一个表,可以称为系统级的环境目标。
- 环境变量接口:getenv、putenv、setenv、unsetenv。
- shell命令查询所有内核态的环境变量。
2.2 设计实现:
environ
的结构:
- 一级指针 (
char **
):environ
是一个指向字符指针数组的指针。这意味着它实际上是指向一个数组的指针,而数组中的每个元素本身也是一个指针。 - 二级指针 (
char *
):数组中的每个元素都是一个char *
类型的指针,指向一个字符串(环境变量名和值的组合)。 - 字符串 (
char
):每个char *
指向的字符串是由等号 (=
) 分隔的环境变量名和值。例如"PATH=/usr/local/bin:/usr/bin"
。
假设 environ
包含了以下环境变量:
"HOME=/home/user"
"PATH=/usr/local/bin:/usr/bin"
"LANG=en_US.UTF-8"
environ
的内部结构看起来像这样:
+----------------+-------------------+----------------------+NULL
2| environ[0] | environ[1] | environ[2] |
3| -> "HOME=/home/| -> "PATH=/usr/loc| -> "LANG=en_US.UTF-8|
4| user" | al/bin:/usr/bin" | " |
5+----------------+-------------------+----------------------+NULL
资源保护:
使用自旋锁,保护的内容就是environ
。因为处理保护的资源占用时间很短,因此选择自旋锁,而不是互斥锁,以减少不必要的上下文切换和调度延迟。
资源分配:
realloc
是 C 语言标准库中的一个函数,用于改变已分配内存块的大小。它的主要作用是在不丢失原有数据的情况下调整内存块的大小,这对于动态调整数组或其他数据结构的大小非常有用。
入参检查:支持
错误码设置:支持
environ
:内核态下全局环境变量,不对TCB结构体作更改。
3.API和CMD
在 C 语言中,我们可以使用标准库中的函数来设置和获取环境变量。如:getenv、putenv、setenv、unsetsenv。
使用printenv
命令来显示环境变量的值。例如,要获取名为 MY_VARIABLE
的环境变量的值:
printenv MY_VARIABLE
使用 export
命令来设置环境变量。例如,要设置名为 MY_VARIABLE
的环境变量:
export MY_VARIABLE=example
4.源码路径
源码放在:
libc\musl\arm64\kernel\src\env
头文件:
stdlib.h本身有声明,如下:
char *getenv (const char *);
int setenv (const char *, const char *, int);
int unsetenv (const char *);
int putenv (char *);
5.参考
主要参考:zephyr、musl、nuttx
5.1 zephyr
environ
:全局环境变量
资源保护:自旋锁
5.2 musl
environ
:全局环境变量
资源保护:没有
5.3 nuttx
environ
:私有环境变量,这时需要保存在tcb中:
struct task_group_s *group;
#ifndef CONFIG_DISABLE_ENVIRON
/* Environment variables **************************************************/
FAR char **tg_envp; /* Allocated environment strings */
ssize_t tg_envc; /* Number of environment strings */
#endif
资源保护:关调度