新聞中心
在Linux內(nèi)核中,鍵盤輸入是通過軟中斷實(shí)現(xiàn)的。軟中斷是一種特殊的中斷,它不來自硬件設(shè)備,而是由內(nèi)核自己產(chǎn)生的。本文將對(duì)Linux中鍵盤軟中斷的原理進(jìn)行分析。

創(chuàng)新互聯(lián)于2013年創(chuàng)立,先為蓮都等服務(wù)建站,蓮都等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為蓮都企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
鍵盤中斷源碼分析
在Linux內(nèi)核中,鍵盤輸入的中斷處理函數(shù)為kbd_interrupt。
輸入設(shè)備注冊(cè)
在Linux內(nèi)核啟動(dòng)過程中,會(huì)調(diào)用input_register_device函數(shù)來注冊(cè)輸入設(shè)備,其中包括了鍵盤設(shè)備。注冊(cè)完成后,如果有按鍵被按下,就會(huì)調(diào)用kbd_probe函數(shù)進(jìn)行鍵盤檢測。
struct input_dev *input_allocate_device(void)
{
struct input_dev *dev = kzalloc(sizeof(struct input_dev), GFP_KERNEL);
…
return dev;
}
int input_register_device(struct input_dev *dev)
{
…
input_dev_list_add(dev);
…
kobject_uevent(&dev->dev.kobj, KOBJ_ADD);
…
return 0;
}
int kbd_probe(struct serio *serio, const struct serio_device_id *id)
{
…
input = input_allocate_device();
input->name = “AT Translated Set 2 keyboard”;
input->phys = serio_phys(serio);
serio->dev.private = input;
serio_open(serio, driver);
input->id.bustype = BUS_I8042;
input->id.vendor = 0x0001;
input->id.product = 0x0001;
input->id.version = 0x0100;
err = input_register_device(input);
…
}
鍵盤中斷處理
當(dāng)檢測到鍵盤輸入時(shí),會(huì)進(jìn)入kbd_interrupt函數(shù)進(jìn)行中斷處理。在該函數(shù)內(nèi)部,會(huì)進(jìn)行集中處理,在中斷處理函數(shù)中可以得到輸入按鍵的鍵值和狀態(tài)信息。
irqreturn_t kbd_interrupt(int irq, void *dev_id)
{
while ((skb = serio_receive_buf(serio, &count)) != NULL)
{
…
input_event(input, EV_MSC, MSC_SCAN, code);
input_event(input, type, code, value);
…
}
return IRQ_HANDLED;
}
解析
當(dāng)我們按下鍵盤時(shí),信號(hào)會(huì)被傳遞至CPU,CPU則會(huì)尋找對(duì)應(yīng)的中斷處理程序進(jìn)行處理。由于鍵盤屬于異步輸入設(shè)備,需要使用中斷來進(jìn)行異步處理。在Linux內(nèi)核中,鍵盤輸入是通過軟中斷進(jìn)行處理的。
軟中斷由內(nèi)核自行產(chǎn)生,用于異步處理內(nèi)核操作。當(dāng)執(zhí)行到軟中斷處理函數(shù)時(shí),會(huì)先將當(dāng)前進(jìn)程切換至內(nèi)核模式,以便獲得更高的特權(quán)級(jí)。在中斷處理函數(shù)執(zhí)行完畢后,CPU會(huì)回到進(jìn)程原本的用戶態(tài)。
所有軟中斷都被記錄在一個(gè)表中,每個(gè)軟中斷都有一個(gè)唯一的編號(hào)。在發(fā)起軟中斷調(diào)用時(shí),需要指定這個(gè)編號(hào)。在鍵盤輸入的處理中,使用的軟中斷編號(hào)為KEYBOARD_IRQ。
Linux鍵盤硬件中斷與軟件中斷的區(qū)別
硬件中斷和軟中斷都是由CPU控制的,二者的主要區(qū)別在于產(chǎn)生原因:
硬件中斷:由硬件設(shè)備發(fā)起,如鍵盤輸入、鼠標(biāo)輸入。
軟中斷:由進(jìn)程或內(nèi)核發(fā)起,用于異步處理內(nèi)核操作,如計(jì)數(shù)器、時(shí)間控制、網(wǎng)絡(luò)任務(wù)等。
此外,軟中斷還具有以下特點(diǎn):
軟中斷用于內(nèi)核的異步操作處理,可以保證在時(shí)間處理上的穩(wěn)定性。
在軟中斷處理時(shí),內(nèi)核可以自行內(nèi)部維護(hù)運(yùn)行周期,不會(huì)像硬件中斷那樣性能浪費(fèi)。
軟中斷由內(nèi)核編寫機(jī)制處理,可以自由編寫相關(guān)函數(shù)和驅(qū)動(dòng)程序,以適應(yīng)不同的系統(tǒng)和處理需求。
Linux內(nèi)核中的鍵盤輸入是通過軟中斷進(jìn)行處理的。軟中斷是一種特殊的中斷,由內(nèi)核產(chǎn)生,并用于異步處理內(nèi)核操作。Linux中的鍵盤輸入處理函數(shù)為kbd_interrupt,在該函數(shù)中,會(huì)通過集中處理得到輸入按鍵的鍵值和狀態(tài)信息,并返回給調(diào)用程序。
對(duì)于軟中斷和硬件中斷的概念,需要理解它們的區(qū)別和聯(lián)系,以便更好地理解Linux內(nèi)核鍵盤輸入的處理流程。在軟中斷處理過程中,內(nèi)核可以自行內(nèi)部維護(hù)運(yùn)行周期,這保證了軟中斷能夠穩(wěn)定處理各種內(nèi)核操作。
相關(guān)問題拓展閱讀:
- linux串口接收軟中斷cpu100%
linux串口接收軟中斷cpu100%
您是想問linux串口接收軟中斷cpu100%是什么原因嗎?linux串口接森巖納收軟中斷cpu100%是因?yàn)閏pu占用資源較高。當(dāng)cpu占用資源較高,此沒就會(huì)導(dǎo)致出現(xiàn)linux串口接收軟棗拍中斷cpu100%的現(xiàn)象,所以linux串口接收軟中斷cpu100%是因?yàn)閏pu占用資源較高。
linux鍵盤軟中斷的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux鍵盤軟中斷,Linux鍵盤軟中斷原理解析,linux串口接收軟中斷cpu100%的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)建站主營:成都網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、網(wǎng)站改版的網(wǎng)站建設(shè)公司,提供成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、成都網(wǎng)站推廣、成都網(wǎng)站優(yōu)化seo、響應(yīng)式移動(dòng)網(wǎng)站開發(fā)制作等網(wǎng)站服務(wù)。
當(dāng)前名稱:Linux鍵盤軟中斷原理解析(linux鍵盤軟中斷)
轉(zhuǎn)載來源:http://fisionsoft.com.cn/article/coghphg.html


咨詢
建站咨詢
