menuconfig(menuconfig配置)

张工 2022-07-08 18:42:04 阅读:46
  

  本来这篇文章是前几天写的,但是老婆让我平日不要贴。大家都在上班,我没时间看你的文章。哎,可能大家都在放松心情,看头条,看小姐姐。所以一直拖到现在。周末是放松的好时候。葛优躺着刷小姐姐的时候别忘了来找我学linux。

  上一篇文章《什么是linux命令》提到linux实际上是在执行命令之前通过shell来处理命令的。Shell等待用户终端输入,根据用户输入的命令名,在环境变量PATH指定的路径中找到与命令名匹配的可执行文件,然后创建一个子进程,由linux内核调度执行,将可执行文件加载到子进程中并执行。这是一个执行命令的完整过程。当然,这里涉及的细节不是一两篇文章能说清楚的。我将在后面的不同文章中解释这些细节。shell作为用户与linux内核之间的桥梁,可以看作是linux内核与用户沟通的默认官方代理。shell有很多不同的版本,最常见的是bash shell。所以当我们提到shell的时候,默认是bash shell。如果您对这个代理不满意,您还可以更换代理。你甚至可以用python解释器或者perl解释器作为linux的外壳。但是,几乎没有人对bash shell不满,也很少有人去做。Bash作为linux的官方默认代理,是历史的约定。这只是为了让大家了解贝壳。没那么神秘。这与其他脚本解释器甚至我们输入的命令是一样的。您可以在shell中再次执行shell。只需键入:bash这样,你将进入一个新的shell。至于如何替换默认外壳,这不是本文的内容。我将在后面的另一篇文章中解释如何更改默认shell。

  让我们回到这篇文章的主题。上面提到,shell将在环境变量PATH指定的路径中查找命令。那么什么是环境变量呢?简单来说,环境变量就是用来设置linux应用程序运行环境的变量。我们经常接触到的环境变量有PATH、HOME、HISTSIZE、HOSTNAME、PS1、PS2等等。在shell命令行上,可以通过“echo $ environment variable name”打印环境变量的值,也可以通过env或export命令查看系统中现有的环境变量。环境变量配置应用层的环境,由应用层程序设置和使用。不同的应用程序将关注不同的环境变量。比如大部分时间路径只会被shell关注,我们经常配置的java环境变量会被java虚拟机关注,其他应用不会。如果您只在命令行中点击cd而没有路径名,那么cd将关注HOME环境变量并切换到HOME环境变量指定的路径,该路径是登录用户的主目录。但是cd是shell的内置命令,所以HOME主要是shell关注的。当我第一次理解环境变量时,我一直认为它们是内核的一部分。事实上,环境变量与内核没有什么关系。环境变量不用于配置linux内核。如果要配置linux内核,可以在内核编译和配置阶段通过make menuconfig进行配置,或者在内核操作阶段通过sysctl命令进行配置。

  环境变量是用来配置应用程序运行环境的变量,所以环境变量与应用程序密切相关,应用程序在运行阶段以linux进程的形式存在,每个进程都有自己的环境变量。那么这些环境变量存储在哪里呢?他们从哪里来的?

  这里我们需要从进程的虚拟地址空间布局开始。每个linux进程(shell也是linux进程)都有自己独立的进程虚拟地址空间。进程虚拟地址空间分为内核空间和用户空间。通常所有linux进程虚拟地址空间的内核空间896M以内的空间会直接线性映射到物理内存的0-896M。为什么是896M?这也是历史条件下形成的。剩余的虚拟地址空间内核将根据其分页机制被间接映射到物理内存中。这部分是linux内核的内存管理部分,本文就不深入讨论了。稍后我会花时间写一篇关于内存管理的文章。

  说环境变量,为什么会拉到进程虚拟地址空间?因为我们的环境变量是以环境变量表(数组)的形式存储在进程虚拟地址空间的用户空间中的。这也是我上面说环境变量和内核无关的原因。进程虚拟地址空间的布局如下图所示:


什么是linux环境变量


  进程虚拟空间布局

  这个进程虚拟内存布局图是我画的《linux内核原理大图》的一部分。画面还在创作中,大部分已经完成。关注这个头条,可以随时关注我的最新文章。图中深红色的缺口表示上面的内核空间和下面的用户空间。内核空间和用户空间之间有一条鸿沟。这也是内核的一种保护机制。这个内存布局图非常重要。学习linux下c/c编程的人应该很熟悉这个图,因为不管是c/c还是linux内核,原理性的东西都是围绕这个图展开的。毫不夸张的说,这张图就是开c/

c++基础编程的金钥匙。

  在用户空间的最上部,stack和gap中间,就是环境变量表所存放的位置了。我们的进程如果要想获取环境变量或者设置环境变量,都是从这个内存区域获取和设置的。该部分会通过内核分页机制映射到物理内存中。

  那么这里的环境变量又是从哪里来的呢?在《什么是linux命令》一文中,我们指出,linux运行一条命令,就会创建出一个进程,而这个进程是由shell创建的。也就是你在linux下执行的任何命令所创建的进程,都是shell的子进程。所以一个进程的环境变量,大部分都是从shell进程继承而来的。子又生孙,孙又生子,子子孙孙无穷尽也,而山不在高...

  不好意思,我学的有点杂,我们回到主题。那么shell进程的环境变量又是从哪里来的呢?我们前面说过,shell作为linux内核与用户打交道的代理人,所以要面对各型各色的人,每个人都有不同的喜好。我们上文提到,可能会有人在小角落里密谋想要替换掉bash shell,Shell为了留住大家的心,适应不同人的喜好,就允许每个用户设置自己的环境变量。所以shell的环境变量其实就是用户你(你是主角,出场要带特效)自己设置的。所以我们经常说环境变量的时候,前面总是加上shell,叫shell环境变量。每次shell启动的时候,都会读取一系列的环境配置文件。将环境配置文件中环境变量的值读到自己内存空间的位置,也就是上图所说的位置啦。然后由shell生成的子进程就会继承shell的环境变量。那么shell(我们这里主要说的bash)的环境变量配置文件存放在哪里呢?有哪些设置环境变量的方法呢?我知道如果文章写的太长,就没有人会有耐心看下去的,所以我会在下一篇文章中说明shell环境变量的配置。因为平时还要养家糊口,我的出文速度有点慢,所以机智的你,在还没等到我的文章之前,就已经找到答案了。那么这篇文章也算起到抛砖引玉的作用了。

  我们在知道一样东西的来龙去脉后,是不是学习起来就更加顺手了呢。当然还是那句话,你知道的越多,不知道的也越多。这边文章又挖了很多坑,欢迎关注本头条号,我们一起挖坑,一起填坑。本人水平有限,如果文章有误,欢迎批评指正。


什么是linux环境变量


  

二维码