簡體   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