如何在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

为什么打印出负变量?

如何在linux中使用get_random_bytes函数?

你看到负数是有意义的。 假设sizeof(int)= 4个字节,则要求get_random_bytes填充从address &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); int rand = 0; get_random_bytes(&rand, sizeof(int)-1);