RustFun|成為一名合格鍵盤俠的基本素質(zhì)

鍵盤涤躲,萌寶相信大家都不陌生,天天與它打交道贡未。

但熟歸熟种樱,清楚鍵盤背后的原理嗎蒙袍?

鍵盤上都標(biāo)有各鍵的名稱,表明了各鍵所代表的意義缸托,但是計算機是如何知道的左敌?

組合鍵是怎樣實現(xiàn)的瘾蛋?

按下一個代表字符的鍵俐镐,怎么變成平常使用的ASCII碼的?

#第七魂技?武魂真身#

01

相關(guān)介紹

鍵盤編碼器

鍵盤編碼器(i8048)哺哼,是鍵盤里的芯片佩抹,主要用來監(jiān)控是否有鍵按下,彈起取董,然后向鍵盤控制器報告此鍵的相關(guān)信息棍苹。

鍵盤掃描碼

一個鍵有按下就會有彈起,所以每個鍵會有兩個狀態(tài)茵汰,即每個鍵將會對應(yīng)兩個掃描碼枢里,鍵被按下時的編碼叫做通碼(makecode),彈起時的編碼叫做斷碼(breakcode)蹂午。

鍵盤控制器

鍵盤控制器(i8042)栏豺,不在鍵盤內(nèi)部,被集成在南橋芯片上豆胸。

它主要是接收鍵盤編碼器發(fā)來的掃描碼(第二套)奥洼,解碼(轉(zhuǎn)成第一套)后保存到自己的寄存器中,然后通過中斷控制器發(fā)送中斷請求晚胡。

i8042有4個寄存器灵奖,如下所示:

注:輸入輸出要視對象決定,對鍵盤控制器來說是輸出估盘,那么對CPU來說則是輸入瓷患,使用 in 指令。

02

鍵盤中斷流程

其實上述的相關(guān)介紹已經(jīng)涉及了部分鍵盤中斷流程遣妥,在此從頭至尾具體說說尉尾,先看流程圖:

03

鍵盤中斷服務(wù)程序

鍵盤中斷在所有的可屏蔽中斷中優(yōu)先級僅次于時鐘中斷,也需要盡快的處理燥透。

在Linux 0.11里的整個鍵盤服務(wù)程序都是用匯編來寫的沙咏,匯編語言直接操作底層的指令,沒有編譯器來增加額外的東西班套,所以運行起來比高級語言寫的程序快肢藐,但也增加了編寫程序的難度。

linux0.11版本的鍵盤中斷服務(wù)程序的框架源碼如下圖所示:

這個框架程序主要做了以下事情:

保護現(xiàn)場——壓棧

上文中寫到壓棧ss, esp, ?eflags, cs, eip, error_code (若有特權(quán)級變化且中斷帶有錯誤碼) 來保存現(xiàn)場吱韭,那只是CPU自動執(zhí)行的部分吆豹,完全保存原任務(wù)的信息還是在中斷處理程序中進行的鱼的。

如上圖所示,鍵盤中斷服務(wù)程序里通用寄存器只保存了4個痘煤,eax, ebx, ecx, edx凑阶,若為了省事不追求效率完全可以無腦操作pushad壓榨所有的通用寄存器。

#壞了壞了#

讀取掃描碼

inb $0x60, al ?從鍵盤控制器的輸出緩存區(qū)0x60端口讀取掃描碼衷快。

若不從輸出緩沖區(qū)讀取數(shù)據(jù)的話宙橱,鍵盤控制器是不會繼續(xù)工作的,意思是無論你怎么按鍵蘸拔,鍵盤控制器不會響應(yīng)鍵盤操作师郑,不會存下新的掃描碼發(fā)送中斷信號等。

當(dāng)然不讀取掃描碼后續(xù)的鍵盤中斷程序也沒法工作沒有意義调窍。

判斷是否為 0xe0 或 0xe1

如果掃描碼是 0xe0 或者 0xe1宝冕,那說明這個鍵的掃描碼是有多個字節(jié)的,需要先保存下來等待接下來的掃描碼組合成完整的掃描碼邓萨。?

尋址地梨、調(diào)用相應(yīng)的鍵處理程序

拿到完整的掃描碼之后就該去尋找相應(yīng)的鍵處理程序了

源碼中有個key_table,table, 說明它是一張表缔恳,或者說一個數(shù)組

這里面就按照掃描碼大小存放了各個鍵的實際處理程序地址宝剖。

如何找到相應(yīng)的鍵處理程序呢?

其實跟數(shù)組用下表獲取元素一樣

據(jù)源碼所示采用比例變址尋址的方式褐耳,即key_table(, %eax, 4)

也就是說相應(yīng)的鍵處理程序的地址是key_table + eax * 4诈闺。key_table

相當(dāng)于數(shù)組首地址;

eax里面存放的掃描碼铃芦,掃描碼可以看成數(shù)字索引號

相當(dāng)于數(shù)組下標(biāo)雅镊;

地址32位,4字節(jié)刃滓,所以乘4

回復(fù)現(xiàn)場—出線

壓棧保護現(xiàn)場的逆過程仁烹,在此不再贅述

萌寶要提醒各位,需要注意執(zhí)行到 iret 時的棧頂應(yīng)是 eip哦~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末咧虎,一起剝皮案震驚了整個濱河市卓缰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌砰诵,老刑警劉巖征唬,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茁彭,居然都是意外死亡总寒,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門理肺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摄闸,“玉大人善镰,你說我怎么就攤上這事∧暾恚” “怎么了炫欺?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長熏兄。 經(jīng)常有香客問我品洛,道長,這世上最難降的妖魔是什么霍弹? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任毫别,我火速辦了婚禮娃弓,結(jié)果婚禮上典格,老公的妹妹穿的比我還像新娘。我一直安慰自己台丛,他們只是感情好耍缴,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挽霉,像睡著了一般防嗡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侠坎,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天蚁趁,我揣著相機與錄音,去河邊找鬼实胸。 笑死他嫡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的庐完。 我是一名探鬼主播钢属,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼门躯!你這毒婦竟也來了淆党?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讶凉,失蹤者是張志新(化名)和其女友劉穎染乌,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂讯,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡荷憋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了域醇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片台谊。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蓉媳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锅铅,到底是詐尸還是另有隱情酪呻,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布盐须,位于F島的核電站玩荠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贼邓。R本人自食惡果不足惜阶冈,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塑径。 院中可真熱鬧女坑,春花似錦、人聲如沸统舀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽誉简。三九已至碉就,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闷串,已是汗流浹背瓮钥。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烹吵,地道東北人碉熄。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像年叮,于是被迫代替她去往敵國和親具被。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容