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进程,等待下一条命令的执行。

 

     系统调用进程之间的转换通过 操作系统内核实现, 内核为操作系统代码场常驻主存的部分。

     程序需要操作系统执行操作时,执行系统调用指令,将控制权传递给内核,内核执行被请求的操作并返回应用程序(内核不是独立的进程,是系统管理全部进程所用代码及数据结构的集合)。

 

 

posted @ 2023-01-27 09:33  fourmii  阅读(133)  评论(0编辑  收藏  举报