创建自己的/dev/random,缓冲区不工作,c

创建自己的/dev/random,缓冲区不工作,c,c,random,buffer,driver,device,C,Random,Buffer,Driver,Device,我必须制作一个设备驱动程序,它返回一个介于1-50之间的随机数,我不知道设备驱动程序的缓冲区是如何工作的,以及如何让它像/dev/random一样工作 我制作了一个测试程序来查看/dev/random是如何工作的: int test_read = open("/dev/random", O_RDONLY); int get_random_num(void) { unsigned int random_num; read(test_read, &random_num, sizeo

我必须制作一个设备驱动程序,它返回一个介于1-50之间的随机数,我不知道设备驱动程序的缓冲区是如何工作的,以及如何让它像/dev/random一样工作

我制作了一个测试程序来查看/dev/random是如何工作的:

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;
}
这是我的设备驱动程序的读取功能(简明版):

当我在QEMU上运行测试仪时,我得到-1074311964:/

我如何使它成为我所要做的就是用/dev/my_random替换/dev/random

下面是我如何阅读/dev/my_random的:

    read(test_read, &random_number, sizeof(random_number), 0);
您使用的
get\u random\u 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页数据的攻击者不应该获得原始内核内存。)

我不理解这个问题。您发布了一个代码片段,然后询问如何模拟
/dev/random
,但您的问题标题暗示存在错误。@OliCharlesworth在我编译并加载设备驱动程序(代码片段的来源)后,我从/dev/my_random读取,返回的是-1074311964。感谢您的回复。我将尝试在get_random_bytes中使用sizeof(),并将计数限制为1。您也不希望将计数限制为1,因为这只是一个字节
sizeof
可能是更好的答案。好吧,我做了更改并在后面加了一个printk:int my_num=1+(random_num%50),它打印出了一个介于1和50之间的数字,但是用户空间测试程序仍然在打印垃圾,比如-1079978156Is
random_card
也是一个
未签名的int
?嗯,我都试过了,签名和未签名,但仍然不起作用。将int*传递给char*缓冲区是合法的??
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);
}