【Linux】环境变量和程序地址空间

发布时间:2026/9/28 9:40:43

【Linux】环境变量和程序地址空间 个人主页道尔柯南❄专栏传送门《C语言》《C》《Linux操作系统》昙花一现却等待了整个白昼蝉鸣一夏却蛰伏了好几个四季。文章目录1-环境变量1.1 环境变量的基本概念1.2 常见环境变量1.3 查看环境变量方法1.4 和环境变量相关的命令1.5 环境变量的组织方式2-程序地址空间2.1 虚拟地址2.2 进程地址空间2.3 虚拟内存管理2.4 为什么要有虚拟地址空间结尾1-环境变量1.1 环境变量的基本概念环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有某些特殊用途还有在系统当中通常具有全局特性。如我们在编写C/C代码的时候在链接的时候从来不知道我们的所链接的动态静态库在哪里但是照样可以链接成功生成可执行程序原因就是有相关环境变量帮助编译器进行查找。1.2 常见环境变量PATH指定命令的搜索路径HOME指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)SHELL当前Shell,它的值通常是/bin/bash。1.3 查看环境变量方法echo $NAME//NAME:你的环境变量名称1.4 和环境变量相关的命令echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量set: 显示本地定义的shell变量和环境变量1.5 环境变量的组织方式每个程序都会收到一张环境表环境表是一个字符指针数组每个指针指向一个以‘\0’结尾的环境字符串2-程序地址空间2.1 虚拟地址我相信在学习C语言的时候大家都见过下面这个图------程序地址空间但其实它的真实名字是进程地址空间或虚拟地址空间。上图中有4GB,则地址个数为32位机器—2^32个地址64位机器—2^64个地址在此我先提出一个问题程序地址空间是物理内存吗答案不是为啥呢请往下看#includestdio.h#includeunistd.h#includestdlib.hintg_val0;intmain(){pid_tidfork();if(id0){perror(fork);return0;}elseif(id0)//child{printf(child[%d]: %d : %p\n,getpid(),g_val,g_val);}else//parent{printf(parent[%d]: %d : %p\n,getpid(),g_val,g_val);}sleep(1);return0;}上述代码的输出结果是parent[2995]:0:0x80497d8child[2996]:0:0x80497d8这个结果就和我们预想的结果一样输出的变量值和地址是一模一样的因为子进程按照父进程为模板父子并没有对变量进行任何修改。可我们对代码稍加改动#includestdio.h#includeunistd.h#includestdlib.hintg_val0;intmain(){pid_tidfork();if(id0){perror(fork);return0;}elseif(id0)//child{g_val100;printf(child[%d]: %d : %p\n,getpid(),g_val,g_val);}else//parent{sleep(3);printf(parent[%d]: %d : %p\n,getpid(),g_val,g_val);}sleep(1);return0;}输出结果为parent[3046]:100:0x80497d8child[3045]:0:0x80497d8我们发现父子进程输出地址是一致的但是变量内容不一样能得出如下结论变量内容不一样,所以父子进程输出的变量绝对不是同一个变量但地址值是一样的说明该地址绝对不是物理地址在Linux地址下这种地址叫做虚拟地址我们在用C/C语言所看到的地址全部都是虚拟地址物理地址用户一概看不到由OS统一管理OS必须负责将虚拟地址转化成物理地址。2.2 进程地址空间上面的图就说明同一个变量地址相同其实是虚拟地址相同内容不同其实是被映射到了不同的物理地址2.3 虚拟内存管理描述linux下进程的地址空间的所有的信息的结构体是 mm_struct内存描述符。每个进程只有一个mm_struct结构在每个进程的 task_struct 结构中有一个指向该进程的mm_struct结构体指针。可以说mm_struct 结构是对整个用户空间的描述。每一个进程都会有自己独立的 mm_struct这样每一个进程都会有自己独立的地址空间才能互不干扰。先来看看由 task_struct 到 mm_struct进程的地址空间的分布情况那既然每一个进程都会有自己独立的 mm_struct操作系统肯定是要将这么多进程的 mm_struct 组织起来的虚拟空间的组织方式有两种①当虚拟区较少时采取单链表由 mmap 指针指向这个链表②当虚拟区间多时采取红黑树进行管理由 mm_rb 指向这棵树。linux内核使用 vm_area_struct 结构来表示一个独立的虚拟内存区域(VMA)由于每个不同质的虚拟内存区域功能和内部机制都不同因此一个进程使用多个 vm_area_struct 结构来分别表示不同类型的虚拟内存区域。上面提到的两种组织方式使用的就是 vm_area_struct 结构来连接各个VMA方便进程快速访问。2.4 为什么要有虚拟地址空间这个问题其实可以转化为如果程序直接可以操作物理内存会造成什么问题在早期的计算机中要运行一个程序会把这些程序全都装入内存程序都是直接运行在内存上的也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序时操作系统是如何为这些程序分配内存的呢例如某台计算机总的内存大小是128M现在同时运行两个程序A和BA需占用内存10MB需占用内存110M。计算机在给程序分配内存时会采取这样的方法先将内存中的前10M分配给程序A接着再从内存中剩余的118M中划分出110M分配给程序B。这种分配方法可以保证程序A和程序B都能运行但是这种简单的内存分配策略问题很多。①安全风险每个进程都可以访问任意的内存空间这也就意味着任意一个进程都能够去读写系统相关内存区域如果是一个木马病毒那么他就能随意的修改内存空间让设备直接瘫痪。②地址不确定众所周知编译完成后的程序是存放在硬盘上的当运行的时候需要将程序搬到内存当中去运行如果直接使用物理地址的话我们无法确定内存现在使用到哪里了也就是说拷贝的实际内存地址每一次运行都是不确定的比如第一次执行a.out时候内存当中一个进程都没有运行所以搬迁到内存地址是0x00000000但是第二次的时候内存已经有10个进程在运行了那执行a.out的时候内存地址就不一定了③效率低下如果直接使用物理内存的话一个进程就是作为一个整体内存块操作的如果出现物理内存不够用的时候我们一般的办法是将不常用的进程拷贝到磁盘的交换分区中好腾出内存但是如果是物理地址的话就需要将整个进程一起拷走这样在内存和磁盘之间拷贝时间太长效率较低。存在这么多问题有了虚拟地址空间和分页机制就能解决了吗当然地址空间和页表是OS创建并维护的是不是也就意味着凡是想使用地址空间和页表进行映射也一定要在OS的监管之下来进行访问也顺便保护了物理内存中的所有的合法数据包括各个进程以及内核的相关有效数据因为有地址空间的存在和页表的映射的存在我们的物理内存中可以对未来的数据进行任意位置的加载物理内存的分配和进程的管理就可以做到没有关系进程管理模块和内存管理模块就完成了解耦合。因为有地址空间的存在所以我们在C、C语言上new, malloc空间的时候其实是在地址空间上申请的物理内存可以甚至一个字节都不给你。而当你真正进行对物理地址空间访问的时候才执行内存的相关管理算法帮你申请内存构建页表映射关系延迟分配这是由操作系统自动完成用户包括进程完全0感知因为页表的映射的存在程序在物理内存中理论上就可以任意位置加载。它可以将地址空间上的虚拟地址和物理地址进行映射在进程视角所有的内存分布都可以是有序的。结尾uu们本文的内容到这里就全部结束了道尔在这里再次感谢您的阅读道尔柯南C/C Linux 底层探索者 | 一个正在努力学习的技术博主【关注】跟随我一起深耕技术领域见证每一次成长。❤️【点赞】让优质内容被更多人看见让知识传递更有力量。⭐【收藏】把核心知识点存好在需要时随时查、随时用。【评论】分享你的经验或疑问评论区一起交流避坑不要忘记给博主“一键四连”哦“今日目标达成”结语希望对学习Linux相关内容的uu有所帮助不要忘记给博主“一键四连”哦
延伸阅读

更多相关文章

2026/9/28 3:30:05

收藏 | 从码农到高薪AI编排者:3个月小白也能掌握的编程新姿势!

本文阐述了程序员角色将经历从手工编码到AI辅助编程,再到AI编排的演变。AI编排者需具备需求拆解、技术选型、AI编排及结果审查能力,通过有效利用AI工具提升效率。文章以真实案例说明,掌握AI编程能显著提升薪资和职业发展。为帮助读者转型&…

2026/9/28 1:07:41

AI编程实战:从工具使用到工作流融合的开发者提效指南

最近在团队内部做技术分享,很多同事都问到一个问题:“AI工具用了不少,但感觉效率提升并不明显,代码生成后还是要花大量时间修改,文档也写得不够精准。” 这其实反映了一个普遍现象:很多开发者对AI的认知还停…

2026/9/28 9:37:34

投顾实战:五步搭建AI自动化盯盘工作台

1. 这不是又一个“AI工具测评”,而是一个投顾每天真实在用的工作台实录 我做股票投顾八年,前五年靠盯盘盯到凌晨两点,复盘靠Excel手动拉数据、截图、写总结,周末补作业是常态;后三年开始用WorkBuddy搭自己的AI工作台&…

2026/9/28 9:37:34

深度学习雷达信号分选实战:从PDW数据到CNN-LSTM模型

简介:这份资源是面向雷达信号处理与深度学习方向学习者的MATLAB源码包,聚焦雷达信号分选与识别任务,适合具备一定信号处理基础、希望用神经网络替代传统方法的研究人员与研究生参考。压缩包共7个文件,以6个m脚本和1个txt参数文件为…

2026/9/28 9:37:34

WorkBuddy AI智能体自动化办公:从零搭建工作流到Skill封装实战指南

1. 从一场线下公开课说起:为什么我要把WorkBuddy AI智能体自动化办公讲透上个月我在本地组织了一场线下公开课,主题就是WorkBuddy AI智能体自动化办公。来的人比预想的多了一倍,有做行政的、做财务的、做运营的,还有几个是自己开公…

2026/9/28 9:37:34

WorkBuddy AI智能体自动化办公实战:从入门到精通的工作流搭建指南

1. 从一场线下公开课说起:为什么我要把WorkBuddy AI智能体自动化办公讲透上个月我在本地组织了一场线下公开课,主题就是WorkBuddy AI智能体自动化办公。来的人比预想的多了一倍,有做行政的、做电商运营的、写代码的、做自媒体的,甚…

2026/9/28 9:37:34

深度学习雷达信号分选实战:从PDW序列到模型选型与避坑

简介:这份资源是面向雷达信号处理与深度学习方向学习者的MATLAB源码包,聚焦雷达信号分选与识别任务,适合具备一定MATLAB编程基础、希望将神经网络方法引入雷达信号分析的学生和研究人员。压缩包共7个文件,以6个m脚本和1个txt参数文…

2026/9/28 9:32:34

从10万Star AI Agent项目拆解:生产级软件工程实战细节

先说一段大实话:现在随便打开 GitHub,标记 AI Agent 的项目一抓一大把,但真正能到 10 万 star 这个量级的,一只手数得过来。平时大家看到的都是 star 数和 README 里的架构图,很少有人去扒开这些项目的源码和迭代记录&…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑