欧美一区二区三区四区五区,人人看人人艹,亚洲一区二区中文,99精品视频99,亚洲精品欧美综合四区,国产三区视频在线观看,日韩在线观看一区二区,久久精品色
    主辦單位:全國創爭活動指導協調小組 中華職工學習網首頁 情景站 聯系電話:010-68232149
    科學研究人員 | 工程技術人員 | 購銷人員 | 倉儲人員 | 運輸服務人員 | 體育工作人員 | 教學人員 | 購銷人員

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

    http://m.dcyhziu.cn  2007/6/5 源自:中華職工學習網 【字體: 字體顏色
    1  引言
      當前,由于Linux資源完全公開,使得Linux的發展日益廣泛快速。基于Linux的各種應用已逐漸深入日常生活的方方面面,尤其是在嵌入式領域,由于內核可裁減定制,因此可隨意地根據用戶需求進行整個系統的定制與重構。其中,我們可以通過對各種標準外部設備的驅動進行改造,從而實現用戶對標準設備的特定需求,例如可以通過對鍵盤的模擬來實現操作的自動化,從而可以避免重復的鍵盤操作。
      
      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來記錄下本地和遠程會話的所有擊鍵動作,并且也支持一些特殊的按鍵。當然,要使鍵盤模擬更靈活,下一步還需要更多的改進,例如增加多種不同日志記錄模式的支持等。
      相關鏈接
      相關評論
    主站蜘蛛池模板: 欧美午夜一区二区三区精美视频| 91夜夜夜| 亚洲精品日日夜夜| 99精品一级欧美片免费播放| 国产69精品99久久久久久宅男| 国产欧美一区二区三区在线| 91精品国模一区二区三区| 娇妻被又大又粗又长又硬好爽| 日本一区二区高清| 538在线一区二区精品国产| 欧美乱大交xxxxx| 欧美日韩一区电影| 国产精品高清一区| 国产电影一区二区三区下载| 精品国产一区二区三区久久久久久| 亚洲色欲色欲www| 国产一区二区激情| 亚洲国产偷| 一区二区三区国产精品视频| 亚洲欧美国产精品一区二区| 欧美一区二区三区久久综合| 欧美亚洲精品suv一区| 欧美一级片一区| 国产精品自拍在线| 亚洲欧美日韩精品suv| 国产一区二区精品免费| 456亚洲精品| 国产午夜三级一区二区三| 亚洲国产欧美国产综合一区| 日韩精品中文字幕一区二区三区 | 亚洲国产aⅴ精品一区二区16| 国产精品一区一区三区| 一区二区三区四区国产| 国产第一区在线观看| 国产专区一区二区| 国产69精品久久久| 国产精品久久久久久久久久不蜜月 | 亚洲乱码av一区二区三区中文在线:| 欧美日韩激情一区二区| 91福利视频免费观看| 欧美一区二区三区精品免费| 一区二区国产盗摄色噜噜| 四虎影视亚洲精品国产原创优播| 国产偷久久一区精品69| 色一情一乱一乱一区99av白浆| 国产精品96久久久| 狠狠色噜噜狠狠狠狠69| 国产午夜精品一区二区理论影院| 国产日韩欧美色图| 免费在线观看国产精品| 国产欧美一区二区精品久久久| 欧美一区二区三区在线视频观看| 国产一级片大全| 国产99网站| 狠狠色狠狠色88综合日日91| 午夜av网址| 国产一区二区伦理| 国产精品久久久久久久久久久久久久久久| 精品国产乱码久久久久久影片| 欧美日韩国产123| 国产伦精品一区二区三区免费优势| 精品一区二区三区视频?| 国产精品免费专区| 91一区二区三区视频| 欧美日韩精品影院| 国产99久久九九精品| 亚洲乱玛2021| 国产高清一区二区在线观看| 免费午夜片| 91麻豆精品一区二区三区| 久久久精品中文| 欧美系列一区| 久久久精品99久久精品36亚 | 久久综合伊人77777麻豆最新章节| 欧美精品一区二区三区四区在线| 国产二区视频在线播放| 日韩av在线一区| 国产一区二区极品| 国产伦精品一区二区三区无广告| 日本道欧美一区二区aaaa| 亚洲欧美国产一区二区三区| 99精品小视频| 国产欧美精品一区二区三区小说 | 一区二区三区精品国产| 午夜av影视| 91国偷自产一区二区介绍| 国产一区日韩在线| 国产精品久久久麻豆| 午夜欧美影院| 91丝袜国产在线观看| 久久免费精品国产| 精品久久小视频| 久久福利免费视频| 亚洲精品丝袜| 国产高清在线一区| 国产欧美亚洲精品第一区软件| 国产69精品久久久久777| 国产一级片大全| 国产一区二区三级| 69久久夜色精品国产69–| 国产一区二区中文字幕| 国产一区日韩精品| 精品欧美一区二区精品久久小说| 精品国产一区二| 精品国产一区二区三区免费| 国产精品日韩高清伦字幕搜索| 国产精品日产欧美久久久久| 午夜激情在线播放| 欧美极品少妇xxxxⅹ| 成年人性生活免费看| 欧美日韩一区二区三区不卡| 国产欧美综合一区| 97国产精品久久久| 国产精品中文字幕一区二区三区| 中文字幕一区二区三区又粗| 国产高清精品一区二区| 久久精品99国产精品亚洲最刺激| 最新日韩一区| 亚洲精品456在线播放| 日韩av中文字幕第一页| yy6080影院旧里番乳色吐息| 91超薄丝袜肉丝一区二区| 亚洲国产精品一区二区久久hs| 欧美老肥婆性猛交视频| 蜜臀久久99精品久久久| 大bbw大bbw巨大bbw看看| 大bbw大bbw巨大bbw看看| 视频国产一区二区| 日韩一级精品视频在线观看| 亚洲精品久久久久久动漫| 免费看大黄毛片全集免费| 国产一区二区极品| 一区二区在线精品| 国产麻豆一区二区三区在线观看| 91午夜精品一区二区三区| 国产欧美日韩综合精品一| 久久精品手机视频| 波多野结衣女教师30分钟| xxxxx色| 精品久久综合1区2区3区激情 | 一级午夜电影| 亚洲国产精品国自产拍av| 狠狠插狠狠插| 欧美在线免费观看一区| 国产精品久久国产三级国电话系列 | 免费观看黄色毛片| 国产乱一乱二乱三| 午夜精品一二三区| 国内偷拍一区| 国产女人和拘做受视频免费| 狠狠躁夜夜躁2020| 国产精品99一区二区三区| 国产精品欧美一区二区三区奶水| 少妇又紧又色又爽又刺激的视频 | 国产91刺激对白在线播放| 国产精品国产三级国产专区53| 日本午夜精品一区二区三区| 国产欧美日韩精品一区二区三区 | 国产精品一区二区日韩新区| 欧美日韩国产精品一区二区亚洲| 91精品一区| 国模一区二区三区白浆| 日本看片一区二区三区高清| 亚洲乱小说| 国产激情视频一区二区| 久久99国产视频| 国产精品麻豆自拍| 国产丝袜一区二区三区免费视频| 日韩电影在线一区二区三区| 国产精品一区二区av日韩在线| 久久久精品99久久精品36亚| 满春阁精品av在线导航 | 性欧美1819sex性高播放| 精品视频久| 国产一区在线免费| 99久久精品免费视频| 91麻豆产精品久久久| 91麻豆精品国产91久久久更新时间| 日韩精品一区二区中文字幕| 日韩久久电影| 欧美日韩一区二区三区在线播放| 午夜精品一二三区| 国产精品一级片在线观看| 少妇中文字幕乱码亚洲影视| 综合久久国产九一剧情麻豆| 国产精品午夜一区二区| 精品福利一区| 亚洲福利视频一区| 视频一区二区三区中文字幕| 99久久久国产精品免费调教网站| 狠狠躁天天躁又黄又爽| 少妇高清精品毛片在线视频| 久久一区二区视频| 国产精品96久久久| 欧美一区二区三区免费视频| 日韩午夜三级| 亚洲国产精品肉丝袜久久| 午夜三级电影院| 97精品国产aⅴ7777| 亚洲精品久久在线| 国产品久久久久久噜噜噜狼狼| 亚洲国产精品精品| 亚洲精品无吗| 在线国产精品一区二区| 91精品视频在线观看免费| 国产第一区在线观看| 国产精品一级在线| 性刺激久久久久久久久九色| 国产精品免费不卡| 午夜电影理伦片2023在线观看| 久久五月精品| 欧美精品一级二级| 年轻bbwbbw高潮| 热99re久久免费视精品频软件 | 精品一区二区三区影院| 亚洲精品久久久久999中文字幕| 日韩区欧美久久久无人区| 国偷自产一区二区三区在线观看| 免费毛片**| 国产美女视频一区二区三区| 大桥未久黑人强制中出| 国内偷拍一区| 日韩精品中文字幕一区二区| 少妇**毛片| 精品久久久久久中文字幕大豆网| **毛片免费| 免费精品一区二区三区第35| 久久九九亚洲| 999亚洲国产精| 国产亚洲精品久久19p| 午夜一区二区三区在线观看| 国产高清精品一区二区| 久久国产麻豆| 91黄在线看 | 日本伦精品一区二区三区免费| 欧美日韩综合一区| 精品午夜电影| 男人的天堂一区二区| 制服丝袜二区| 国产一区二区三区色噜噜小说| 色综合欧美亚洲国产| 久久99久久99精品免观看软件 | 免费欧美一级视频| 国产午夜精品免费一区二区三区视频 | 色噜噜狠狠色综合中文字幕 | 91嫩草入口|