Linux——环境变量虚拟地址空间

Posted 一棵灬胡杨树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux——环境变量虚拟地址空间相关的知识,希望对你有一定的参考价值。

文章目录


一、环境变量

环境变量是在操作系统中用来指定操作系统运行环境的参数

Notes:环境变量在系统中通常具有全局特性。

1.1 常见的环境变量

  1. PATH:指定命令的搜索路径。

  1. HOME:用户的工作目录。(说白了就是用户登陆到Linux系统中默认的目录)
  2. SHELL:SHELL的值通常就是/bin/bash。

1.2 与环境变量相关的命令

  1. echo:显示某个环境变量的值

  2. export:设置一个环境变量
    临时生效:
    export [环境变量名]=$[环境变量名]:/你的路径

    我们首先vim一个.c文件,接着gcc一个main可执行文件,当我们执行main的时候,就会显示如上结果。为了让main指令可以正常运行,我们用export将main的环境变量加入到PATH里,入下图所示:

    永久生效:
    通常我们在linux低下coding的时候,我们会安装一个叫vimcpp的玩意(这玩意就让我们编程更加丝滑),在安装的过程中,执行最后一步的时候会执行一个命令叫做:“source ~/.bashrc”。为什么呢要执行这玩意呢?因为" ~/.bashrc"是一个环境变量文件,我们用source + " ~/.bashrc"让系统重新读一遍文件的内容。下面我们来看看这个环境变量文件里面到底有什么

    我们可以看到这个文件里面最后一行第一个单词"export",熟悉不熟悉!所以如果我们想让它永久生效,我们就把export这个命令写在文件里面。

  3. env:显示所有的环境变量

  4. unset:清除环境变量

  5. set:显示本地定义的shell变量和环境变量

1.3 环境变量的组织方式


上面main函数中有3个参数分别代表:命令行参数的个数、命令行参数的值、环境变量。

其中第三个参数env其实就是一个指针数组,如下图所示:

每一个程序都会收到一张环境表,环境表是一个字符指针数组,每一个指针都指向一个以\\0结尾的环境字符串。

二、虚拟地址空间

在CPU设计的时候,使用了特别多的地址线,比如32位、64位、128位。但是还是无法满足CPU对大容量存储器的需求,这就需要构筑一个更大的存储空间,在实际使用的时候,还是按照主存地址访问,这大概就是虚拟地址空间存在的意义吧。

如果是64位操作系统,那么地址范围就是0~2^64,物理内存往往小于这个范围,剩下的部分就是虚拟地址空间。如上图所示。
虚拟地址空间就是对物理空间的一次扩展,这就使得了存储系统具有非常大的存储能力了。

2.2 虚拟地址空间的访问过程

当我们使用虚拟地址访问存储器的时候,系统会将虚拟地址空间映射到物理地址空间,如果虚拟地址对应的存储单元在物理地址空间里,则直接访问,称为命中。如果不在物理地址空间里,称未命中,如果未命中的话,则需要将该存储单元和附近单元的所有数据从虚拟空间调入主存,再访问存储单元。

Notes:总的来说,虚拟地址空间和物理地址空间之间的是一个映射关系。

三、虚拟地址空间的管理方式

虚拟地址空间的管理方式主要有3种:页式管理、段式管理和段页式管理。

3.1 页式管理

页式管理把虚拟内存和物理内存划分为大小固定且相等的页,大小一般为4KB~1G。在映射的过程中,虚拟地址页和物理地址页不是一一对应的,即虚拟地址可以与物理地址的任何页位置对应。虚拟地址由虚拟页号和页内地址组成,物理地址也由页号和页内地址组成。在任何一个进程的时候,一个虚拟地址都对应一个物理地址。这种把存储空间划分为页,并按照页管理的方式,称为页式管理。下图就是页式管理虚拟内存空间的映射:


页式管理的地址变换:
首先根据虚拟地址中的基号(即用户程序名)查找页表基址表,从而找到页表起始地址。如下图中的P,然后根据虚拟地址中的页号在以P为其实地址的页表中查找页起始地址,将虚拟地址中的页内地址(低段)和物理主存中的页起始地址(高段)构成物理实地址;

3.2 段式管理

在段式管理中,每一个程序模块被分配到物理内存中的某一段中。为了寻址,设定一个表格来记录每一个程序模块的信息,这个表就称为段表。段表中每一行记录一个用户程序的段号、起始地址和段长等。

在虚拟内存中,用户的程序模块或数据是以段的形式保存的,当需要运行某个程序时,首先根据段号查找段表,取出表中的段起始地址,与虚拟地址中的段内地址相结合,构成物理主存中的地址。


上图显示的是一个段表,以此构成一级段管理系统。对于一级段管理系统,用户程序的逻辑地址分为两个部分,高位是段号,地位是段内地址(也称为偏移量)。在地址变换的时候,只要根据逻辑地址的高位查表,得到实际段起始地址,在与逻辑地址中的段内地址相结合,得到实际的物理地址,如下图所示:

用户程序的逻辑地址分为3个部分,即基号、段号和段内地址。其中基号对应的是进程名,根据基号在段表基址表中查找段表起始地址,如上图的P所示。然后根据段号在以P为起始地址的段表中查找,接着取出其中的段起始地址,与逻辑地址中的段内地址相加,形成物理主存地址。

3.3 段页式管理

段页式管理是把存储器空间按照逻辑模块分段,把每一段又分成若干页。访问存储器的时候需要经过段表和若干个页来进行。这种集中了段式管理和页式管理的优点。按照段式管理容易实现数据段的保护,按照页式管理容易实现页置换。

Notes:采用段页式管理,段的大小必须是页的整数倍,且段起始地址必须是页的起始地址。

将段表和段内页表结合起来,就可以找到逻辑地址中某段某页在物理主存中对应的页,如下图所示:


段页式管理地址变换如下图所示,包括一个段表基址表,若干个段表和大量的页表。逻辑地址中的基号对应进程名,用来在段表基址表中查找段表的起始地址,如图A所示,然后在以A为起始地址的段表中按照逻辑地址中的段号查找页表的起始地址,如图P所示,最后在以P为其实地址的页表中按照逻辑地址中的页号查找页表。


当以P为起始地址的页表中查到页表时,之后取出对应物理主存中的页起始地址,与逻辑地址中的页地址相结合,构成物理主存的实地址。

以上是关于Linux——环境变量虚拟地址空间的主要内容,如果未能解决你的问题,请参考以下文章

(计算机组成原理)第三章存储系统-第七节2:页式/段式虚拟存储器

虚拟存储器

《Linux源码情景分析》--2.2地址映射的全过程

linux内存管理

《Linux从0到99》七 进程地址空间

《Linux从0到99》七 进程地址空间