今天的話題是當(dāng)我們按下鍵盤時(shí)計(jì)算機(jī)系統(tǒng)中發(fā)生了什么,實(shí)際上,要是真寫起來,這個(gè)問題大概能寫成一本書,這里將會(huì)從宏觀上來了解一下從按下按鍵到輸出至屏幕的整個(gè)過程。
鍵盤大家都很熟悉了,一般長(zhǎng)這樣:
不好意思放錯(cuò)了,一般長(zhǎng)這樣:
然而它的內(nèi)部其實(shí)是這樣類似于矩陣的電路:
每個(gè)按鍵其實(shí)是一個(gè)開關(guān),當(dāng)我們按下按鍵時(shí)電路閉合,抬起按鍵時(shí)電路斷開,這樣當(dāng)我們按鍵時(shí)鍵盤中的微型處理器就能感知到,此時(shí)萬里長(zhǎng)征第一步開始了,以下假設(shè)我們使用的是usb鍵盤。
鍵盤中的硬件檢測(cè)到的被稱為keycode,存放在鍵盤里中的存儲(chǔ)器中,這個(gè)存儲(chǔ)設(shè)備被稱為endpoint,usb控制器不斷poll該endpoint從而獲取到keycode。
usb控制器獲取到數(shù)據(jù)后開始向CPU發(fā)起中斷:
此時(shí)你的CPU在干嘛呢?此時(shí)系統(tǒng)中有很多進(jìn)程,像word以及其它聊天軟件之類,假設(shè)你正在使用word,因此CPU正在執(zhí)行word進(jìn)程相應(yīng)的機(jī)器指令:
CPU檢測(cè)到中斷產(chǎn)生后丟下word進(jìn)程(暫停)并轉(zhuǎn)到kernel mode,此時(shí)CPU發(fā)現(xiàn)是usb產(chǎn)生的中斷,因此找到usb中斷處理函數(shù),該中斷函數(shù)中開處理按鍵數(shù)據(jù):
由于USB有一套通信 協(xié)議,像HID(Human Interface Device)協(xié)議等,所以這里的按鍵就像網(wǎng)絡(luò)數(shù)據(jù)包一樣被封裝成了usb數(shù)據(jù)在協(xié)議棧中一層層向上傳遞,邊傳遞邊處理。
底層的USB層解析后發(fā)現(xiàn)是HID數(shù)據(jù),然后將其交給HID層處理,HID處理后數(shù)據(jù)處理后交給輸入層,輸入層解析后keycode發(fā)現(xiàn)按下的是字符“M”,然后將其記錄在設(shè)備文件(device file)中,在類Unix系統(tǒng)中就是/dev/input/event**,此時(shí)數(shù)據(jù)正式從硬件來到的了計(jì)算機(jī)系統(tǒng)中:
既然鍵盤數(shù)據(jù)一路跋山涉水從硬件來到了內(nèi)核態(tài),那么接下來就是用戶態(tài)的表演。
我們?cè)谄聊簧峡吹降囊粋€(gè)個(gè)窗體,window,實(shí)際上這些窗體是由窗體管理器(window manager)管理的,窗口管理器清楚的知道這些window的層級(jí)、位置、大小以及是否獲取了焦點(diǎn)(focus)。
還是以Unix為例,在Unix系統(tǒng)中,窗體管理器叫做 X window manager,其運(yùn)行在X Window System,該系統(tǒng)由X server以及X client組成,我們的圖形界面應(yīng)用程序就是x client,其接受來自X server的鍵盤鼠標(biāo)等消息:
X server又是從哪里獲取鍵盤鼠標(biāo)等消息呢?答案就是我們剛才提到的設(shè)備文件/dev/input/event**,通過讀取該文件X server就能知道鍵盤被按下以及被按下的是哪個(gè)按鍵。
接下來X server將該消息發(fā)送到獲取焦點(diǎn)的窗體,此時(shí)我們的窗體APP檢測(cè)鍵盤按鍵的代碼開始執(zhí)行,如果是窗體App是賽車游戲程序并且檢測(cè)到了向上的箭頭按鍵,那么就需要對(duì)車進(jìn)行加速,這需要對(duì)游戲畫面進(jìn)行重繪、如果窗體App是文本編輯器則需要將按下的字符顯示出來。
在這里以文本編輯器word為例,當(dāng)word檢測(cè)到用戶按下的是字符M時(shí),word需要知道該以什么字體顯示該字符、字體大小是多少、顏色是什么等等。
現(xiàn)在word知道了關(guān)于該字符的足夠信息,接下來需要請(qǐng)求X Window System將其在屏幕上顯示出來,怎么顯示呢?
原來內(nèi)存中有一塊被稱為framebuffer的區(qū)域,GPU從這里獲取數(shù)據(jù)并將其在屏幕上渲染出來,我們需要做的就是將字符包含的所有信息添加到frame buffer中,這樣下一次顯卡刷新時(shí)你按下的字符就能在屏幕上顯示出來了。
怎么樣,看似簡(jiǎn)單的按下鍵盤到屏幕顯示字符著實(shí)不簡(jiǎn)單,這里涉及軟硬件的密切配合,毫不夸張的說,你每次按下鍵盤后計(jì)算機(jī)系統(tǒng)中可能需要成千上萬行代碼的執(zhí)行才能把按鍵最終顯示在屏幕上,是不是很有趣!
好啦,今天的文章就到這里,希望這篇對(duì)大家理解計(jì)算機(jī)系統(tǒng)有所幫助~
來源:碼農(nóng)的荒島求生
編輯:小咕咕
轉(zhuǎn)載內(nèi)容僅代表作者觀點(diǎn)
不代表中科院物理所立場(chǎng)
如需轉(zhuǎn)載請(qǐng)聯(lián)系原公眾號(hào)
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.