jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
阅读:2355回复:17

斑竹救命啊

楼主#
更多 发布于:2007-04-15 13:31
  下面这段代码是小弟的毕业设计,斑竹能不能帮我指点下,能不能详细的分析代码的含义,能加点注释更加好。多谢斑竹了(急啊)
#include <linux/module.h>
#include <linux/jiffies.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/types.h>
#include <linux/random.h>
#include <linux/percpu.h>
#include <linux/init.h>

#include <asm/system.h>
#include <asm/uaccess.h>

struct nrnd_state {
    u32 s1, s2, s3;
};

static DEFINE_PER_CPU(struct nrnd_state, net_rand_state);

static u32 __net_random(struct nrnd_state *state)
{
#define TAUSWORTHE(s,a,b,c,d) ((s&c)<<d) ^ (((s <<a) ^ s)>>b)

    state->s1 = TAUSWORTHE(state->s1, 13, 19, 4294967294UL, 12);
    state->s2 = TAUSWORTHE(state->s2, 2, 25, 4294967288UL, 4);
    state->s3 = TAUSWORTHE(state->s3, 3, 11, 4294967280UL, 17);

    return (state->s1 ^ state->s2 ^ state->s3);
}  /////这块要怎么样来计算

static void __net_srandom(struct nrnd_state *state, unsigned long s)
{
    if (s == 0)
        s = 1;      /* default seed is 1 */

#define LCG(n) (69069 * n)
    state->s1 = LCG(s);
    state->s2 = LCG(state->s1);
    state->s3 = LCG(state->s2);

    /* "warm it up" */
    __net_random(state);
    __net_random(state);
    __net_random(state);
    __net_random(state);
    __net_random(state);
    __net_random(state);////这些又是什么意思?
}

///下面这快的随即数怎么来看?
unsigned long net_random(void)
{
    unsigned long r;
    struct nrnd_state *state = &get_cpu_var(net_rand_state);
    r = __net_random(state);
    put_cpu_var(state);
    return r;
}


void net_srandom(unsigned long entropy)
{
    struct nrnd_state *state = &get_cpu_var(net_rand_state);
    __net_srandom(state, state->s1^entropy);
    put_cpu_var(state);
}

void __init net_random_init(void)
{
    int i;

    for (i = 0; i < NR_CPUS; i++) {
        struct nrnd_state *state = &per_cpu(net_rand_state,i);
        __net_srandom(state, i+jiffies);
    }
}

static int net_random_reseed(void)
{
    int i;
    unsigned long seed[NR_CPUS];

    get_random_bytes(seed, sizeof(seed));
    for (i = 0; i < NR_CPUS; i++) {
        struct nrnd_state *state = &per_cpu(net_rand_state,i);
        __net_srandom(state, seed);
    }
    return 0;
}
late_initcall(net_random_reseed);

int net_msg_cost = 5*HZ;
int net_msg_burst = 10;

/*
 * All net warning printk()s should be guarded by this function.
 */
int net_ratelimit(void)
{
    return __printk_ratelimit(net_msg_cost, net_msg_burst);
}

EXPORT_SYMBOL(net_random);
EXPORT_SYMBOL(net_ratelimit);
EXPORT_SYMBOL(net_srandom);//最后这三个有什么作用?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-04-16 13:37
static u32 __net_random(struct nrnd_state *state)
{
#define TAUSWORTHE(s,a,b,c,d) ((s&c)<<d) ^ (((s <<a) ^ s)>>b)

   state->s1 = TAUSWORTHE(state->s1, 13, 19, 4294967294UL, 12);
   state->s2 = TAUSWORTHE(state->s2, 2, 25, 4294967288UL, 4);
   state->s3 = TAUSWORTHE(state->s3, 3, 11, 4294967280UL, 17);

   return (state->s1 ^ state->s2 ^ state->s3);
} /////这块要怎么样来计算

关键点:

    算法:((s&c)<<d) ^ (((s <<a) ^ s)>>b)
    关键数值:4294967294UL,4294967288UL,4294967280UL
    计算:计算s1,s2,s3,最后随机数为:s1^s2^s3
    
//-------------------------------------------------------------

/* "warm it up" */
   __net_random(state);
   __net_random(state);
   __net_random(state);
   __net_random(state);
   __net_random(state);
   __net_random(state);////这些又是什么意思?

关键点:
    6次计算state的s1,s2,s3,增加随机分布性
    
//-------------------------------------------------------------

///下面这快的随即数怎么来看?
unsigned long net_random(void)
{
   unsigned long r;
   struct nrnd_state *state = &get_cpu_var(net_rand_state);
   r = __net_random(state);
   put_cpu_var(state);
   return r;
}

关键点:

unsigned long net_random(void)
{
   unsigned long r;
  
   /* 获取当前cpu的随机持 */
   struct nrnd_state *state = &get_cpu_var(net_rand_state);
   /*计算随机数*/
   r = __net_random(state);
   put_cpu_var(state);
   return r;
}

//-------------------------------------------------------------

EXPORT_SYMBOL(net_random);
EXPORT_SYMBOL(net_ratelimit);
EXPORT_SYMBOL(net_srandom);//最后这三个有什么作用?

导出符号
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-04-18 17:15
谢谢斑竹的指点,但我还不是很清楚。举个例子:比方说求s1,state->s1 = TAUSWORTHE(state->s1, 13, 19, 4294967294UL, 12)用这个条件,通过((s&c)<<d) ^ (((s <<a) ^ s)>>b)这个式子来计算,但是其中的S是不知道啊?具体怎么算呢?这样能帮我算一个吗?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2007-04-19 09:50
s不知道什么意思?

x_n = (s1_n ^ s2_n ^ s3_n)

   s1_{n+1} = (((s1_n & 4294967294) <<12) ^ (((s1_n <<13) ^ s1_n) >>19))
   s2_{n+1} = (((s2_n & 4294967288) << 4) ^ (((s2_n << 2) ^ s2_n) >>25))
   s3_{n+1} = (((s3_n & 4294967280) <<17) ^ (((s3_n << 3) ^ s3_n) >>11))


void __init net_random_init(void)
{
    int i;

    for_each_possible_cpu(i) {
        struct nrnd_state *state = &per_cpu(net_rand_state,i);
        __net_srandom(state, i+jiffies);
    }
}
此处会初始化。

具体看看这里文章:
http://www.iro.umontreal.ca/~lecuyer/myftp/papers/tausme.ps
ftp://ftp.iro.umontreal.ca/pub/simulation/lecuyer/papers/tausme.ps
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-04-19 18:50
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2007-04-26 22:41
斑竹再帮我说下,这一整段代码的含义是什么,是干什么用的?主要是实现什么功能。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
6楼#
发布于:2007-04-27 09:56
这个模块是计算随机数的。

首先模块需要初始化,然后计算就可以了,具体使用可以看看源代码的使用这样更能明白。
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2007-04-30 11:25
不知道斑竹有没有关于这段代码的资料啊(相关内容的也行),虽然斑竹你讲的这么多,但刚刚接触linux源代码的分析还是有很多地方无法理解的。过几天我就要交一个分析报告了(要写2万多的字),时间很紧,斑竹能不能在帮帮我。再次感谢啊。如果没有,是斑竹对这段代码的理解也可以(主要是关于代码控制流程、实现算法、每个语句的语法和语义、系统与函数的调用;相关的数据结构;与系统其它模块的接口方面的)。
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
8楼#
发布于:2007-04-30 13:14
我没有这方面的资料,而且是属于加密算法,你应该首先看看加密算法中关于随机数方面的知识。如果只是了解这个算法什么含义,一句句看看就行了。因为现在我的工作很忙,没有太多时间去分析它,请不要耽误自己的时间在这里空等,而且也不会有其他人来答复你。学习还是要靠自己的。
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-04-30 15:41
恩,感谢斑竹教诲``只是这个分析报告,我无从下手啊,不知道怎么去写好?斑竹能给点意见吗?
加密算法中随机数的内容有什么好点的书吗?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
10楼#
发布于:2007-04-30 16:05
随机数内容可以看机械工业出版社出的一本关于加密算法的影印版书,也有中文版的。这方面看一本就行了,内容都差不多。主要理解他的原理,然后你再看代码,就知道他问什么这么做了。理论指导,然后就是理解实现,非常easy。努力吧
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-04-30 16:28
斑竹知道这本书的书名是什么吗?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
12楼#
发布于:2007-04-30 22:56
<现代密码学理论与实践>
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-05-06 23:29
这本书是电子工业出版社的。
没想到,翻译这本书的作者王继林就是我们学校的老师。呵呵
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-05-07 16:58
对了,记得在另外一个贴子中问到utils.c代码的含义,斑竹那个时候都没回答,我这里在问问是什么含义?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
15楼#
发布于:2007-05-08 15:02
utils.c什么代码
走走看看开源好 Solaris vs Linux
jiangxiaodun20
驱动牛犊
驱动牛犊
  • 注册日期2007-04-15
  • 最后登录2007-05-19
  • 粉丝0
  • 关注0
  • 积分120分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-05-09 08:59
utils.c(net\core)文件的代码,那utils.c这样一个表示什么含义?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
17楼#
发布于:2007-05-09 15:23
晕,不就是你问的问题吗?!!!!
走走看看开源好 Solaris vs Linux
游客

返回顶部