您的位置:首页 > 理论基础 > 计算机网络

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

2007-01-23 22:15 501 查看
现在的世界,都是网络的世界了。没有网络是不可想像的,失去太多激动人心的时刻。没有网络,就不可能方便地交流数据,BLOG也不可发达到目前这种程度。就是在PMON的调试里,使用网络也是非常方便的。比如想开发PMON运行的程序,就可以使用网络加载,比如TFTP加载程序。这样就不用每次去写硬盘,或者写到其它地方去,只要把网络连接好,就可以在其它机器里编译,然后通过网络把程序放到目标机器里运行了,这样做会大大地加快调试程序的进度。现在就来分析PMON里的网络功能部分。
在函数dbginit里调用下面的函数进行初始化的动作:

[align=left]#ifdef INET[/align]
[align=left] SBD_DISPLAY ("NETI", CHKPNT_NETI);[/align]
[align=left] init_net (1);[/align]
#endif

上面通过调用函数init_net进行网络初始化。
在目录kkmao/sys/kern/init_main.c里,就可以看到这个函数的真面目,如下:
[align=left]void[/align]
[align=left]init_net (int hwok)[/align]
[align=left]{[/align]
[align=left] char *e;[/align]
[align=left] int i, s;[/align]
[align=left] struct pdevinit *pdev;[/align]
[align=left] vm_offset_t maxaddr;[/align]
[align=left] extern struct pdevinit pdevinit[];[/align]
[align=left] extern vm_map_t mb_map, kernel_map;[/align]
[align=left] [/align]
[align=left] sysloglevel = LOG_NOTICE;[/align]
[align=left] if ((e = getenv ("loglevel")) != 0) {[/align]
[align=left] char *ee;[/align]
[align=left] u_long n = strtoul (e, &ee, 0);[/align]
[align=left] if (*ee == '/0' && n <= LOG_DEBUG) {[/align]
[align=left] sysloglevel = n;[/align]
[align=left] }[/align]
[align=left] else {[/align]
[align=left] CODE *code;[/align]
[align=left] for (code = prioritynames; code->c_name; code++) {[/align]
[align=left] if (strcmp (code->c_name, ee) == 0) {[/align]
[align=left] break;[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] if (code->c_name) {[/align]
[align=left] sysloglevel = code->c_val;[/align]
[align=left] }[/align]
[align=left] else {[/align]
[align=left] log (LOG_ERR, "bad $loglevel variable/n");[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] }[/align]
上面这段代码进行调试LOG输出的设置,比如根据不同的调试参数,就可以输出LOG的级别,比如设置所有LOG都输出。有时为了调试方便,又想设置只有高级出错的LOG才输出,否则就会被一大堆LOG困惑,埋没在LOG的汪洋里,找不到一点头绪。
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Init system global parameters[/align]
[align=left] */[/align]
[align=left] paraminit ();[/align]
上面设置了一些全局参数,比如时间片的大小,进程的个数等等。
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Initialise "virtual memory" maps[/align]
[align=left] */[/align]
[align=left] vminit();[/align]
上面进行设置内存分配的开始地址。
[align=left] [/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Initialise memory allocator[/align]
[align=left] */[/align]
[align=left] kmeminit();[/align]
上面设置内核内存的分配链表结构,设置内存分配的起始地址和大小。其实就是指向上一个函数里分配的内存位置。
[align=left] [/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Initialize callouts[/align]
[align=left] */[/align]
[align=left] callout = malloc(sizeof(struct callout) * ncallout, M_TEMP, M_NOWAIT);[/align]
[align=left] callfree = callout;[/align]
[align=left] for (i = 1; i < ncallout; i++) {[/align]
[align=left] callout[i-1].c_next = &callout[i];[/align]
[align=left] }[/align]
上面创建调用队列。
[align=left] [/align]
[align=left] if (hwok) {[/align]
[align=left] startrtclock(hz);[/align]
[align=left] }[/align]
上面保存时钟计数和时间。
[align=left] [/align]
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Initialise mbufs[/align]
[align=left] */[/align]
[align=left] mclrefcnt = (char *)malloc(VM_KMEM_SIZE/MCLBYTES, M_MBUF, M_NOWAIT);[/align]
[align=left] bzero(mclrefcnt, NMBCLUSTERS+CLBYTES/MCLBYTES);[/align]
[align=left] mb_map = kmem_suballoc(kernel_map, (vm_offset_t *)&mbutl, &maxaddr,[/align]
[align=left] NMBCLUSTERS*MCLBYTES, FALSE);[/align]
[align=left] mbinit();[/align]
上面初始化网络使用的MBUF缓冲区。
[align=left] [/align]
[align=left] /*[/align]
[align=left] * Initialise network devices and protocols[/align]
[align=left] */[/align]
[align=left] if (hwok) {[/align]
[align=left] s = splhigh();[/align]
[align=left] tgt_devconfig();[/align]
[align=left] for (pdev = pdevinit; pdev->pdev_attach != NULL; pdev++) {[/align]
[align=left] if (pdev->pdev_count > 0) {[/align]
[align=left] (*pdev->pdev_attach)(pdev->pdev_count);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] ifinit();[/align]
[align=left] printf("ifinit done./n");[/align]
[align=left] domaininit();[/align]
[align=left] printf("domaininit done./n");[/align]
[align=left] splx(s);[/align]
[align=left] }[/align]
[align=left]上面初始化网络的设备和协议,当然还有很多初始化在里面的。后面再慢慢地分析它。[/align]
[align=left] [/align]
[align=left] /* [/align]
[align=left] * Initialise process table, we become first "process" [/align]
[align=left] */[/align]
[align=left] printf("init_proc..../n");[/align]
[align=left] init_proc ();[/align]
上面初始化所有进程表,并把这里运行的进程为第一个进程。
[align=left] [/align]
[align=left] /* enable realtime clock interrupts */[/align]
[align=left] if (hwok) {[/align]
[align=left] enablertclock(); [/align]
[align=left] }[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] boottime = time;[/align]
[align=left] spl0();[/align]
[align=left] /*delay(1000000);*/[/align]
[align=left] delay(10000);[/align]
上面设置可以软件时钟中断。
[align=left] [/align]
[align=left]#ifdef INET[/align]
[align=left] if (getenv("ifconfig") != 0) {[/align]
[align=left] /* configure the default ethernet interface */[/align]
[align=left] char *ip = getenv("ifconfig");[/align]
[align=left] char *p, *cp;[/align]
[align=left] char ifn[100];[/align]
[align=left] [/align]
[align=left] while (*ip) {[/align]
[align=left] /*[/align]
[align=left] * Check for <ifc>:<config>;[/align]
[align=left] */[/align]
[align=left] cp = ifn;[/align]
[align=left] p = NULL;[/align]
[align=left] while (*ip != ';' && *ip != '/0') {[/align]
[align=left] if (*ip == ':' && p == NULL) {[/align]
[align=left] *cp = '/0';[/align]
[align=left] p = ++cp;[/align]
[align=left] } else {[/align]
[align=left] *cp++ = *ip;[/align]
[align=left] }[/align]
[align=left] ip++;[/align]
[align=left] }[/align]
[align=left] if (*ip == ';')[/align]
[align=left] ip++;[/align]
[align=left] *cp = '/0';[/align]
[align=left] [/align]
[align=left] s = splhigh();[/align]
[align=left] printf("network configure '%s:%s'/n", ifn, p);[/align]
[align=left] splx(s);[/align]
[align=left] ifconfig (ifn, p);[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]#endif /* INET */[/align]
上面从FLASH里读取IP地址,并设置给网络卡。
[align=left] [/align]
}

通过这个函数,就可以把网络初始化好,这样就可以接收网络数据和发送网络数据。同时在开始那里先进行内存管理的设置,以便后面可以分配内存。当然,这里还有一个初始化函数没有深入去解读,下一次再去探索它的作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: