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进程,等待下一条命令的执行。
系统调用进程之间的转换通过 操作系统内核实现, 内核为操作系统代码场常驻主存的部分。
程序需要操作系统执行操作时,执行系统调用指令,将控制权传递给内核,内核执行被请求的操作并返回应用程序(内核不是独立的进程,是系统管理全部进程所用代码及数据结构的集合)。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!