操作系統(tǒng)是怎樣一步步接收鍵盤按鍵的?
大家好,我是島主小風(fēng)哥,你有沒有想過,按下鍵盤按鍵后,相應(yīng)的字符是怎么一步步顯示在屏幕上的?
首先來看硬件部分,你至少應(yīng)該能想到必須得有鍵盤和CPU:
圖片
之后呢,cpu是怎么知道有鍵盤按下呢?
為了讓鍵盤按下按鍵后能通知到CPU,需要借助鍵盤控制器,keyboard controller,這當(dāng)然也是硬件:
圖片
當(dāng)按下按鍵時,鍵盤控制器能檢測到鍵盤按鍵:
圖片
接著鍵盤控制器向CPU發(fā)出中斷:
圖片
當(dāng)CPU接收到中斷信號后暫停當(dāng)然正在執(zhí)行的代碼,在此之前也許CPU正在執(zhí)行應(yīng)用程序的代碼,表現(xiàn)出來的就是你的程序就在運行:
圖片
當(dāng)然也有可能CPU正在執(zhí)行操作系統(tǒng)代碼,但不管怎樣,CPU接收到中斷信號后將暫停執(zhí)行當(dāng)前的指令然后跳轉(zhuǎn)到一個提前配置好的地址,這個地址指向的就是內(nèi)核中的處理函數(shù),假設(shè)這個函數(shù)叫做do_irq()。
圖片
中斷處理函數(shù)do_irq發(fā)現(xiàn)中斷來自鍵盤,因此開始調(diào)用能處理鍵盤按鍵的內(nèi)核代碼,這段內(nèi)核代碼就是所謂的驅(qū)動,driver。
圖片
驅(qū)動程序處理鍵盤按鍵后發(fā)現(xiàn)按下的是字母a,然后呢?
在類Unix系統(tǒng)中,驅(qū)動程序會把字母a寫到device file中,也就是設(shè)備文件,你可以像訪問普通文件那樣直接訪問設(shè)備文件,但它并不是真正的文件。
圖片
現(xiàn)在,鍵盤按鍵已經(jīng)從硬件世界來到的了軟件世界,也就是內(nèi)核中。
還是以Unix系統(tǒng)為例,在Unix中負(fù)責(zé)窗體管理的叫做X Window System,該系統(tǒng)由X server以及X client組成,圖形應(yīng)用程序就是x client,接收來自x server的鍵盤消息,那么x server又是從哪里知道鍵盤消息呢?答案就是剛才提到的設(shè)備文件:
圖片
接下來X server會把鍵盤按鍵消息發(fā)送給正在獲取焦點的窗體,怎么發(fā)送呢?利用的就是進(jìn)程間通信技術(shù),IPC:
圖片
這樣,我們的程序就可以獲得鍵盤按鍵了。