2016-12-04 648 views
0

我製作了簡單的內核模塊。如何在Linux內核模塊中使用get_random_bytes()?

void cb_funct(unsigned long arg) // callback function. 
{ 
    int rand; 
    get_random_bytes(&rand, sizeof(rand)); 
    rand%=250; 

    seq_printf(m, "random number : %d\n", rand); 
    ... 
} 

我使用seq_printf函數打印出rand變量。

cb_funct函數被調用五次。

以下是結果。

隨機數:66

隨機數:-5

隨機數:135

隨機數:178

隨機數:-42

爲什麼打印出負變量?

如何使用get_random_bytes函數在linux?

+0

可能是因爲'rand'包含一個負數。 – melpomene

+0

哦,那個函數也會產生負數。謝謝你的評論。 – newbie16

+1

好吧,它會產生隨機字節。 'int'是一個有符號的類型,所以通過填充隨機字節,我期望負值出現。 – melpomene

回答

0

它是有道理的,你看到負數。假設sizeof(int)= 4個字節,則要求get_random_bytes填充從地址&rand開始的4個字節的隨機數。如果最高有效字節的最高有效位恰好爲1,那麼rand將爲負數。對於已簽名的變量(如int),最重要的位將聲明符號。 有多種事情,你可以做,如果這是一個問題:

  • 使用一個無符號的變量(unsigned intuint32_t,例如)。打印時,請記住使用%u或0x%x。
  • 在調用get_random_bytes之後掩蓋掉最重要的位。像這樣(再次,假設size(int)是4個字節):rand &= 0x7FFFFFFF。這會給你一個肯定的隨機數。
  • 要求get_random_bytes填充只有三個字節,所以它不會填滿最重要的字節。但是你的隨機數將在0 - 0xFFFFFF範圍內,而不是0 - 0xFFFFFFFF。你應該首先將你的變量初始化爲0。你可以這樣做:int rand = 0; get_random_bytes(&rand, sizeof(int)-1);