2012-04-01 120 views
1

我必須做一個設備驅動程序,返回一個介於1 - 50之間的隨機數,並且困惑於我的設備驅動程序的緩衝區如何工作,以及如何去讓它表現得像/ dev/random一樣。使我自己的/ dev /隨機,緩衝區不工作,c

我做了一個測試程序,看看如何的/ dev /隨機作品:

int test_read = open("/dev/random", O_RDONLY); 
int get_random_num(void) { 

    unsigned int random_num; 
    read(test_read, &random_num, sizeof(random_num)); 
    return (random_num % 50) + 1; 
} 

,然後這是我的設備驅動程序的讀取功能(concised版):

my_random_read(struct file* file, char* buf, 
         size_t count, loff_t* ppos) 
{ 
    unsigned int random_num; 
    get_random_bytes(&random_num, 1); 
    int my_num = 1 + (random_num % 50) 

    int* my_num_pointer = &my_num; 

    copy_to_user(buf, my_num_pointer, count); 
} 

當我運行我的QEMU上的測試儀我得到-1074311964:/

我該怎麼做才能讓我所要做的就是用/ dev/my_random替換/ dev/random?

這是如何我從/ dev/my_random閱讀:

read(test_read, &random_number, sizeof(random_number), 0); 
+1

我不明白這個問題。你已經發布了一個代碼片段,然後你問如何模擬'/ dev/random',但你的問題標題暗示有一個錯誤。 – 2012-04-01 01:36:49

+0

@OliCharlesworth編譯並加載我的設備驅動程序(其中的代碼段來自),我從/ dev/my_random讀取,返回的是-1074311964。 – Tim 2012-04-01 01:40:34

回答

2
unsigned int random_num; 
get_random_bytes(&random_num, 1); 

您使用get_random_bytes()不正確。第二個參數是不是字節數,字數:

void get_random_bytes(void *buf, int nbytes) 

你進一步恢復專用內核內存到用戶空間:

my_random_read(struct file* file, char* buf, 
         size_t count, loff_t* ppos) 
{ 
    /* ... */ 
    int* my_num_pointer = &my_num; 
    copy_to_user(buf, my_num_pointer, count); 
} 

你在count進行沒有驗證 - - 這裏只有一個,也許是兩個字節的實際隨機數據。其餘的數據是垃圾堆棧數據,你已經將它泄漏到這裏的用戶空間。這是一個安全漏洞 - 內核不應該將未初始化的數據泄漏到用戶空間。 (它可能是垃圾依靠它自己,但攻擊者從/dev/random要求10頁的數據不應該得到原始內核內存。)

+0

感謝您的回覆。我會嘗試在get_random_bytes中使用sizeof(),並將count數限制爲1. – Tim 2012-04-01 01:51:07

+0

您不希望將'count'限制爲'1',因爲這只是一個字節。 'sizeof'可能是更好的答案。 – sarnold 2012-04-01 01:51:52

+0

好吧,我做了更改,並把一個printk之後:int my_num = 1 +(random_num%50),它打印出一個介於1和50之間的數字,但用戶空間測試程序仍在打印垃圾信息,如-1079978156 – Tim 2012-04-01 01:58:21