如何在Linux内核中生成“人为”中断?
我在这里读到了答案:
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处理键盘中断,读取我们的伪扫描码,并为您生成一些随机性. 请注意,如果你只运行asm(“int $33”)而不运行代码的第一部分,它也应该工作,但这可能会混淆内核. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |