繁体   English   中英

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

[英]How would one go about generating “artificial” interrupts in the Linux Kernel?

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

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

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

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

我正在使用x86架构。

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

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

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

以下代码片段显示了如何将键强制注入键盘控制器的缓冲区。 如果没有插入真正的PS / 2键盘(或BIOS中支持Legacy USB的USB键盘),这将无效。 此代码是从Phrack上的SMM键盘记录文章中复制的

代码在x86程序集中,您可以将其包装asm("");联汇编块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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM