【问题标题】:How to use get_random_bytes() in linux kernel module?如何在 linux 内核模块中使用 get_random_bytes()?
【发布时间】:2016-12-04 17:33:01
【问题描述】:

我已经制作了简单的内核模块。

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函数?

【问题讨论】:

  • 可能是因为rand 包含一个负数。
  • 哦,那个函数也可以生成负数。感谢您的评论。
  • 好吧,它会生成随机字节。 int 是有符号类型,因此通过用随机字节填充它,我希望会出现负值。
  • 添加到@melpomene 的评论,也许 printf rand 为 unsigned int?作为 "%u" 而不是 "%d",并将 rand 声明为 "unsigned"。

标签: c linux


【解决方案1】:

看到负数是有道理的。假设 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);

【讨论】:

  • .@JayMedina:如何让它适用于 0 到 1 之间的随机值?
  • 要获得 0 到 1 之间的随机值,您可以先获取一个 0 到 100 的随机数,然后将后者除以 100。在此生成的随机数将具有 2 个小数位精度。
猜你喜欢
  • 2014-04-22
  • 2021-04-29
  • 2012-04-11
  • 2013-12-17
  • 2015-06-30
  • 2012-02-22
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多