2012-04-01 74 views
1

我必须做一个设备驱动程序,返回一个介于1 - 50之间的随机数,并且困惑于我的设备驱动程序的缓冲区如何工作,以及如何去让它表现得像/ dev/random一样。使我自己的/ dev /随机,缓冲区不工作,c

我做了一个测试程序,看看如何的/ dev /随机作品:

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; 
} 

,然后这是我的设备驱动程序的读取功能(concised版):

my_random_read(struct file* file, char* buf, 
         size_t count, loff_t* ppos) 
{ 
    unsigned int random_num; 
    get_random_bytes(&random_num, 1); 
    int my_num = 1 + (random_num % 50) 

    int* my_num_pointer = &my_num; 

    copy_to_user(buf, my_num_pointer, count); 
} 

当我运行我的QEMU上的测试仪我得到-1074311964:/

我该怎么做才能让我所要做的就是用/ dev/my_random替换/ dev/random?

这是如何我从/ dev/my_random阅读:

read(test_read, &random_number, sizeof(random_number), 0); 
+1

我不明白这个问题。你已经发布了一个代码片段,然后你问如何模拟'/ dev/random',但你的问题标题暗示有一个错误。 – 2012-04-01 01:36:49

+0

@OliCharlesworth编译并加载我的设备驱动程序(其中的代码段来自),我从/ dev/my_random读取,返回的是-1074311964。 – Tim 2012-04-01 01:40:34

回答

2
unsigned int random_num; 
get_random_bytes(&random_num, 1); 

您使用get_random_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页的数据不应该得到原始内核内存。)

+0

感谢您的回复。我会尝试在get_random_bytes中使用sizeof(),并将count数限制为1. – Tim 2012-04-01 01:51:07

+0

您不希望将'count'限制为'1',因为这只是一个字节。 'sizeof'可能是更好的答案。 – sarnold 2012-04-01 01:51:52

+0

好吧,我做了更改,并把一个printk之后:int my_num = 1 +(random_num%50),它打印出一个介于1和50之间的数字,但用户空间测试程序仍在打印垃圾信息,如-1079978156 – Tim 2012-04-01 01:58:21