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

Ric*_*ner 5 c linux linux-kernel

我在这里阅读了答案:触发内核中断处理程序:如何?这是一个很好的,但不完全是我需要的。

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

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

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

我正在使用 x86 架构。

tux*_*ux3 4

这是一个生成假键盘中断的潜在解决方案,从内核的 PoV 来看,无法判断这些中断不是真实的。

只有使用 SA_SAMPLE_RANDOM 安装的中断处理程序才会生成熵,这消除了用于此目的的系统调用。然而键盘中断确实会产生熵。

我尚未测试以下代码,并且无法提供任何保证,但我相信如果作为内核模块的一部分运行,它应该可以工作。

以下代码片段显示了如何将按键强制插入键盘控制器的缓冲区中。如果未插入真正的 PS/2 键盘(或 BIOS 中支持传统 USB 的 USB 键盘),此功能将不起作用。此代码复制自 Phrack 上的 SMM 键盘记录器文章

该代码位于 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
Run Code Online (Sandbox Code Playgroud)

然后生成键盘中断:

int 33
Run Code Online (Sandbox Code Playgroud)

中断 33 通常是 PS/2 键盘。这将导致 Linux 处理键盘中断,读取我们的假扫描代码,并为您生成一些随机性。您将希望在循环中调用此方法,但要小心,Linux 部分基于两个中断之间的间隔生成随机性,如果您以固定间隔强制中断,则从该方法中获得的熵非常少。

请注意,如果您只是不运行代码的第一部分,它也应该可以工作asm("int $33"),但这可能会使内核感到困惑。