CSAPP随笔:hello world到底是怎么运行的?
通过命令行执行 ./test
拆分:
0. shell是干什么的?:shell输出提示符,等待输入一个命令行并执行,若该字符串的首个单词不是shell命令,就假设为一个可执行文件的名称,进行加载并执行。
1. 键盘敲入"./test"过程:shell将从键盘敲入的字符串一个个的读入寄存器,再由寄存器放到主存中。(键盘->寄存器->主存) *注:原书里说是放到内存,但查了下,发现寄存器属于内存的范畴,但是图中显示的流向为主存,这里更改为主存,(内存包含寄存器,高速缓存及主存储器(这里包含于内存),原书说的没毛病,这里更改更显著一些)。
2. 按Enter键:进行加载执行文件的操作,按Enter表示结束命令行的输入,将hello目标文件中的代码和数据从磁盘复制到主存中。(这里通过DMA可以让数据不经过CPU(包含CPU执行的操作及存储的寄存器占用))。(磁盘->主存)
3. 执行显示:主存中的代码及数据有了后,处理器执行main中的机器指令。将“hello world\n”字符串从主存复制到寄存器文件,再从寄存器文件复制到显示设备(屏幕)上。(主存->寄存器->屏幕)
这里存在两个并发进程:shell进程 hello进程
1. shell进程 运行
2. 让hello进程运行,通过系统调用执行请求,将控制权传给操作系统,操作系统保存shell进程的上下文,同时,创建hello进程的上下文。
3. 控制权给hello进程。
4. 结束后操作系统恢复shell进程的上下文,将控制权还给shell进程,等待下一条命令的执行。
系统调用进程之间的转换通过 操作系统内核实现, 内核为操作系统代码场常驻主存的部分。
程序需要操作系统执行操作时,执行系统调用指令,将控制权传递给内核,内核执行被请求的操作并返回应用程序(内核不是独立的进程,是系统管理全部进程所用代码及数据结构的集合)。