基于Linux内核的键盘模拟实现

上传人:卢** 文档编号:115827902 上传时间:2022-07-04 格式:DOC 页数:4 大小:17KB
收藏 版权申诉 举报 下载
基于Linux内核的键盘模拟实现_第1页
第1页 / 共4页
基于Linux内核的键盘模拟实现_第2页
第2页 / 共4页
基于Linux内核的键盘模拟实现_第3页
第3页 / 共4页
资源描述:

《基于Linux内核的键盘模拟实现》由会员分享,可在线阅读,更多相关《基于Linux内核的键盘模拟实现(4页珍藏版)》请在装配图网上搜索。

1、基于Linux内核的键盘模拟实现关键词:系统调用勾子函数键盘模拟1引言当前,由于Linux资源完全公开,使得Linux的开展日益广泛快速。基于Linux的各种应用已逐渐深化日常生活的方方面面,尤其是在嵌入式领域,由于内核可裁减定制,因此可随意地根据用户需求进展整个系统的定制与重构。其中,我们可以通过对各种标准外部设备的驱动进展改造,从而实现用户对标准设备的特定需求,例如可以通过对键盘的模拟来实现操作的自动化,从而可以防止重复的键盘操作。2Linux内核支持的外部调用接口由于Linux内核作为系统最深层次的核心,因此外部的开发人员并不能直接对内核进展操作。然而在一些应用程序的开发过程中,又不得不

2、使用内核的某些功能,因此就提供了一些外部接口供开发人员直接与底层内核打交道。2.1中断在Linux下,硬件中断叫做IRQ(InterruptRequests)。有两种IRQ,短类型和长类型。短IRQ需要很短的时间,在此期间机器的其他局部被锁定,而且没有其他中断被处理。一个长IRQ需要较长的时间,在此期间可能发生其他中断(但不是发自同一个设备)。假如可能的话,最好把一个中段声明为长类型。假如PU接到一个中断,它就会停顿一切工作(除非它正在处理一个更重要的中断,在这种情况下要等到更重要的中断处理完毕后才会处理这个中断),把相关的参数存储到栈里,然后调用中断处理程序。这意味着在中断处理程序本身中有些

3、事情是不允许的,因为这时系统处在一个未知状态。解决这个问题的方法是让中断处理程序做需要马上做的事,通常是从硬件读取信息或给硬件发送信息,然后把对新信息的处理调度到以后去做。实现的方法是在接到相关的IRQ(在Intel平台上有16个IRQ)时调用中断处理程序。这个函数接到IRQ号码、函数名、标志、一个/pr/interrupts的名字和传给中断处理程序的一个参数。标志中可以包括SA_SHIRQ来说明你希望和其他处理程序共享此IRQ(通常很多设备公用一个IRQ),或者一个SA_INTERRUPT说明这是一个紧急中断。这个函数仅在此IRQ没有其他处理程序或需要共享所有处理程序时才会成功运行。2.2系

4、统调用系统调用发生在用户进程,通过一些特殊的函数来恳求内核提供效劳。这时,用户进程被挂起,内核验证用户恳求,尝试执行并把结果反应给用户进程,接着用户进程重新启动。一般当前系统的系统调用作为一张表sys_all_table进展定义的,是由指向实现各种系统调用的内核函数的函数指针组成的表。详细参数参见Linux内核源代码arh/i386/kernel/entry.S文件中:ENTRY(sys_all_table)llngSYBL_NAE(sys_ni_sysall)/*0-ldsetup()systeall*/llngSYBL_NAE(sys_exit)llngSYBL_NAE(sys_ni_sy

5、sall)/*streas2*/llngSYBL_NAE(sys_vfrk)/*190*/2.3钩子函数钩子(HK)是Linux系统中非常重要的系统接口,用它可以截获并处理送给其他应用程序的消息,来完成普通应用程序难以实现的功能。钩子可以监视系统或进程中的各种事件消息,截获发往目的的消息并进展处理。这样就可以在系统中安装自定义的钩子,监视系统中特定事件的发生,完成特定的功能,比方截获键盘、鼠标的输入,屏幕取词,日志监视等等。可见,利用钩子可以实现许多特殊而有用的功能。3键盘工作机理PU对外部设备的管理是通过中断程序进展的,键盘也是一种外部设备,因此,PU对键盘的管理也是通过中断进展的。当你击打

6、键盘的时候,键盘控制器会向PU提出中断申请,PU响应此中断进展处理,这就完成了一次很简单与人之间通过键盘进展的交互。首先,当输入一个键盘值的时候,键盘将会发送相应的sandes给键盘驱动。一个独立的击键可以产生一个六个sandes的队列。键盘驱动中的handle_sande()函数解析sandes流并通过kdb_translate()函数里的转换表(translatin-table)将击键事件和键的释放事件(keyreleaseevents)转换成连续的keyde。例如,a的keyde是30。击键a的时候便会产生keyde30。释放a键的时候会产生keyde158(128+30)。然后,这些k

7、eyde通过对keyap的查询被转换成相应key符号。获得的字符被送入ratty队列tty_flip_buffer。reEive_buf()函数周期性的从tty_flip_buffer中获得字符,然后把这些字符送入ttyread队列。当用户进程需要得到用户的输入的时候,它会在进程的标准输入(stdin)调用read()函数。sys_read()函数调用定义在相应的tty设备(如/dev/tty0)的file_peratins构造中指向tty_read的read()函数来读取字符并且返回给用户进程。4键盘模拟的实现通常情况下,对键盘模拟的实现一般是通过写一个自己的键盘中断句柄来实现,但这种方法容

8、易导致系统崩溃。因此,在这种方法的根底上可以利用勾子函数来实现。如附图所示,这里主要用到的勾子函数包括handle_sande(),put_queue(),reeive_buf(),tty_read()和sys_read()等函数。附图键盘驱动原理图4.1handle_sande函数handle_sande函数是键盘驱动程序中的一个入口函数(参见文件/usr/sr/linux/drives/har/keybard.):vidhandle_sande(unsignedharsande,intdn);这里通过交换原始的handle_sande()函数来实现纪录所有的sande。即将原始的值保存,把

9、新的值注册进去,从而实现所需要的功能,最后再调用回到原始值的情况下。当此新的功能函数完成后,我们就可以记录下键盘上的正确的击键行为了(其中可以包括一些特殊的key,如trl,alt,shift,printsreen等等)。4.2put_queue函数handle_sande()函数会调用put_queue函数,用来将字符放入tty_queue。put_queue函数在内核中定义如下:vidput_queue(inth)ake_up(keypress_ait);if(tty)tty_insert_flip_har(tty,h,0);n_shedule_flip(tty);4.3reEive_bu

10、f函数底层tty驱动调用reeive_buf()这个函数用来发送硬件设备接收处理的字符。参见/usr/sr/linux/drivers/har/n_tty.:statividn_tty_reeive_buf(struttty_strut*tty,nstunsignedhar*p,har*fp,intunt)参数p是一个指向设备接收的输入字符的buffer的指针。参数fp是一个指向一个标记字节指针的指针。在详细的实现中,先保存原始的ttyreeive_buf()函数,然后重置ldis.reeive_buf到自定义的ne_reeive_buf()函数来记录用户的输入。例如:要记录在终端tty1设备

11、上的输入。intfd=pen(/dev/tty1,_RDNLY,0);strutfile*file=fget(fd);struttty_strut*tty=file-private_data;/保存原始的reeive_buf()函数ld_reeive_buf=tty-ldis.reeive_buf;/交换成新的ne_reeive_buf函数tty-ldis.reeive_buf=ne_reeive_buf;/新的ne_reeive_buf函数vidne_reeive_buf(struttty_strut*tty,nstunsignedhar*p,har*fp,intunt)lgging(tty

12、,p,unt);/纪录用户击键/*调用回原来的reeive_buf*/(*ld_reeive_buf)(tty,p,fp,unt);4.4tty_read函数当一个进程需要通过sys_read()函数来读取一个tty终端的输入字符时,tty_read函数就会被调用。参见文件/usr/sr/linux/drives/har/tty_i.:statissize_ttty_read(strutfile*file,har*buf,size_tunt,lff_t*pps)5完毕语目前,利用勾子函数实现基于Linux内核的键盘模拟的这种方法使用非常灵敏,同时也可以跨平台进展移植,可通过tty和pts来记录下本地和远程会话的所有击键动作,并且也支持一些特殊的按键。当然,要使键盘模拟更灵敏,下一步还需要更多的改良,例如增加多种不同日志记录形式的支持等。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!