科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件龙芯软件开发(27)-- 网络初始化

龙芯软件开发(27)-- 网络初始化

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

现在就来分析PMON里的网络功能部分。 在函数dbginit里调用下面的函数进行初始化的动作:

作者:caimouse 来源:CSDN 2008年1月22日

关键字: 初始化 网络 Linux

  • 评论
  • 分享微博
  • 分享邮件
现在的世界,都是网络的世界了。没有网络是不可想像的,失去太多激动人心的时刻。没有网络,就不可能方便地交流数据,BLOG也不可发达到目前这种程度。就是在PMON的调试里,使用网络也是非常方便的。比如想开发PMON运行的程序,就可以使用网络加载,比如TFTP加载程序。这样就不用每次去写硬盘,或者写到其它地方去,只要把网络连接好,就可以在其它机器里编译,然后通过网络把程序放到目标机器里运行了,这样做会大大地加快调试程序的进度。现在就来分析PMON里的网络功能部分。
在函数dbginit里调用下面的函数进行初始化的动作:
 
#ifdef INET
    SBD_DISPLAY ("NETI", CHKPNT_NETI);
    init_net (1);
#endif
 
上面通过调用函数init_net进行网络初始化。
在目录kkmao\sys\kern\init_main.c里,就可以看到这个函数的真面目,如下:
void
init_net (int hwok)
{
    char *e;
    int i, s;
    struct pdevinit *pdev;
    vm_offset_t maxaddr;
    extern struct pdevinit pdevinit[];
    extern vm_map_t mb_map, kernel_map;
 
    sysloglevel = LOG_NOTICE;
    if ((e = getenv ("loglevel")) != 0) {
       char *ee;
       u_long n = strtoul (e, &ee, 0);
       if (*ee == '\0' && n <= LOG_DEBUG) {
           sysloglevel = n;
       }
       else {
           CODE *code;
           for (code = prioritynames; code->c_name; code++) {
              if (strcmp (code->c_name, ee) == 0) {
                  break;
               }
           }
           if (code->c_name) {
              sysloglevel = code->c_val;
           }
           else {
              log (LOG_ERR, "bad $loglevel variable\n");
           }
       }
    }
上面这段代码进行调试LOG输出的设置,比如根据不同的调试参数,就可以输出LOG的级别,比如设置所有LOG都输出。有时为了调试方便,又想设置只有高级出错的LOG才输出,否则就会被一大堆LOG困惑,埋没在LOG的汪洋里,找不到一点头绪。
 
    /*
    * Init system global parameters
    */
    paraminit ();
上面设置了一些全局参数,比如时间片的大小,进程的个数等等。
 
    /*
    * Initialise "virtual memory" maps
    */
    vminit();
上面进行设置内存分配的开始地址。
 
 
    /*
    * Initialise memory allocator
    */
    kmeminit();
上面设置内核内存的分配链表结构,设置内存分配的起始地址和大小。其实就是指向上一个函数里分配的内存位置。
 
 
    /*
    * Initialize callouts
    */
    callout = malloc(sizeof(struct callout) * ncallout, M_TEMP, M_NOWAIT);
    callfree = callout;
    for (i = 1; i < ncallout; i++) {
       callout[i-1].c_next = &callout[i];
    }
上面创建调用队列。
 
    if (hwok) {
       startrtclock(hz);
    }
上面保存时钟计数和时间。
 
 
    /*
    * Initialise mbufs
    */
    mclrefcnt = (char *)malloc(VM_KMEM_SIZE/MCLBYTES, M_MBUF, M_NOWAIT);
    bzero(mclrefcnt, NMBCLUSTERS+CLBYTES/MCLBYTES);
    mb_map = kmem_suballoc(kernel_map, (vm_offset_t *)&mbutl, &maxaddr,
       NMBCLUSTERS*MCLBYTES, FALSE);
    mbinit();
上面初始化网络使用的MBUF缓冲区。
 
    /*
    * Initialise network devices and protocols
    */
    if (hwok) {
       s = splhigh();
       tgt_devconfig();
       for (pdev = pdevinit; pdev->pdev_attach != NULL; pdev++) {
           if (pdev->pdev_count > 0) {
              (*pdev->pdev_attach)(pdev->pdev_count);
           }
       }
 
       ifinit();
       printf("ifinit done.\n");
       domaininit();
       printf("domaininit done.\n");
       splx(s);
    }
上面初始化网络的设备和协议,当然还有很多初始化在里面的。后面再慢慢地分析它。
 
    /*
    * Initialise process table, we become first "process"
    */
    printf("init_proc....\n");
    init_proc ();
上面初始化所有进程表,并把这里运行的进程为第一个进程。
 
    /* enable realtime clock interrupts */
    if (hwok) {
       enablertclock();    
    }
 
 
    boottime = time;
    spl0();
    /*delay(1000000);*/
    delay(10000);
上面设置可以软件时钟中断。
 
#ifdef INET
    if (getenv("ifconfig") != 0) {
       /* configure the default ethernet interface */
       char *ip = getenv("ifconfig");
       char *p, *cp;
       char ifn[100];
 
       while (*ip) {
           /*
           * Check for <ifc>:<config>;
           */
           cp = ifn;
           p = NULL;
           while (*ip != ';' && *ip != '\0') {
              if (*ip == ':' && p == NULL) {
                  *cp = '\0';
                  p = ++cp;
              } else {
                  *cp++ = *ip;
              }
              ip++;
           }
           if (*ip == ';')
              ip++;
           *cp = '\0';
 
           s = splhigh();
           printf("network configure '%s:%s'\n", ifn, p);
           splx(s);
           ifconfig (ifn, p);
       }
    }
#endif /* INET */
上面从FLASH里读取IP地址,并设置给网络卡。
 
}
 
通过这个函数,就可以把网络初始化好,这样就可以接收网络数据和发送网络数据。同时在开始那里先进行内存管理的设置,以便后面可以分配内存。当然,这里还有一个初始化函数没有深入去解读,下一次再去探索它的作用。
 

查看本文来源
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章