get_random_bytes为导出函数,nbytes为产生随机数的字节数,将数据写入到buf指向的地址。
void get_random_bytes(void *buf, int nbytes)
{
static void *previous;
warn_unseeded_randomness(&previous);
_get_random_bytes(buf, nbytes);
}
EXPORT_SYMBOL(get_random_bytes);
模块初始化函数不能为module_init,退出函数不能是module_exit?。
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/random.h>
static int __init random_init(void)
{
unsigned int random;
get_random_bytes(&random, sizeof(unsigned int));
printk("random value is : %d\n", random);
return 0;
}
static void __exit random_exit(void)
{
printk("get random value module exit!\n");
}
module_init(random_init);
module_exit(random_exit);
MODULE_LICENSE("GPL");
obj-m += get_random.o
get_random-y += module.o
PWD=$(shell pwd)
KDIR= /usr/lib/modules/$(shell uname -r)/build
all:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean
如何通过上述函数获取的随机数得到一个从start<= x <=end范围内的随机数?。
若需生成区间大小为size,区间起始位置为a的随机数:(右端点需小于RAND_MAX)
seed%size + a
例如生成[3, 7]内的随机数:(区间大小为5)
seed%5 + 3
生成函数如下所示:
unsigned int get_random_area(unsigned int start, unsigned int end, unsigned int seed)
{
unsigned int size, random;
size = end - start + 1;
random = seed % size + start;
return random;
}
module.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/random.h>
unsigned int get_random_area(unsigned int start, unsigned int end, unsigned int seed)
{
unsigned int size, random;
size = end - start + 1;
random = seed % size + start;
return random;
}
static int __init random_init(void)
{
unsigned int seed, random;
get_random_bytes(&seed, sizeof(unsigned int));
printk("seed value is : %d\n", seed);
random = get_random_area(3, 7, seed);
printk("random value is : %d\n", random);
return 0;
}
static void __exit random_exit(void)
{
printk("get random value module exit!\n");
}
module_init(random_init);
module_exit(random_exit);
MODULE_LICENSE("GPL");