插件窝 干货文章 Linux环境变量&&进程地址空间详解

Linux环境变量&&进程地址空间详解

变量 环境 地址 进程 905    来源:    2025-04-01

Linux环境变量与进程地址空间详解

一、Linux环境变量

1. 环境变量基本概念

环境变量是操作系统中用来指定操作系统运行环境的一些参数,具有全局性特性。在Linux中,环境变量决定了shell和其他程序的行为。

2. 常见环境变量

  • PATH:指定命令的搜索路径
  • HOME:当前用户的主目录
  • USER:当前登录的用户名
  • SHELL:当前使用的shell程序路径
  • LANG:语言相关的环境变量
  • PWD:当前工作目录

3. 环境变量操作命令

# 查看所有环境变量
env
printenv

# 查看特定环境变量
echo $PATH

# 设置环境变量(当前会话有效)
export MY_VAR="value"

# 设置永久环境变量(添加到~/.bashrc或/etc/profile)
echo 'export MY_VAR="value"' >> ~/.bashrc
source ~/.bashrc

# 删除环境变量
unset MY_VAR

4. 环境变量配置文件加载顺序

  1. /etc/profile - 系统全局环境变量
  2. /etc/profile.d/*.sh - 系统脚本目录
  3. ~/.bash_profile - 用户级环境变量
  4. ~/.bashrc - 用户级shell配置
  5. ~/.bash_logout - 退出shell时执行

二、进程地址空间

1. 进程地址空间概述

在Linux中,每个进程都有自己独立的虚拟地址空间,32位系统通常为4GB(0x00000000-0xFFFFFFFF),64位系统则大得多。

2. 典型Linux进程地址空间布局

高地址
+---------------------+
| 内核空间            | (1GB for 32-bit with 3/1 split)
+---------------------+
| 栈(stack)           | (向下增长)
+---------------------+
| 共享库映射区         |
+---------------------+
| 堆(heap)            | (向上增长)
+---------------------+
| 未初始化数据段(.bss) |
+---------------------+
| 已初始化数据段(.data)|
+---------------------+
| 代码段(.text)        |
+---------------------+
低地址

3. 各内存段详解

  1. 代码段(.text)

    • 存放可执行指令
    • 只读属性
    • 可共享(多个进程可共享同一代码段)
  2. 数据段

    • 已初始化数据(.data):存放显式初始化的全局/静态变量
    • 未初始化数据(.bss):存放未初始化的全局/静态变量
  3. 堆(heap)

    • 动态内存分配区域(malloc/new)
    • 向高地址增长
    • 需要手动管理(分配/释放)
  4. 栈(stack)

    • 存放局部变量、函数参数、返回地址等
    • 向低地址增长
    • 自动管理(函数调用时分配,返回时释放)
  5. 共享库映射区

    • 存放动态链接库(.so文件)
    • 使用mmap系统调用映射
  6. 内核空间

    • 用户进程不可直接访问
    • 存放内核代码和数据结构

4. 相关系统调用和命令

// 内存分配
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>

5. 地址空间随机化(ASLR)

现代Linux系统默认启用的安全特性,使进程的栈、堆和共享库的加载地址随机化,增加攻击难度。

# 查看ASLR设置
cat /proc/sys/kernel/randomize_va_space
# 0 - 关闭
# 1 - 部分随机化(栈、共享库)
# 2 - 完全随机化(还包括堆)

三、环境变量与进程地址空间的关系

  1. 环境变量存储在进程地址空间的栈区上方
  2. 程序启动时,系统会将环境变量复制到新进程的地址空间中
  3. 通过environ全局变量或main函数的第三个参数可以访问环境变量
// 访问环境变量的方式
extern char **environ;  // 方法1

int main(int argc, char *argv[], char *envp[]) {  // 方法2
    // envp就是环境变量指针数组
}

理解环境变量和进程地址空间对于Linux系统编程、安全研究和性能优化都有重要意义。