linux学习笔记04

举报
qingchuan666 发表于 2025/07/25 12:10:15 2025/07/25
【摘要】 1.环境变量 1.1命令行参数main函数的命令行参数就是为了实现程序的不同的子功能;类似于在linux下面的这个指令的选项,通过不同的选项实现不同的功能;在我们的这个main函数里面,也就是我们学习这个C语言的时候撰写的这个第一个程序,int main()这个main函数里面实际上也是存在着这个命令行参数的,也就是argc和argv,后面的这个事数组,前面的这个是我们的程序的命令行参数的...

1.环境变量

1.1命令行参数

main函数的命令行参数就是为了实现程序的不同的子功能;

类似于在linux下面的这个指令的选项,通过不同的选项实现不同的功能;

在我们的这个main函数里面,也就是我们学习这个C语言的时候撰写的这个第一个程序,int main()这个main函数里面实际上也是存在着这个命令行参数的,也就是argc和argv,后面的这个事数组,前面的这个是我们的程序的命令行参数的个数;

image-20250707135729973

1.2浅谈环境变量

环境变量最开始在我们的这个配置文件里面,是从系统的配置文件里面来的;

登录的时候bash读取配置文件,形成环境变量表,把配置文件里面的内容放到这个环境变量表里面,用输入的指令也会在这个bash里面形成命令行参数表

命令行参数表随着我们的这个指令的输入不断的变化,但是这个环境变量表比较稳定;

export在bash的环境变量表里面添加新的环境变量;

父进程的环境变量可以被子进程继承,因此我们的这个环境变量具有全局的属性,这样我们的这个子进程可以根据继承得到的这个环境变量,进行定制化的操作;

我们可以使用系统调用getenv获取环境变量的内容;

本地变量不会被子进程继承,只会被我们的bash内部使用;

2.程序地址空间

2.1进程地址空间的引入

下面的这个图可能我们是非常熟悉的了,其实这个就是程序地址空间,或者说是进程地址空间,也叫做虚拟地址空间,并不是我们真正的这个物理意义上面的内存,而是虚拟的;

image-20250709204608032

2.2虚拟地址的验证

下面的这个实际上是一个程序,就是想说明这个事虚拟地址,因为这个第二列里面的地址也就是&gval是完全一致的,但是这个父进程和子进程的数值是不一样的,父进程是100,子进程的这个数据是变化的;

如果这个事物理地址,不可能出现这么玄学的情况,因此这个就是虚拟地址;

image-20250709205023953

2.3虚拟地址物理地址转换

虚拟地址和物理地址的转换主要是通过页表进行的(计算机组成原理,操作系统里面都会接触这些概念的);

每一个进程都有属于自己的这个虚拟地址空间,每一个进程都有自己的页表;

image-20250709211108885

当我们的这个子进程想要对于这个数据进行修改的时候,会把这个物理地址内存里面的数据拷贝一份新的,让我们的这个子进程进行修改,这个拷贝的动作是操作系统做的;

这个实际上就是我们介绍的写实拷贝;

实际上我们的这个子进程的地址空间,页表都是拷贝的我们的父进程的,指向的这个区域都是和我们的父进程指向的是一样的区域;

image-20250709215448046

2.4为什么需要虚拟地址

我们想要进行这个物理地址的访问的时候,本来我们是可以直接进行这个物理地址的访问的,但是现在因为这个虚拟地址的存在,导致我们现在必须要经过这个虚拟地址和物理地址的转换,经过页表,现在反而多走了一步,这个是为什么了,难道我们直接一步到位不好么?

不知道大家有没有这个疑问,下面我们通过一个案例说明一下这个虚拟地址存在的必要性;

实际上就是你本来的压岁钱,可以直接去买一些自己喜欢的,但是后来你的妈妈发现了这个你老是去买一些辣条,很有添加剂的垃圾食品,于是你的妈妈介入,对于你的这个压岁钱进行管理,你想要使用这个零花钱的时候,就去请示你的母亲,但是当你想要买辣条的时候,你的母亲直接拒绝,说这个东西对于你的身体健康有害,因此不同意你的这个请求;

可以见得,你本来可以直接使用你的零花钱的,但是你的母亲介入使得需要对于你的这个请求进行检查;

虚拟地址也是类似的道理,如果你直接对于这个物理地址进行访问,可能会存在无法预料到的问题,例如这个权限之类的,但是虚拟地址的介入相当于是对于这个想要访问的地址进行检查,看看这个合法性之类的,以及这个权限是否满足,也就是对于我们的这个物理地址进行保护;

还有一点:地址空间存在可以帮助我们的进程管理和内存IO管理解耦合,不让他们之间的这个耦合性过强;

即使是malloc不连续的这个区域,我们的这个操作系统会使用一个list对于这些不连续的空间进行管理;

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。