命令执行过程

命令执行过程

这部分要讲啥呢?很简单。

新建一个非常简单的 info.txt 文件。

1
2
3
4
5
cat > info.txt <<EOF
name:flash
age:28
language:java
EOF

在命令行输入一条十分简单的命令。

1
2
[root@linux0.11] cat info.txt | wc -l
3

这条命令的意思是读取刚刚的 info.txt 文件,输出它的行数。

我们的第五部分,就是抽丝剥茧般地解释这条命令,从你敲击键盘的那一刻开始,一直到它输出到屏幕 3 这个数字为止的全部过程。

阅读这个部分的同学,应该有一种所有知识都被串起来的爽。因为前四个部分已经把操作系统启动流程的全部秘密讲出来了,而在启动过程中必然伴随着系统各个模块的运作,而我们的第五部分正是想通过这一条命令的执行过程来解读系统各模块的原理与协作方式。

比如在启动过程中,进程 0 创建进程 1 进行 init 的过程,就需要 fork 函数的支持,这也就涉及到了进程调度模块。

图片

再比如在加载根文件系统,并打开 /dev/tty0 等文件时,就需要文件系统的支持,比较直观的函数就是 open,close,read,write 等。

图片

再比如加载并执行 shell 程序的时候,是通过 execve 配合 fork 函数来实现的,这里又涉及到了内存管理系统与中断机制,当然,这俩东西在任何地方都有体现。

这里的有些部分讲解的较为详细,比如进程调度这块,在启动流程中就直接有调用 fork 函数,如果不讲清楚了,启动流程的理解将会受到阻碍。

有些部分的讲解就没有那么详细了,因为不影响启动流程的理解,比如说从硬盘中读取数据到内存,其实中间涉及到文件系统,以及文件系统这个抽象层下方的块设备驱动程序,这部分非常复杂,不但分层和抽象层次较多,且涉及到阻塞与唤醒等操作。

所以从硬盘中读取数据到内存这块就没有展开太多,因为从硬盘读取数据到内存,本身不考虑细节,是一件非常容易理解的事情,就没有在启动流程里展开,以免影响大家对主流程的整体把控。

不过不用担心,整个第五部分,我将会通过这一个命令的执行过程,将操作系统各模块的全部核心细节都展开了讲解。

一个命令的执行,可以说调用了操作系统所有模块的运作,就光键盘输入命令到 shell 进程读取到这个命令,就涉及到了文件系统以及其下方的字符设备驱动程序。

图片

以及字符设备队列读取时的阻塞与唤醒机制。

图片

可以说是非常精彩。

当你通过前四部分理解了操作系统启动流程,再继续通过第五部分理解了一条命令的执行流程,那么你对操作系统的原理就真的不再畏惧了,因为操作系统一共就这两件事,一个是把自己启动起来,另一个是不断接收用户的命令并且执行它,就这么简单。

updatedupdated2024-05-052024-05-05