相信很多人对这个问题可能嗤之以鼻,浏览器输入网址后回车不就是发生了dns解析,找到ip,然后建立tcp连接,什么三次握手,四次挥手,然后服务端接受请求回传给浏览器,浏览器渲染出页面吗,这有什么好说的。
可是真的是这样吗,真的有这么简单吗?
相信我问一个问题90%的搞软件的同学都答不上来,按下键盘到该字符显示到屏幕上都发生了什么?是不是开始怀疑自己了,要想弄清楚这个问题涉及到中断,cpu动态流水线等,本文就来厘清这些概念。本文中参考了胡伟武老师的 计算机体系结构课件相关内容,以国产CPU龙芯为例进行讲解,本质跟Intel CPU机制类似。
因本人研究生搞的是硬件,CPU研发(胡老师就是我老师哦),一以贯之贯吾道!
键盘输入的硬件过程
• 以龙芯处理器为例
* 键盘产生一个信号送到桥片(南桥、北桥)
* 桥片通过HT总线向处理器发出外部中断信号
* 外部中断信号传到控制寄存器模块与Cause的屏蔽位相与
* 如果没有被屏蔽,再传到寄存器重命名模块并附在四条指令的第一条
中送到ROB模块;由于该指令发生了例外,不会送到功能部件执行
* 当该指令成为ROB的第一条指令被提交时向所有模块发出取消信号,
取消该指令后面的所有指令,在EPC等寄存器中保存例外现场,同时
在控制寄存器Status中把系统状态置为核心态。
* 向取指模块发出中断信号,取指模块根据中断类型到0x80000180取指
以龙芯处理器+Linux操作系统为例
• 0x80000180为操作系统例外处理代码
• 操作系统保留现场(把通用寄存器保存到堆栈区)
• 操作系统通过读Cause寄存器分析例外原因是外部中断
• 操作系统向桥片中的中断控制器读中断原因,读的同时清中断
• 操作系统根据中断原因调用驱动程序,读取键盘数据
• 操作系统唤醒正在由于等待数据而阻塞的进程
• Chrome根据读到的键盘数据决定显示出来,调用显示驱动程序
• 驱动程序把要显示的内容送到显存,并通知GPU
• GPU通过访问显存空间刷新屏幕
等等,是不是看到里面很多个概念,其余的大家自行百度搜索,此处终点讲解下ROB模块是什么。
首先需要讲下Tomasulo算法:
Tomasulo算法是用来实现动态流水线的一个算法结构,大量用在现代CPU的设计中,Intel、龙芯等CPU都是用的该技术。
不知上图你看懂了没有,保留站就是类似软件系统中的缓冲队列,寄存器就是通常意义上的寄存器,就是在各个部件前面加了一些保留站,为什么要加这个呢,以为指令执行的时候有些源操作数还没有准备好,需要等它们准备好后再送到加/减法器等去执行。
例外的意思就是中断和异常等了,很多事情可以触发例外,比如本文的敲击键盘就会触发,例外给CPU动态流水线的实现增加了难度,因为是乱序执行,需要有个机制保证例外前的指令都执行了,例外后的执行都未执行,此时重排序缓存该出场了,就是用来做顺序提交的。
下图是增加了ROB的流水线,注意图中右下角。
ROB的重要思想就是先将对寄存器的修改写到ROB中,指令的读取也去ROB中读,这样可以避免在指令的中间执行过程中,去修改寄存器的问题。
这时候下次面试官问你发生了什么的时候,这个时候你可以扶一下自己的眼镜,背部靠到椅子上,开始装逼了~
声明: 本文中图片的内容引用了 胡伟武老师的计算机体系结构课件。
想要获取完整版,关注并回复公众号: "胡伟武" 即可获取课件完整版下载链接。
文中主要引述了。其中01_计算机系统结构基础.pdf和LEC05_动态调度.pdf ,想要有更深入了解的可以去仔细研读下。
关注微信公众号支持哦~