[英]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.