如何在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 int
或uint32_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);