Featured image of post Linux下程序的启动过程

Linux下程序的启动过程

Linux下的程序是如何启动的?

简介

本来是要来学习内核的,但是不知怎么的,突然想到了”Linux程序是如何执行的?“这个问题,这纯粹是好奇心的驱使;之前就粗略地探究过这个问题,但是不够深入,以至于现在都忘了,但是找到了一张当时做的图: mindmap-linux_program_execution_flow 这张图是参考的一张网图,出处不详,我做了一个自己的版本,方便以后更改。

现在看这张图,有很多细节都想不起来了,今天仔细研究一下,顺便做个记录方便以后参考。

跑个题

计算机行业有两个经典的面试题:

  • 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的源代码执行流程:

flowchart TB A[shell.c:main] -- eval.c --> B[reader_loop] -- execute_cmd.c --> C[execute_command] --> D[execute_command_internal] --> E[execute_simple_command] --> F[execute_disk_command] --> G[shell_execve] --> H[syscall:execve]

接下来是内核:

flowchart TB A[execve] --> B[do_execve] --> C[do_execveat_common] --> D[load_elf_binary] --> E[start_thread]

流程图

根据以上信息,制作了一个简化流程图,展示了启动一个应用程序,在用户空间和内核空间需要做的事情。 mindmap-linux_program_execution_flow

使用 Hugo 构建
主题 StackJimmy 设计