• 全国 [切换]
  • 二维码
    错改网

    手机WAP版

    手机也能找商机,信息同步6大终端平台!

    微信小程序

    微信公众号

    当前位置: 首页 » 行业新闻 » 热点新闻 » 正文

    按下键盘时计算机系统中发生了什么?

    放大字体  缩小字体 发布日期:2025-08-26 13:19:38   浏览次数:5  发布人:8804****  IP:124.223.189***  评论:0
    导读

    今天的话题是当我们按下键盘时计算机系统中发生了什么,实际上,要是真写起来,这个问题大概能写成一本书,这里将会从宏观上来了解一下从按下按键到输出至屏幕的整个过程。键盘大家都很熟悉了,一般长这样:不好意思放错了,一般长这样:然而它的内部其实是这样类似于矩阵的电路:每个按键其实是一个开关,当我们按下按键时电路闭合,抬起按键时电路断开,这样当我们按键时键盘中的微型处理器就能感知到,此时万里长征第一步开始了

    今天的话题是当我们按下键盘时计算机系统中发生了什么,实际上,要是真写起来,这个问题大概能写成一本书,这里将会从宏观上来了解一下从按下按键到输出至屏幕的整个过程。

    键盘大家都很熟悉了,一般长这样:


    不好意思放错了,一般长这样:

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    然而它的内部其实是这样类似于矩阵的电路:


    每个按键其实是一个开关,当我们按下按键时电路闭合,抬起按键时电路断开,这样当我们按键时键盘中的微型处理器就能感知到,此时万里长征第一步开始了,以下假设我们使用的是usb键盘。

    键盘中的硬件检测到的被称为keycode,存放在键盘里中的存储器中,这个存储设备被称为endpoint,usb控制器不断poll该endpoint从而获取到keycode。

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    usb控制器获取到数据后开始向CPU发起中断:

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    此时你的CPU在干嘛呢?此时系统中有很多进程,像word以及其它聊天软件之类,假设你正在使用word,因此CPU正在执行word进程相应的机器指令:

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    CPU检测到中断产生后丢下word进程(暂停)并转到kernel mode,此时CPU发现是usb产生的中断,因此找到usb中断处理函数,该中断函数中开处理按键数据:

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />
    由于USB有一套通信 协议,像HID(Human Interface Device)协议等,所以这里的按键就像网络数据包一样被封装成了usb数据在协议栈中一层层向上传递,边传递边处理。

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    底层的USB层解析后发现是HID数据,然后将其交给HID层处理,HID处理后数据处理后交给输入层,输入层解析后keycode发现按下的是字符“M”,然后将其记录在设备文件(device file)中,在类Unix系统中就是/dev/input/event**,此时数据正式从硬件来到的了计算机系统中:


    既然键盘数据一路跋山涉水从硬件来到了内核态,那么接下来就是用户态的表演。

    我们在屏幕上看到的一个个窗体,window,实际上这些窗体是由窗体管理器(window manager)管理的,窗口管理器清楚的知道这些window的层级、位置、大小以及是否获取了焦点(focus)。

    还是以Unix为例,在Unix系统中,窗体管理器叫做 X window manager,其运行在X Window System,该系统由X server以及X client组成,我们的图形界面应用程序就是x client,其接受来自X server的键盘鼠标等消息:


    X server又是从哪里获取键盘鼠标等消息呢?答案就是我们刚才提到的设备文件/dev/input/event**,通过读取该文件X server就能知道键盘被按下以及被按下的是哪个按键。

    接下来X server将该消息发送到获取焦点的窗体,此时我们的窗体APP检测键盘按键的代码开始执行,如果是窗体App是赛车游戏程序并且检测到了向上的箭头按键,那么就需要对车进行加速,这需要对游戏画面进行重绘、如果窗体App是文本编辑器则需要将按下的字符显示出来。

    在这里以文本编辑器word为例,当word检测到用户按下的是字符M时,word需要知道该以什么字体显示该字符、字体大小是多少、颜色是什么等等。


    现在word知道了关于该字符的足够信息,接下来需要请求X Window System将其在屏幕上显示出来,怎么显示呢?

    原来内存中有一块被称为framebuffer的区域,GPU从这里获取数据并将其在屏幕上渲染出来,我们需要做的就是将字符包含的所有信息添加到frame buffer中,这样下一次显卡刷新时你按下的字符就能在屏幕上显示出来了。

    nload="this.removeAttribute('width'); this.removeAttribute('height'); this.removeAttribute('onload');" />

    怎么样,看似简单的按下键盘到屏幕显示字符着实不简单,这里涉及软硬件的密切配合,毫不夸张的说,你每次按下键盘后计算机系统中可能需要成千上万行代码的执行才能把按键最终显示在屏幕上,是不是很有趣!


    好啦,今天的文章就到这里,希望这篇对大家理解计算机系统有所帮助~

    来源:码农的荒岛求生

    编辑:小咕咕

    转载内容仅代表作者观点

    不代表中科院物理所立场

    如需转载请联系原公众号


     
    (文/匿名(若涉版权问题请联系我们核实发布者) / 非法信息举报 / 删稿)
    打赏
    免责声明
    • 
    本文为昵称为 8804**** 发布的作品,本文仅代表发布者个人观点,本站未对其内容进行核实,请读者仅做参考,如若文中涉及有违公德、触犯法律的内容,一经发现,立即删除,发布者需自行承担相应责任。涉及到版权或其他问题,请及时联系我们154208694@qq.com删除,我们积极做(权利人与发布者之间的调停者)中立处理。郑重说明:不 违规举报 视为放弃权利,本站不承担任何责任!
    有个别老鼠屎以营利为目的遇到侵权情况但不联系本站或自己发布违规信息然后直接向本站索取高额赔偿等情况,本站一概以诈骗报警处理,曾经有1例诈骗分子已经绳之以法,本站本着公平公正的原则,若遇 违规举报 我们100%在3个工作日内处理!
    0相关评论
     

    (c)2008-现在 cuogai.com All Rights Reserved.