加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

如何在Linux内核中生成“人为”中断?

发布时间:2020-12-14 00:35:01 所属栏目:Linux 来源:网络整理
导读:我在这里读到了答案: Trigger Kernel Interrupt Handler: How?,这是一个很好的,但不是我需要的. 我正在对处理中断的RNG功能进行微基准测试,因此我需要一种人工和可重复生成中断的好方法.例如,我可以将某些内容重定向到一个生成300个中断或类似内容的Procfs
我在这里读到了答案: Trigger Kernel Interrupt Handler: How?,这是一个很好的,但不是我需要的.

我正在对处理中断的RNG功能进行微基准测试,因此我需要一种人工和可重复生成中断的好方法.例如,我可以将某些内容重定向到一个生成300个中断或类似内容的Procfs接口.

它是否像在内核中运行某种生成中断的函数一样简单?

是否有某种中断实际上没有“任何”,但仍然通过整个中断处理程序路径?我意识到我可以只键入键或类似的东西,但这对于研究目的来说并不是可重复的和可编写脚本的.

我正在使用x86架构.

解决方法

这是一个产生伪键盘中断的潜在解决方案,从内核的PoV中无法分辨出这些中断是不真实的.

只有安装了SA_SAMPLE_RANDOM的中断处理程序才会生成熵,这样可以消除系统调用.但键盘中断会产生熵.

我没有测试过以下代码,也无法提供任何保证,但我相信如果作为内核模块的一部分运行它应该可以工作.

以下代码片段显示了如何将键强制注入键盘控制器的缓冲区.如果未插入真正的PS / 2键盘(或BIOS中支持Legacy USB的USB键盘),则无法使用此功能.

代码在x86程序集中,您可以将其包装在内联汇编块asm(“”)中;如果你用C编写你的内核模块

; write command byte 0xD2 to command port 0x64
; to re-inject intercepted scan code into keyboard controller buffer
; so that OS keyboard interrupt can read and display it later
mov al,0xd2
out 0x64,al
; wait until keyboard controller is ready to read
_wait:
in al,0x64
test al,0x2
jnz _wait
; re-inject scan code for the key '1' 
mov ax,1
out 0x60,al

然后生成键盘中断做:

int 33

中断33通常是PS / 2键盘.这将导致Linux处理键盘中断,读取我们的伪扫描码,并为您生成一些随机性.
你需要在一个循环中调用它,但要小心,Linux会根据两个中断之间的间隔产生随机性,如果你以固定的间隔强制中断,你将获得这个方法的很少的熵.

请注意,如果你只运行asm(“int $33”)而不运行代码的第一部分,它也应该工作,但这可能会混淆内核.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读