简介
本来是要来学习内核的,但是不知怎么的,突然想到了”Linux程序是如何执行的?“这个问题,这纯粹是好奇心的驱使;之前就粗略地探究过这个问题,但是不够深入,以至于现在都忘了,但是找到了一张当时做的图: 这张图是参考的一张网图,出处不详,我做了一个自己的版本,方便以后更改。
现在看这张图,有很多细节都想不起来了,今天仔细研究一下,顺便做个记录方便以后参考。
跑个题
计算机行业有两个经典的面试题:
- Linux是如何启动的?
- 当你在浏览器的地址栏中输入"https://google.com" ,并按下回车键后,发生了什么?
要我说,应该再加上一个,那就是”在Linux中,一个应用程序是如何启动和执行的?“。
能够详细地回答上述三个问题,你对于计算机的理解就很深了。
其实,上述三个问题的详细程度是没有上限的,你可以隔一段时间,重新问问自己这几个问题,看看自己是否有更新,更详细的答案,如果没有,很可能你最近并没有进步。
这三个问题,也可以作为学习计算机的框架。问题就好比是树干,凭着好奇心,不断摸索出它的枝叶。仔细看下,你会发现,这三个问题分别代表了操作系统,二进制和Web技术,都是很有代表性的领域。
这里给出一些关于上述问题的参考资料,有兴趣的可以看看:
篇幅都很长,而且不易理解,但是质量很高;能够完全参透上面两个资料,恭喜你,你已经成为高薪人才了,快去北上广深找一个好工作吧。
启动过程
There are many different ways to launch an application from a user perspective. For example we can run a program from the shell or double-click on the application icon. It does not matter. The Linux kernel handles application launch regardless how we do launch this application.
从用户的角度来看,有许多不同的方式启动一个应用程序。例如,我们可以从Shell启动,或者双击应用程序的图标。不过这没关系,无论我们用户如何启动程序,最终Linux Kernel会处理应用程序启动。
启动一个应用程序,一部分发生在用户空间,一部分通过系统调用发生在内核空间。
在用户空间,应用程序从Shell启动,比如说Bash,我们可以看下Bash的源代码执行流程:
接下来是内核:
流程图
根据以上信息,制作了一个简化流程图,展示了启动一个应用程序,在用户空间和内核空间需要做的事情。