zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
阅读:3685回复:20

请教对2.6内核的网络部分熟悉的高人 net_random_init()

楼主#
更多 发布于:2007-03-06 14:54
请问2.6内核的网络部分 net_random_init()的nrnd_state  per_cpu_net_rand_state[cpu]的作用?
 为何要产生随即值? utils.c的代码含义, 协议中为何要加入此模块?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
沙发#
发布于:2007-03-07 11:04
#define per_cpu(var, cpu)            (*((void)(cpu), &per_cpu__##var))

for_each_possible_cpu(i) {
        struct nrnd_state *state = &per_cpu(net_rand_state,i);
        __net_srandom(state, i+jiffies);
    }

state就是{i,per_cpu_net_rand_state}组合,初始化state值.以便get_cpu_var(net_rand_state)中使用.

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

追踪一下,可以发现get_cpu_var和per_cpu功能是相同的,

struct thread_info {
    struct task_struct    *task;        /* main task structure */
    struct exec_domain    *exec_domain;    /* execution domain */
    unsigned long        flags;        /* low level flags */
    unsigned long        status;        /* thread-synchronous flags */
    __u32            cpu;        /* current CPU */
    int            preempt_count;    /* 0 => preemptable, <0 => BUG */


    mm_segment_t        addr_limit;    /* thread address space:
                            0-0xBFFFFFFF for user-thead
                           0-0xFFFFFFFF for kernel-thread
                        */
    struct restart_block    restart_block;

    unsigned long           previous_esp;   /* ESP of the previous stack in case
                           of nested (IRQ) stacks
                        */
    __u8            supervisor_stack[0];
};

2.6内核是抢占式内核,抢占式内核对普通Linux内核作了如下的一些修改:

抢占式内核给task struct数据结构增加了一个数据项:preempt_count。该数据项由宏preempt_disable()、preempt_enable()、以及preempt_enable_no_resched()所使用。preempt_disable对preempt_count计数进行递增,preempt_enable对preempt_count进行递减。preempt_enable宏查看当前进程的preempt_count和need_resched域的内容,如果 preempt_count为0并且need_resched为1,则调用preempt_schedule()函数。该函数将给当前进程的preempt_count项增加一个很大的值(比如让preempt_counter=preempt_counter + 0x4000000),然后调用进程调度函数schedule(),在schedule函数返回后从该进程preempt_count中再减去该值。可抢占内核也修改了schedule函数,它检测进程的preempt_counter是否很大(这是为了屏蔽一些普通调度流程中对于抢占式调度来说是冗余的那些操作),然后执行抢占式调度。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-03-07 11:28
谢谢!
初始化时s1,s2,s3的值取决与cpu id 与jiffies , 功能含义?平常此三个值的含义?[看进程调度很复杂]
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
地板#
发布于:2007-03-07 16:01
这是随机值,没有什么具体含义。约随机越好。平时cpu id针对是smp体系中的cpu,jiffies 当然就是嘀嗒数了
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2007-03-07 17:01
谢谢
我是问s1 s2 s3 的,为何要特意复杂地初始化,随机指定几个值不就行了?!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
5楼#
发布于:2007-03-12 09:04
那你最好看看加密算法关于随即值计算方面的
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2007-03-12 09:11
引用第5楼cyliu2007-03-12 09:04发表的“”:
那你最好看看加密算法关于随即值计算方面的



我是想问在此处为何特意要如此----产生随机值的含义?
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
7楼#
发布于:2007-03-12 09:30
初始化阿,应该相当于srand。我不明白你的意思,你是说不用产生没啊?没有初始化,怎么产生随即值啊。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2007-03-12 11:22
引用第7楼cyliu2007-03-12 09:30发表的“”:
初始化阿,应该相当于srand。我不明白你的意思,你是说不用产生没啊?没有初始化,怎么产生随即值啊。


为何要产生随即值? utils.c的含义, 协议中为何要加入此模块?
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2007-03-21 17:14
是否为了防止数据包的碰撞冲突,在一个随即时间尝试重发.
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
10楼#
发布于:2007-03-21 19:02
很多地方都需要用到随机数阿。如xfrm,route路由都需要。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2007-03-22 08:40
引用第10楼cyliu2007-03-21 19:02发表的“”:
很多地方都需要用到随机数阿。如xfrm,route路由都需要。

望能详细介绍一下
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
12楼#
发布于:2007-03-22 14:55
我不明白你到底想要了解什么啊?如果只是验证是否使用随机数,察看一下源码都可以看到;如果说为什么要用随机数,原因可能很多阿:防止重复分配Id,防止攻击等等;如果说为什么要初始化随机,这里随机算法应该有说明。
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-03-22 17:10
引用第12楼cyliu2007-03-22 14:55发表的“”:
我不明白你到底想要了解什么啊?如果只是验证是否使用随机数,察看一下源码都可以看到;如果说为什么要用随机数,原因可能很多阿:防止重复分配Id,防止攻击等等;如果说为什么要初始化随机,这里随机算法应该有说明。

谢谢! 防止重复分配Id ,防止攻击  能讲的更详细一些如何使用上述的随即数
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-03-26 13:20
请版主能向上面的问题详细讲解一下.谢谢!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
15楼#
发布于:2007-03-29 10:11
你的问题能否明确一下,不知道你到底想要问什么?
走走看看开源好 Solaris vs Linux
zhaoyanghong
驱动小牛
驱动小牛
  • 注册日期2004-11-13
  • 最后登录2008-08-05
  • 粉丝0
  • 关注0
  • 积分341分
  • 威望92点
  • 贡献值0点
  • 好评度91点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-03-29 12:49
引用第15楼cyliu2007-03-29 10:11发表的“”:
你的问题能否明确一下,不知道你到底想要问什么?

爱小学都没毕业,不认识几个字!
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
17楼#
发布于:2007-03-29 13:08
我不明白你到底想探讨如何防止重复分配Id ,如何还是防止攻击 或者是如何使用随即数,再或者是随基数在防止重复分配Id / 防止攻击方面的应用等等。

看来生气了。算我多事了!期望其他人能够来继续讨论!
走走看看开源好 Solaris vs Linux
linestyle
驱动小牛
驱动小牛
  • 注册日期2004-01-28
  • 最后登录2010-01-05
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望139点
  • 贡献值0点
  • 好评度135点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-04-09 13:41
麻烦问一下cyliu版主

2.4内核不是抢占式内核?
对linux比较感兴趣,不太了解见笑了
loading is waiting ...
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
19楼#
发布于:2007-04-09 16:34
2.4还不是真正意义上的抢占式内核,内核处理是不能被强占的。但是2.6内核已经实现了真正意义上抢占执行任务。

共同学习
走走看看开源好 Solaris vs Linux
上一页
游客

返回顶部