跳到主要内容

在浏览器地址栏输入地址按下回车发生什么

按一下键盘, 键盘会产生一个信号送到南桥芯片, 南桥芯片把键盘的编码保存在南桥内部的一个寄存器中, 并向处理器发出一个外部中断信号。该外部中断信号传到 CPU 内部后把 CPU 中一个控制寄存器的某一位置为“1”, 表示收到了外部中断。CPU 中另外一个控制寄存器有屏蔽位来确定是否处理这个外部中断信号。

屏蔽处理后的中断信号被附在一条译码后的指令上送到重排序缓冲(Re-Order Buffer, 简称ROB)。外部中断是例外(Exception, 也称“异常” ) 的一种, 发生例外的指令不会被送到功能部件执行。当这条指令成为重排序缓冲的第一条指令时 CPU 处理例外。重排序缓冲为了给操作系统一个精确的例外现场, 处理例外前要把例外指令前面的指令都执行完, 后面的指令都取消掉。

重排序缓冲向所有的模块发出一个取消信号, 取消该指令后面的所有指令; 修改控制寄存器, 把系统状态设为核心态; 保存例外原因、发生例外的程序计数器(Program Counter, 简称PC) 等到指定的控制寄存器中; 然后把程序计数器的值置为相应的例外处理入口地址进行取指。

处理器跳转到相应的例外处理器入口后执行操作系统代码, 操作系统首先保存处理器现场, 包括寄存器内容等。保存现场后, 操作系统向CPU 的控制寄存器读例外原因, 发现是外部中断例外, 就向南桥的中断控制器读中断原因, 读的同时清除南桥的中断位。读回来后发现中断原因是有人敲了回车键。

操作系统接下来要查找读到的空格是给谁的: 有没有进程处在阻塞状态等键盘输入。大家都学过操作系统的进程调度, 知道进程至少有三个状态: 运行态、阻塞态、睡眠态, 进程在等 IO 输入时处在阻塞态。操作系统发现有一个名为 Chrome 的进程处于阻塞态, 这个进程对空格键会有所响应, 就把 Chrome 唤醒。

如果不是 Chrome 是 WPS,那么 WPS 被唤醒后处在运行状态。发现操作系统传过来的数据是个键盘输入空格, 表示要翻页。WPS 就把下一页要显示的内容准备好, 调用操作系统中的显示驱动程序, 把要显示的内容送到显存, 由图形处理器(Graphic Processing Unit, 简称GPU) 通过访问显存空间刷新屏幕。达到了翻一页的效果。

......