欧美一区二区三区四区五区,人人看人人艹,亚洲一区二区中文,99精品视频99,亚洲精品欧美综合四区,国产三区视频在线观看,日韩在线观看一区二区,久久精品色
     
     
    類 型:
    頻 道:
    關(guān)鍵字:
     
     
       位置: 中華職工學(xué)習(xí)網(wǎng) >> 職工學(xué)習(xí)中心 >> 工程技術(shù)人員 >> 計算機(jī)與應(yīng)用工程技術(shù)人員 >> 正文
     
      標(biāo) 題:基于Linux內(nèi)核的鍵盤模擬實現(xiàn)
      日 期:2007/6/5  源 自:中華職工學(xué)習(xí)網(wǎng) 【字體: 字體顏色
     
    1  引言
      當(dāng)前,由于Linux資源完全公開,使得Linux的發(fā)展日益廣泛快速。基于Linux的各種應(yīng)用已逐漸深入日常生活的方方面面,尤其是在嵌入式領(lǐng)域,由于內(nèi)核可裁減定制,因此可隨意地根據(jù)用戶需求進(jìn)行整個系統(tǒng)的定制與重構(gòu)。其中,我們可以通過對各種標(biāo)準(zhǔn)外部設(shè)備的驅(qū)動進(jìn)行改造,從而實現(xiàn)用戶對標(biāo)準(zhǔn)設(shè)備的特定需求,例如可以通過對鍵盤的模擬來實現(xiàn)操作的自動化,從而可以避免重復(fù)的鍵盤操作。
      
      2  Linux內(nèi)核支持的外部調(diào)用接口
      由于Linux內(nèi)核作為系統(tǒng)最深層次的核心,因此外部的開發(fā)人員并不能直接對內(nèi)核進(jìn)行操作。然而在一些應(yīng)用程序的開發(fā)過程中,又不得不使用內(nèi)核的某些功能,因此就提供了一些外部接口供開發(fā)人員直接與底層內(nèi)核打交道。
      2.1  中斷
      在Linux 下,硬件中斷叫做IRQ(Interrupt Requests)。有兩種IRQ,短類型和長類型。短IRQ需要很短的時間,在此期間機(jī)器的其他部分被鎖定,而且沒有其他中斷被處理。一個長IRQ需要較長的時間,在此期間可能發(fā)生其他中斷(但不是發(fā)自同一個設(shè)備)。如果可能的話,最好把一個中段聲明為長類型。如果CPU接到一個中斷,它就會停止一切工作(除非它正在處理一個更重要的中斷,在這種情況下要等到更重要的中斷處理結(jié)束后才會處理這個中斷),把相關(guān)的參數(shù)存儲到棧里,然后調(diào)用中斷處理程序。這意味著在中斷處理程序本身中有些事情是不允許的,因為這時系統(tǒng)處在一個未知狀態(tài)。解決這個問題的方法是讓中斷處理程序做需要馬上做的事,通常是從硬件讀取信息或給硬件發(fā)送信息,然后把對新信息的處理調(diào)度到以后去做。
      實現(xiàn)的方法是在接到相關(guān)的IRQ(在Intel平臺上有16個IRQ)時調(diào)用中斷處理程序。這個函數(shù)接到IRQ號碼、函數(shù)名、標(biāo)志、一個/proc/interrupts的名字和傳給中斷處理程序的一個參數(shù)。標(biāo)志中可以包括 SA_SHIRQ來表明你希望和其他處理程序共享此IRQ(通常很多設(shè)備公用一個IRQ),或者一個SA_INTERRUPT表明這是一個緊急中斷。這個函數(shù)僅在此IRQ沒有其他處理程序或需要共享所有處理程序時才會成功運行。
      2.2  系統(tǒng)調(diào)用
      系統(tǒng)調(diào)用發(fā)生在用戶進(jìn)程,通過一些特殊的函數(shù)來請求內(nèi)核提供服務(wù)。這時,用戶進(jìn)程被掛起,內(nèi)核驗證用戶請求,嘗試執(zhí)行并把結(jié)果反饋給用戶進(jìn)程,接著用戶進(jìn)程重新啟動。一般當(dāng)前系統(tǒng)的系統(tǒng)調(diào)用作為一張表sys_call_table進(jìn)行定義的,是由指向?qū)崿F(xiàn)各種系統(tǒng)調(diào)用的內(nèi)核函數(shù)的函數(shù)指針組成的表。具體參數(shù)參見Linux內(nèi)核源代碼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  鉤子函數(shù)
      鉤子(HOOK)是Linux系統(tǒng)中非常重要的系統(tǒng)接口,用它可以截獲并處理送給其他應(yīng)用程序的消息,來完成普通應(yīng)用程序難以實現(xiàn)的功能。鉤子可以監(jiān)視系統(tǒng)或進(jìn)程中的各種事件消息,截獲發(fā)往目標(biāo)的消息并進(jìn)行處理。這樣就可以在系統(tǒng)中安裝自定義的鉤子,監(jiān)視系統(tǒng)中特定事件的發(fā)生,完成特定的功能,比如截獲鍵盤、鼠標(biāo)的輸入,屏幕取詞,日志監(jiān)視等等。可見,利用鉤子可以實現(xiàn)許多特殊而有用的功能。
      
      3  鍵盤工作機(jī)理
      CPU對外部設(shè)備的管理是通過中斷程序進(jìn)行的,鍵盤也是一種外部設(shè)備,因此,CPU對鍵盤的管理也是通過中斷進(jìn)行的。當(dāng)你擊打鍵盤的時候,鍵盤控制器會向CPU提出中斷申請,CPU響應(yīng)此中斷進(jìn)行處理,這就完成了一次很簡單與人之間通過鍵盤進(jìn)行的交互。
      首先,當(dāng)輸入一個鍵盤值的時候,鍵盤將會發(fā)送相應(yīng)的scancodes給鍵盤驅(qū)動。一個獨立的擊鍵可以產(chǎn)生一個六個scancodes的隊列。鍵盤驅(qū)動中的 handle_ scancode()函數(shù)解析scancodes流并通過kdb_translate()函數(shù)里的轉(zhuǎn)換表(translation-table)將擊鍵事件和鍵的釋放事件(key release events)轉(zhuǎn)換成連續(xù)的keycode。例如,'a'的keycode是30。擊鍵'a'的時候便會產(chǎn)生keycode 30。釋放a鍵的時候會產(chǎn)生keycode 158(128+30)。
      然后,這些keycode通過對keymap的查詢被轉(zhuǎn)換成相應(yīng)key符號。獲得的字符被送入raw tty隊列—tty_flip_buffer。receive_buf()函數(shù)周期性的從tty_flip_buffer中獲得字符,然后把這些字符送入 tty read隊列。
      當(dāng)用戶進(jìn)程需要得到用戶的輸入的時候,它會在進(jìn)程的標(biāo)準(zhǔn)輸入(stdin)調(diào)用read()函數(shù)。sys_read()函數(shù)調(diào)用定義在相應(yīng)的tty設(shè)備(如/dev/tty0)的file_operations結(jié)構(gòu)中指向tty_read的read()函數(shù)來讀取字符并且返回給用戶進(jìn)程。
      
      4  鍵盤模擬的實現(xiàn)
      通常情況下,對鍵盤模擬的實現(xiàn)一般是通過寫一個自己的鍵盤中斷句柄來實現(xiàn),但這種方法容易導(dǎo)致系統(tǒng)崩潰。因此,在這種方法的基礎(chǔ)上可以利用勾子函數(shù)來實現(xiàn)。
      如附圖所示,這里主要用到的勾子函數(shù)包括handle_ scancode(),put_queue(),receive_buf(),tty_read()和sys_read()等函數(shù)。
      
      4.1  handle_scancode函數(shù)
      handle_scancode函數(shù)是鍵盤驅(qū)動程序中的一個入口函數(shù)(參見文件/usr/src/linux/drives/char/keyboard.c):
      void handle_scancode(unsigned char scancode, int down);
      這里通過替換原始的handle_scancode()函數(shù)來實現(xiàn)紀(jì)錄所有的scancode。即將原始的值保存,把新的值注冊進(jìn)去,從而實現(xiàn)所需要的功能,最后再調(diào)用回到原始值的情況下。當(dāng)此新的功能函數(shù)完成后,我們就可以記錄下鍵盤上的正確的擊鍵行為了(其中可以包括一些特殊的key,如ctrl, alt,shift,print screen等等)。
      4.2  put_queue函數(shù)
      handle_scancode()函數(shù)會調(diào)用put_queue函數(shù),用來將字符放入tty_queue。
      put_queue函數(shù)在內(nèi)核中定義如下:
      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函數(shù)
      底層tty驅(qū)動調(diào)用receive_buf()這個函數(shù)用來發(fā)送硬件設(shè)備接收處理的字符。參見/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)
      參數(shù)cp是一個指向設(shè)備接收的輸入字符的buffer的指針。參數(shù)fp是一個指向一個標(biāo)記字節(jié)指針的指針。在具體的實現(xiàn)中,先保存原始的tty receive_buf()函數(shù),然后重置ldisc.receive_buf到自定義的new_receive_buf()函數(shù)來記錄用戶的輸入。
      例如:要記錄在終端tty1設(shè)備上的輸入。
      int fd = open("/dev/tty1", O_RDONLY, 0);
      struct file *file = fget(fd);
      struct tty_struct *tty = file->private_data;
      //保存原始的receive_buf()函數(shù)
      old_receive_buf = tty->ldisc.receive_buf;
      //替換成新的new_receive_buf函數(shù)
      tty->ldisc.receive_buf = new_receive_buf;   
      //新的new_receive_buf函數(shù)
      void new_receive_buf(struct tty_struct *tty, const unsigned char *cp, char *fp, int count)
      {   
      logging(tty, cp, count);    
      //紀(jì)錄用戶擊鍵
      /* 調(diào)用回原來的receive_buf */
      (*old_receive_buf)(tty, cp, fp, count);
      }
      4.4  tty_read函數(shù)
      當(dāng)一個進(jìn)程需要通過sys_read()函數(shù)來讀取一個tty終端的輸入字符時,tty_read函數(shù)就會被調(diào)用。參見文件/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  結(jié)束語
      目前,利用勾子函數(shù)實現(xiàn)基于Linux內(nèi)核的鍵盤模擬的這種方法使用非常靈活,同時也可以跨平臺進(jìn)行移植,可通過tty和pts來記錄下本地和遠(yuǎn)程會話的所有擊鍵動作,并且也支持一些特殊的按鍵。當(dāng)然,要使鍵盤模擬更靈活,下一步還需要更多的改進(jìn),例如增加多種不同日志記錄模式的支持等。
     
    [打印此文][關(guān)閉窗口][返回頂部
     
    主站蜘蛛池模板: 欧美一区二区精品久久| 狠狠色丁香久久婷婷综合_中| 亚洲欧洲国产伦综合| 国产一区在线免费| 欧美一区二区三区四区五区六区| 456亚洲精品| 国产精品久久国产三级国电话系列| 久久三级精品| 国产日韩欧美在线影视| 精品国产一二三四区| 午夜生活理论片| www亚洲精品| 久久免费视频一区| 女人被爽到高潮呻吟免费看 | 鲁一鲁一鲁一鲁一鲁一av| 国产aⅴ精品久久久久久| 公乱妇hd在线播放bd| 最新日韩一区| 7799国产精品久久99| 一区二区三区四区视频在线| 躁躁躁日日躁网站| 99视频国产在线| 国产精品欧美一区二区三区| 自拍偷在线精品自拍偷写真图片| 亚洲国产精品一区在线| 免费a级毛片18以上观看精品 | 国产欧美精品一区二区三区小说| 久久福利视频网| 一色桃子av| 国产伦精品一区二区三区免费优势| 欧美日韩一卡二卡| 日本午夜一区二区| **毛片在线| 国产精品一区在线播放| 欧美午夜理伦三级在线观看偷窥| 香蕉视频在线观看一区二区| 天堂av色婷婷一区二区三区| 久久久久久久久久国产精品| 国产白嫩美女在线观看| 国产无套精品久久久久久| 91在线一区| 国产韩国精品一区二区三区| 日韩av在线播| 国产午夜亚洲精品羞羞网站| 国产女人与拘做受免费视频| 午夜激情看片| 99久久精品国产系列| 日韩有码一区二区三区| 视频二区一区国产精品天天| 日韩av在线免费电影| 国产精品视频99| 一区二区欧美视频| 国产午夜精品一区| 亚洲欧美一区二区精品久久久 | 狠狠色噜噜狠狠狠888奇米| 99视频国产精品| 日本精品三区| 夜夜夜夜夜猛噜噜噜噜噜gg| 午夜激情影院| 偷拍久久精品视频| 欧美亚洲视频一区| 欧美激情在线免费| 8x8x国产一区二区三区精品推荐| 91丝袜诱惑| 97久久精品一区二区三区观看| 99国产精品一区二区| 销魂美女一区二区| 狠狠色噜噜狠狠狠狠69| 欧美视屏一区| 久久一级精品视频| www.成| 51区亚洲精品一区二区三区| 99er热精品视频国产| 高清欧美xxxx| 精品一区欧美| 中文乱码在线视频| 国产91视频一区| 热re99久久精品国99热蜜月| 国产欧美精品一区二区在线播放| 亚洲天堂国产精品| 大bbw大bbw巨大bbw看看| 国产专区一区二区| 好吊妞国产欧美日韩软件大全| 欧美髙清性xxxxhdvid| 狠狠色噜噜狠狠狠四色米奇| 中文字幕一区一区三区| 久久99精品一区二区三区| 欧美日韩国产一区在线| 一本一道久久a久久精品综合蜜臀| 日韩一级视频在线| 免费观看黄色毛片| 美女被羞羞网站视频软件| 国产乱码精品一区二区三区介绍 | 夜色av网| 国产精品一区久久人人爽| 99久久国产综合| 中文无码热在线视频| 精品美女一区二区三区| 91精品免费观看| 日本精品三区| 91麻豆精品国产自产欧美一级在线观看 | 日韩精品999| 欧美一区二区三区久久综合| 国产免费第一区| 国产免费一区二区三区四区五区 | 亚洲福利视频一区二区| 欧美一区二区三区片| 国产日韩欧美一区二区在线播放| 日韩精品一区二区中文字幕| 国产91电影在线观看| 又黄又爽又刺激久久久久亚洲精品| 久久午夜精品福利一区二区| 亚洲欧美日韩精品suv| 日本午夜一区二区| 日韩精品一区中文字幕| 国产精品自产拍在线观看蜜| www亚洲精品| 年轻bbwwbbww高潮| 国产精品1234区| 日本美女视频一区二区三区| 最新日韩一区| 久久国产精品麻豆| 夜夜嗨av色一区二区不卡| 99久久夜色精品国产网站| 日韩av在线中文| 欧美一区二区三区爽大粗免费| 日韩av片无码一区二区不卡电影| 国产不卡网站| 国产午夜精品一区二区三区最新电影 | 精品91av| 久久精品国语| 国产精品久久久久久久久久久久久久久久久久 | 538国产精品一区二区免费视频| 丰满岳乱妇在线观看中字 | 国产亚洲精品久久久久久久久动漫| 国产精品99999999| 中文字幕一区二区三区不卡| 午夜wwwww| 国产精品视频1区2区3区| 国产一区二区极品| 国产乱xxxxx97国语对白| 一级午夜电影| 一区二区欧美精品| 午夜码电影| 欧美日韩国产一区在线| 日韩中文字幕在线一区二区| 99国产精品一区二区| 日韩一区免费| 少妇高潮ⅴideosex| 91久久免费| 国产床戏无遮挡免费观看网站| 精品一区二区超碰久久久| 亚洲精品日本久久一区二区三区 | 素人av在线| 日韩精品免费看| 鲁丝一区二区三区免费| 激情久久综合网| 九九久久国产精品| 国产91九色在线播放| 欧美日韩九区| 日本福利一区二区| 国产69精品久久久久app下载| 国产精品一区二区中文字幕| 精品日韩久久久| **毛片在线免费观看| 国产一区影院| 亚洲四区在线观看| 国产精品香蕉在线的人| 久久er精品视频| 国产欧美一区二区在线| 久久久久久久亚洲视频| 国产精品区一区二区三| 亚洲日韩aⅴ在线视频| 一区二区国产盗摄色噜噜| 欧美日韩一二三四区| 激情欧美一区二区三区| 久久国产精品二区| 国内精品久久久久久久星辰影视| 久久久久亚洲国产精品| 精品综合久久久久| 波多野结衣巨乳女教师| 91精彩刺激对白露脸偷拍| 国产日韩欧美网站| 国产二区不卡| 国产一区二区三区影院| 中文丰满岳乱妇在线观看| 国产伦精品一区二区三区免费优势| 精品久久二区| 最新国产精品自拍| 国产一区二区三区乱码| 97久久精品人人做人人爽50路| 国产精品久久久不卡| 在线国产精品一区二区| 国产在线一卡二卡| 高清在线一区二区| 91国偷自产一区二区介绍| 中文字幕日韩一区二区| 黄色香港三级三级三级| 少妇性色午夜淫片aaa播放5| 国产精品久久免费视频| 国产精品久久久久久一区二区三区| 久久一区二区三区欧美| 狠狠色噜噜狠狠狠狠69| 国产视频二区| 欧美日韩国产精品一区二区三区| 国产精品亚洲一区二区三区| 午夜看大片| 亚洲国产精品入口| 亚洲国产精品国自产拍av| 欧美大成色www永久网站婷| 不卡在线一区二区| 欧美一区二区三区免费看| 最新av中文字幕| 搡少妇在线视频中文字幕| 一区二区三区欧美日韩| 欧美日韩一级二级| 日韩av一二三四区| 国产伦理精品一区二区三区观看体验| 午夜精品一二三区| 午夜亚洲影院| 国产精品亚州| 久久久久国产精品嫩草影院| 午夜av片| 狠狠色噜噜狠狠狠狠黑人| 国产视频二区在线观看| 大伊人av| 色综合久久精品| 亚洲精品国产一区| 狠狠色很很在鲁视频| 国产在线卡一卡二| 综合久久国产九一剧情麻豆| 精品国产二区三区| 国产精品国产三级国产aⅴ下载| 99国产精品一区二区| 在线国产精品一区二区| 欧美性受xxxx狂喷水| 国产午夜精品理论片| 国产亚洲精品久久午夜玫瑰园| 91亚洲精品国偷拍自产| 国产精品久久久区三区天天噜| 欧美极品少妇videossex| 国产一区二区三区精品在线| 日韩久久电影| 久久中文一区| 香港三日本8a三级少妇三级99| 国产亚洲精品久久777777|