Linux内核:如何捕获按键并用另一个键替换它?

Linux内核:如何捕获按键并用另一个键替换它?,第1张

概述我试图涉足低级编程.我的目标是让用户在终端中键入密钥,捕获并输出另一个密钥.因此,例如,如果用户键入“a”,我会键入“b”,如果他键入“b”,则输出“c”等.这样做的步骤是什么?我已经熟悉如何访问Linux内核源代码,编译它并使用它.谢谢.最佳答案考虑下一个简单的内核模块#include <linux/kernel.h> #include &lt

我试图涉足低级编程.我的目标是让用户在终端中键入密钥,捕获并输出另一个密钥.因此,例如,如果用户键入“a”,我会键入“b”,如果他键入“b”,则输出“c”等.

这样做的步骤是什么?我已经熟悉如何访问Linux内核源代码,编译它并使用它.

谢谢.

最佳答案考虑下一个简单的内核模块

#include 

这是最简单和最原始的key-logger.它可以很容易地重新替换scan code.

免责声明

>此模块不是跨平台的(仅适用于x86架构,因为它使用的是inb()函数)
>我相信它只适用于PS / 2键盘(不适用于USB键盘)
>它在硬件IRQ处理程序中执行缓慢的I / O *** 作(我的意思是pr_info()),应该避免(理想情况下应该使用threaded IRQs)).

但我认为这对教育目的有好处 – 它非常小并且很好地展示了这个想法(没有搞乱像input_dev,input_register_device(),serio_write(),input_event(),input_report_key()等API).

细节

真正的中断处理程序(在keyboard driver中)作为共享中断请求,这允许我们也请求中断,从而在我们的ISR中处理它(除了原始键盘驱动程序中的ISR).中断请求在kbd2_init()中完成.

该模块的工作原理如下:

>捕获按键事件(为每个按键事件调用硬件中断处理程序kbd2_isr())
>读取按键的扫描码(通过inb()功能)
>并通过pr_info()打印

现在,您想要替换该扫描代码.我相信你可以使用outb()函数(在x86上).所以我留给你.

如果您想知道为什么我们要求IRQ号为1,请参阅drivers/input/serio/i8042-io.h:

#else# define I8042_KBD_IRQ  1

另请务必检查此IRQ是否在drivers/input/serio/i8042.c中共享:

error = request_irq(I8042_KBD_IRQ,i8042_interrupt,"i8042",i8042_platform_device);

以下是i8042键盘控制器的文档:AT keyboard controller.

有用的常数

要避免使用magic numbers,您可以使用下一个定义.

从drivers/input/serio/i8042-io.h:

/* * Register numbers. */#define I8042_COMMAND_REG       0x64#define I8042_STATUS_REG        0x64#define I8042_DATA_REG          0x60

从include/linux/i8042.h:

/* * Status register bits. */#define I8042_STR_PARITY        0x80#define I8042_STR_TIMEOUT       0x40#define I8042_STR_AUXDATA       0x20#define I8042_STR_KEYLOCK       0x10#define I8042_STR_CMDDAT        0x08#define I8042_STR_muxerR        0x04#define I8042_STR_IBF           0x02#define I8042_STR_OBF           0x01
总结

以上是内存溢出为你收集整理的Linux内核:如何捕获按键并用另一个键替换它?全部内容,希望文章能够帮你解决Linux内核:如何捕获按键并用另一个键替换它?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1047002.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)