<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦 > 論文大全 > 畢業論文 > 計算機論文 > 計算機應用 > 基于Linux內核的鍵盤模擬實現論文

        基于Linux內核的鍵盤模擬實現論文

        時間: 謝樺657 分享

        基于Linux內核的鍵盤模擬實現論文

          在Linux 下,硬件中斷叫做IRQ(Interrupt Requests)。有兩種IRQ,短類型和長類型。短IRQ需要很短的時間,在此期間機器的其他部分被鎖定,而且沒有其他中斷被處理。一個長IRQ需要較長的時間,在此期間可能發生其他中斷(但不是發自同一個設備)。如果可能的話,最好把一個中段聲明為長類型。今天學習啦小編要與大家分享的是:基于Linux內核的鍵盤模擬實現相關論文。具體內容如下,歡迎參考閱讀:

          關鍵詞: 系統調用 勾子函數 鍵盤模擬
        論文正文:

        基于Linux內核的鍵盤模擬實現

          1 引言

          當前,由于Linux資源完全公開,使得Linux的發展日益廣泛快速?;贚inux的各種應用已逐漸深入日常生活的方方面面,尤其是在嵌入式領域,由于內核可裁減定制,因此可隨意地根據用戶需求進行整個系統的定制與重構。其中,我們可以通過對各種標準外部設備的驅動進行改造,從而實現用戶對標準設備的特定需求,例如可以通過對鍵盤的模擬來實現操作的自動化,從而可以避免重復的鍵盤操作。

          2 Linux內核支持的外部調用接口

          由于Linux內核作為系統最深層次的核心,因此外部的開發人員并不能直接對內核進行操作。然而在一些應用程序的開發過程中,又不得不使用內核的某些功能,因此就提供了一些外部接口供開發人員直接與底層內核打交道。

          2.1 中斷

          在Linux 下,硬件中斷叫做IRQ(Interrupt Requests)。有兩種IRQ,短類型和長類型。短IRQ需要很短的時間,在此期間機器的其他部分被鎖定,而且沒有其他中斷被處理。一個長IRQ需要較長的時間,在此期間可能發生其他中斷(但不是發自同一個設備)。如果可能的話,最好把一個中段聲明為長類型。如果CPU接到一個中斷,它就會停止一切工作(除非它正在處理一個更重要的中斷,在這種情況下要等到更重要的中斷處理結束后才會處理這個中斷),把相關的參數存儲到棧里,然后調用中斷處理程序。這意味著在中斷處理程序本身中有些事情是不允許的,因為這時系統處在一個未知狀態。解決這個問題的方法是讓中斷處理程序做需要馬上做的事,通常是從硬件讀取信息或給硬件發送信息,然后把對新信息的處理調度到以后去做。

          實現的方法是在接到相關的IRQ(在Intel平臺上有16個IRQ)時調用中斷處理程序。這個函數接到IRQ號碼、函數名、標志、一個/proc/interrupts的名字和傳給中斷處理程序的一個參數。標志中可以包括 SA_SHIRQ來表明你希望和其他處理程序共享此IRQ(通常很多設備公用一個IRQ),或者一個SA_INTERRUPT表明這是一個緊急中斷。這個函數僅在此IRQ沒有其他處理程序或需要共享所有處理程序時才會成功運行。

          2.2 系統調用

          系統調用發生在用戶進程,通過一些特殊的函數來請求內核提供服務。這時,用戶進程被掛起,內核驗證用戶請求,嘗試執行并把結果反饋給用戶進程,接著用戶進程重新啟動。一般當前系統的系統調用作為一張表sys_call_table進行定義的,是由指向實現各種系統調用的內核函數的函數指針組成的表。具體參數參見Linux內核源代碼arch/i386/kernel/entry.S文件中:

          ENTRY(sys_call_table)

          l long SYMBOL_NAME(sys_ni_syscall)

          /* 0 - old "setup()" system call*/

          l long SYMBOL_NAME(sys_exit)

          …

          l long SYMBOL_NAME(sys_ni_syscall)

          /* streams2 */

          l long SYMBOL_NAME(sys_vfork)

          /* 190 */

          2.3 鉤子函數

          鉤子(HOOK)是Linux系統中非常重要的系統接口,用它可以截獲并處理送給其他應用程序的消息,來完成普通應用程序難以實現的功能。鉤子可以監視系統或進程中的各種事件消息,截獲發往目標的消息并進行處理。這樣就可以在系統中安裝自定義的鉤子,監視系統中特定事件的發生,完成特定的功能,比如截獲鍵盤、鼠標的輸入,屏幕取詞,日志監視等等。可見,利用鉤子可以實現許多特殊而有用的功能。

          3 鍵盤工作機理

          CPU對外部設備的管理是通過中斷程序進行的,鍵盤也是一種外部設備,因此,CPU對鍵盤的管理也是通過中斷進行的。當你擊打鍵盤的時候,鍵盤控制器會向CPU提出中斷申請,CPU響應此中斷進行處理,這就完成了一次很簡單與人之間通過鍵盤進行的交互。

          首先,當輸入一個鍵盤值的時候,鍵盤將會發送相應的scancodes給鍵盤驅動。一個獨立的擊鍵可以產生一個六個scancodes的隊列。鍵盤驅動中的 handle_ scancode()函數解析scancodes流并通過kdb_translate()函數里的轉換表(translation-table)將擊鍵事件和鍵的釋放事件(key release events)轉換成連續的keycode。例如,'a'的keycode是30。擊鍵'a'的時候便會產生keycode 30。釋放a鍵的時候會產生keycode 158(128+30)。

          然后,這些keycode通過對keymap的查詢被轉換成相應key符號。獲得的字符被送入raw tty隊列—tty_flip_buffer。receive_buf()函數周期性的從tty_flip_buffer中獲得字符,然后把這些字符送入 tty read隊列。

          當用戶進程需要得到用戶的輸入的時候,它會在進程的標準輸入(stdin)調用read()函數。sys_read()函數調用定義在相應的tty設備(如/dev/tty0)的file_operations結構中指向tty_read的read()函數來讀取字符并且返回給用戶進程。

          4 鍵盤模擬的實現

          通常情況下,對鍵盤模擬的實現一般是通過寫一個自己的鍵盤中斷句柄來實現,但這種方法容易導致系統崩潰。因此,在這種方法的基礎上可以利用勾子函數來實現。

          如附圖所示,這里主要用到的勾子函數包括handle_ scancode(),put_queue(),receive_buf(),tty_read()和sys_read()等函數。

          4.1 handle_scancode函數

          handle_scancode函數是鍵盤驅動程序中的一個入口函數(參見文件/usr/src/linux/drives/char/keyboard.c):

          void handle_scancode(unsigned char scancode, int down);

          這里通過替換原始的handle_scancode()函數來實現紀錄所有的scancode。即將原始的值保存,把新的值注冊進去,從而實現所需要的功能,最后再調用回到原始值的情況下。當此新的功能函數完成后,我們就可以記錄下鍵盤上的正確的擊鍵行為了(其中可以包括一些特殊的key,如ctrl, alt,shift,print screen等等)。

          4.2 put_queue函數

          handle_scancode()函數會調用put_queue函數,用來將字符放入tty_queue。

          put_queue函數在內核中定義如下:

          void put_queue(int ch)

          {wake_up(&keypress_wait);

          if (tty) {tty_insert_flip_char(tty, ch, 0);con_schedule_flip(tty); }}

          4.3 receive_buf函數

          底層tty驅動調用receive_buf()這個函數用來發送硬件設備接收處理的字符。參見/usr/src/linux/drivers/char/n_tty.c:

          static void n_tty_receive_buf(struct tty_struct *tty, const

          unsigned char *cp, char *fp, int count)

          參數cp是一個指向設備接收的輸入字符的buffer的指針。參數fp是一個指向一個標記字節指針的指針。在具體的實現中,先保存原始的tty receive_buf()函數,然后重置ldisc.receive_buf到自定義的new_receive_buf()函數來記錄用戶的輸入。

          例如:要記錄在終端tty1設備上的輸入。

          int fd = open("/dev/tty1", O_RDONLY, 0);

          struct file *file = fget(fd);

          struct tty_struct *tty = file->private_data;

          //保存原始的receive_buf()函數

          old_receive_buf = tty->ldisc.receive_buf;

          //替換成新的new_receive_buf函數

          tty->ldisc.receive_buf = new_receive_buf;

          //新的new_receive_buf函數

          void new_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)

          {logging(tty, cp, count);

          //紀錄用戶擊鍵

          /* 調用回原來的receive_buf */

          (*old_receive_buf)(tty, cp, fp, count);}

          4.4 tty_read函數

          當一個進程需要通過sys_read()函數來讀取一個tty終端的輸入字符時,tty_read函數就會被調用。參見文件/usr/src/linux/drives/char/tty_io.c:

          static ssize_t tty_read(struct file * file, char * buf, size_t count,loff_t *ppos)

          5 結束語

          目前,利用勾子函數實現基于Linux內核的鍵盤模擬的這種方法使用非常靈活,同時也可以跨平臺進行移植,可通過tty和pts來記錄下本地和遠程會話的所有擊鍵動作,并且也支持一些特殊的按鍵。當然,要使鍵盤模擬更靈活,下一步還需要更多的改進,例如增加多種不同日志記錄模式的支持等。

        326160 主站蜘蛛池模板: 亚洲欧美日韩国产国产a| 日韩吃奶摸下aa片免费观看| 亚洲精品区二区三区蜜桃| 亚洲精品综合第一国产综合| 亚洲综合区图片小说区| 蜜臀av久久国产午夜| 日韩精品一区二区大桥未久| 中文字幕日韩有码第一页| 国产精品v欧美精品∨日韩| 漂亮人妻被强中文字幕久久| 国产精品99一区二区三区 | 国产成人剧情av在线| 四虎国产精品永久地址99| 中文人妻av高清一区二区| 亚洲日本VA中文字幕在线| 18岁日韩内射颜射午夜久久成人| 三上悠亚ssⅰn939无码播放 | 亚洲欧美人成网站在线观看看| 永久免费AV无码网站YY| 日韩精品一区二区av在线观看| 亚洲中文字幕乱码免费| 中文字幕久久精品波多野结| 国产三级精品三级色噜噜| 无码成人午夜在线观看| 国产成人综合网在线观看| jizzjizz欧美69巨大| 特黄三级一区二区三区| 一级国产在线观看高清| 成人网站网址导航| 蜜桃草视频免费在线观看| 久久精品国产久精国产| 综合色亚洲| 国产成人精品国内自产色| 午夜福利看片在线观看| 极品少妇被后入内射视| 欧美区在线| 真人性囗交视频| 久久久久免费看成人影片| 国产亚洲精品成人aa片新蒲金| 不卡在线一区二区三区视频| 一边捏奶头一边高潮视频|