环境变量是操作系统中用来指定操作系统运行环境的一些参数,具有全局性特性。在Linux中,环境变量决定了shell和其他程序的行为。
PATH
:指定命令的搜索路径HOME
:当前用户的主目录USER
:当前登录的用户名SHELL
:当前使用的shell程序路径LANG
:语言相关的环境变量PWD
:当前工作目录# 查看所有环境变量
env
printenv
# 查看特定环境变量
echo $PATH
# 设置环境变量(当前会话有效)
export MY_VAR="value"
# 设置永久环境变量(添加到~/.bashrc或/etc/profile)
echo 'export MY_VAR="value"' >> ~/.bashrc
source ~/.bashrc
# 删除环境变量
unset MY_VAR
/etc/profile
- 系统全局环境变量/etc/profile.d/*.sh
- 系统脚本目录~/.bash_profile
- 用户级环境变量~/.bashrc
- 用户级shell配置~/.bash_logout
- 退出shell时执行在Linux中,每个进程都有自己独立的虚拟地址空间,32位系统通常为4GB(0x00000000-0xFFFFFFFF),64位系统则大得多。
高地址
+---------------------+
| 内核空间 | (1GB for 32-bit with 3/1 split)
+---------------------+
| 栈(stack) | (向下增长)
+---------------------+
| 共享库映射区 |
+---------------------+
| 堆(heap) | (向上增长)
+---------------------+
| 未初始化数据段(.bss) |
+---------------------+
| 已初始化数据段(.data)|
+---------------------+
| 代码段(.text) |
+---------------------+
低地址
代码段(.text)
数据段
堆(heap)
栈(stack)
共享库映射区
内核空间
// 内存分配
void *malloc(size_t size);
void free(void *ptr);
// 内存映射
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
int munmap(void *addr, size_t length);
// 查看进程内存映射
cat /proc/<pid>/maps
pmap <pid>
现代Linux系统默认启用的安全特性,使进程的栈、堆和共享库的加载地址随机化,增加攻击难度。
# 查看ASLR设置
cat /proc/sys/kernel/randomize_va_space
# 0 - 关闭
# 1 - 部分随机化(栈、共享库)
# 2 - 完全随机化(还包括堆)
environ
全局变量或main
函数的第三个参数可以访问环境变量// 访问环境变量的方式
extern char **environ; // 方法1
int main(int argc, char *argv[], char *envp[]) { // 方法2
// envp就是环境变量指针数组
}
理解环境变量和进程地址空间对于Linux系统编程、安全研究和性能优化都有重要意义。