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

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

我在处理中断方面微调了RNG函数的基准,所以我需要一个很好的方法来人为地和可重复地产生中断。 例如,我可以将某些东西redirect到生成300个中断或类似事件的Procfs接口。

是否像在内核中运行某种函数那样容易产生中断?

是否有某种中断不会实际执行“Anything”,但是仍会经历整个中断处理程序path? 我意识到我只能键入键或类似的东西,但这不是真正可重复和脚本的研究目的。

我正在使用x86架构。

Solutions Collecting From Web of "如何在Linux内核中生成“人造”中断?"

这是一个潜在的解决方案,它会产生虚假的键盘中断,从内核的PoV中无法确定这些中断是不是真实的。

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

我没有测试下面的代码,并且不能提供任何保证,但是我相信如果作为内核模块的一部分运行,它应该可以工作。

下面的代码片段显示了如何强制将一个键插入键盘控制器的缓冲区。 如果没有插入一个真正的PS / 2键盘(或在BIOS中具有Legacy USB支持的USB键盘),这将不起作用。 该代码是从一个SMM键盘记录文章复制到Phrack

代码在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") ,它也应该可以工作,但这可能会混淆内核。

只需启动一个高分辨率计时器:

 struct hrtimer timer; hrtimer_init(&timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); timer.function = my_little_timer; hrtimer_start(&timer, ktime_set(0, 500000000 /* ns */), HRTIMER_MODE_REL); ... hrtimer_cancel(&timer); ... enum hrtimer_restart my_little_timer(struct hrtimer *timer) { // either: hrtimer_forward_now(timer, ktime_set(...)); return HRTIMER_RESTART; // or: return HRTIMER_NORESTART; }