转:http://blog.chinaunix.net/uid-23782786-id-3839602.html

前言:
        最近搞这玩样,真是折腾,网上的资料都是片段,而且很少。折腾了4、5还没明白其整个的工作流程。眼看时间一天天地流失,内心哪个捉急啊!

于是,豁出去了,从Makefile开始看。并且在源码中添加调用栈打印,终于搞明白了流程;
        现摘记出来供后来人参考。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
前提: 
     芯片:bcm56142 
      
     编译:(kernel model) 
          1. cd system/linux/kernel/x86-generic-2_6/ 
          2. make 
           
          程序的连接使用的是 -static 选项,所以 nsl,m,c,pthread等库只能使用静态库(*.a),否则链接过程会提示找不到库 :
                   /usr/bin/ld: cannot find -lnsl 之类的错误。
           
      编译完成后,进行安装; 
          insmod   linux-kernel-bde.ko 
          insmod   linux-uk-proxy.ko 
          insmod   linux-bcm-diag-full.ko 
          mknod    /dev/linux-uk-proxy c 125 0 
           
1. BCM配置命令操作? 
          我们在shell中执行  ./bcm.user.proxy,就启动了BCM的命令行用户界面。
                这时候,用户就可以使用命令了,比如配置Vlan,端口使能等。 
           
2. 当在开发新产品时,该怎么使用这个SDK呢? 
    当然了,如果不使用这个SDK也是可以的,直接操作设备文件,但是这个是有工作量,需要花时间的... 
     
    我们在执行了 ./bcm.user.proxy时,实际启动的是一个用户空间程序,
           对应文件 systems/linux/kernel/user/bcm-diag-proxy/bcm-diag-proxy.c里的main()函数。

main() 
    ( 
        1. 首先打开设备文件 /dev/linux-uk-proxy。 
        2. 启动一个读线程,用于从内核 _service_list(name "BCM DIAG SHELL")的sndqueue发送队列
           读取内核执行命令后的输出信息。 
        3. 当前进程则将用户输入定向到标准输入,如果用户输入了字符,则将其发送到
            内核_service_list(name "BCM DIAG SHELL")rcvqueue 接收队列
    )

当我们在 BCM> 提示符下输入一条命令,比如 show pci 
             命令"show pci"被传送到了内核_service_list(name "BCM DIAG SHELL")rcvqueue接收队列上。

那么show pci命令怎么被执行了呢? 
     
    回到前面的 insmod linux-bcm-diag-full.ko 
    当这个模块被插入内核时,其初始化函数会调用 _init() 
    /* systems/linux/kernel/modules/shared/gmodule.c */ 
    int __init init_module()   //内核模块加载函数,即insmod时会调用的函数,module_init()最终也是掉这个函数 
    {     
            _gmodule = gmodule_get(); 
        ...... 
        if(_gmodule->init) 
        { 
              if((rc = _gmodule->init()) < 0) //调用 _init() 
              { 
              } 
        } 
    } 
     
    /* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */ 
    _init() 
    { 
        最重要的活就是创建了一个处理shell命令的内核线程:_bcm_shell() 
    } 
     
    /* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */ 
    _bcm_shell() 
    { 
        调用函数 diag_shell(),这个就是最重要的函数了。 
    } 
     
    /* src/appl/diag/system.c */ 
    diag_shell() 
    { 
        diag_init();    // 这个没啥好说的,自己看代码,初始化了一些链表,并打印BCM相关信息 
        sysconf_init();  
        sysconf_probe();//这里去探测系统中存在的BCM家族的芯片,主要是通过读PCI配置空间的ID 
        sysconf_attach(); //这里就是将探测到的设备对应的函数安装到对应的钩子上 
        while(1) 
        { 
            sh_process(-1, "BCM", TRUE);  //这个东东就一直轮询用户的输入,并执行用户的命令了。 
        } 
    } 
     
    /* src/appl/diag/shell.c */ 
    sh_process() 
    { 
        while(1) 
        { 
            sal_readline(); //关注一下这个函数,这个函数就是
                                  //             去从内核_service_list(name "BCM DIAG SHELL")rcvqueue接收队列上取用户的命令 
        } 
         
      ...... 
      if( cur_mode == BCMX_CMD_MODE ) 
          sh_process_command();     //看到没,这时候才是真正的去执行用户输入的命令了。 
    } 
     
   /* src/sal/appl/io.c */ 
   sal_readline() 
   { 
           sal_console_gets();     
   } 
    
   /* src/sal/appl/linux/console.c */ 
   sal_console_gets() 
   { 
           tty_gets(); 
   } 
    
   /* systems/linux/kernel/modules/bcm-diag-full/bcm-diag-full.c */ 
   tty_gets() 
   { 
           while(!(rc >= 0)) 
           { 
                 rc=linux_uk_proxy_recv();    //直接从内核_service_list(name "BCM DIAG SHELL")rcvqueue队列上
                                                             // 取用户的命令 
           } 
   } 
    
    
   /* systems/linux/kernel/modules/uk-proxy/linux-uk-proxy.c */ 
   linux_uk_proxy_recv() 
   {     
       return _list_op(&s->recv_q.data, &s->recv_q.free, data, len, _LIST_OP_F_GET | _LIST_OP_F_KERN); 
   } 
    
   从以上分析可以看出,linux-bcm-diag-full.ko 是很重要的模块,用于接口用户的,执行bcm 命令。 
     
写这篇文档,一是记录下,日后自己再做BCM的开发,可以省时省力些;二来给像我一样刚接触BCM开发的后来者以参考,少走弯路。 
当然,要向了解所有的,最好还是看下他的makefile工程,虽然可能会花上一两天时间,但是对你看代码很有帮助的, 
因为代码里好多一样的文件名和函数名,不看Makefile你不知道调哪个了. 
 
对于开发BCM应用: 
1. 你可以修改 bcm-diag-proxy.c的main线程,将其的输入重定向一个文件,然后你懂的... 
2. 直接操作 /dev/linux-uk-proxy文件(open,ioctl,对应内核的模块linux-uk-proxy.c 中的_ioctl)

 

BCM 交换机开发的更多相关文章

  1. 快速掌握RabbitMQ(二)——四种Exchange介绍及代码演示

    在上一篇的最后,编写了一个C#驱动RabbitMQ的简单栗子,了解了C#驱动RabbitMQ的基本用法.本章介绍RabbitMQ的四种Exchange及各种Exchange的使用场景. 1 direc ...

  2. PISCES: A Programmable, Protocol-Independent Software Switch

    Name of article:PISCES: A Programmable, Protocol-Independent Software Switch Origin of the article:S ...

  3. H3C S6800交换机 BCM shell命令

    H3C S6800交换机 BCM shell命令 http://wgli978.blog.163.com/blog/static/13592877220172315858831/ <H3C> ...

  4. Ryu控制器编程开发——packet_in和packet_out简易交换机实现

    Ryu控制器二次开发,实现一个简单的只能够简单地广播数据包的交换机. from ryu.base import app_manager from ryu.controller import ofp_e ...

  5. 开发人员必读openstack网络基础2:交换机、路由器、DHCP

    我们在使用openstack的过程中,会遇到创建虚拟机路由器.交换机等,那么1.他们的作用到底是什么?2.DHCP为什么会产生,它的作用是什么? 个人总结:交换机:一般用在同一网段,工作在数据链路层, ...

  6. maven实战(01)_搭建开发环境

    一 下载maven 在maven官网上可下载maven:http://maven.apache.org/download.cgi 下载好后,解压.我的解压到了:D:\maven\apache-mave ...

  7. 开发人员必读openstack网络基础

    云计算中的网络非常复杂,需要对网络的基础理论有一定的认识和了解,转载网上针对openstack中涉及到网络概念的文章 开发人员必读openstack网络基础1:什么是L2.L3 开发人员必读opens ...

  8. nagios二次开发(四)---nagios监控原理和nagios架构简介

    nagios监控原理 下面根据上面摘自网络的原理图对nagios的监控原理进行一下简单的说明: 1.nagios通过nsca进行被动监控.那么什么是被动监控呢?被动监测:就是指由被监测的服务器主动上传 ...

  9. 【WP 8.1开发】推送通知测试服务端程序

    所谓推送通知,用老爷爷都能听懂的话说,就是: 1.我的服务器将通知内容发送到微软的通知服务器,再由通知服务器帮我转发消息. 2.那么,微软的推送服务器是如何知道我的服务器要发消息给哪台手机呢?手机客户 ...

随机推荐

  1. 着手打造你的随身系统---将linux装进移动硬盘

    将Ubuntu等linux系统安装到移动硬盘--操作系统随身携带 前言        刚刚接触ubuntu,听说可以将linux系统安装到移动硬盘上,所以最近一周都在尝试将ubuntu安装到新买的移动 ...

  2. Html--判断客户端类型

    公司安排做一个html的app下载页面,需要检测客户端,走不同的css布局,于是从网上搜点资料,简单汇总下,方便日后查阅. 1) 响应式布局设置--@media only screen and onl ...

  3. linux shell习题训练

    shell习题训练 求2个数之和 计算1-100的和 将一目录下所有的文件的扩展名改为bak 编译当前目录下的所有.c文件: 打印root可以使用可执行文件数,处理结果: root's bins: 2 ...

  4. 1、aritcMS-环境搭建-设置布局-布局测试

    在开始项目之前,准备开发工具等请参考easyUI章节. 首先.在获取broPHP框架的时候(可以在网上下载).在brophp文件夹同级目录下新建admin.php,以及index.php admin. ...

  5. ASP.NET MVC 使用dataTable(3)--更多选项参考

    ASP.NET MVC 使用dataTable(3)--更多选项参考 jQuery  dataTables 插件是一个优秀的表格插件,是后台工程师的福音!它提供了针对数据表格的排序.浏览器分页.服务器 ...

  6. 实现 iPhone 电子书的分页显示功能的代码

     本文转载至 http://blog.csdn.net/zaitianaoxiang/article/details/6650497 原文地址:实现 iPhone 电子书的分页显示功能的代码作者:醉吻 ...

  7. CodeIgniter框架——CI中视图路径问题

    答: 视图中的所有路径全部和 index.php 同级,也就是和 index.php 属于一个目录下,也就是网站根目录. 因为 index.php 后面看似是路径的东西其实那只是一种 URL 参数而已 ...

  8. POJ3090

    Visible Lattice Points Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7094   Accepted: ...

  9. 使用EasyNVR无插件流媒体服务器接口和EasyPlayer.js播放器插件实现web网页H5播放无插件

    1.背景需求 很多客户在使用EasyNVR无插件流媒体服务器时,不喜欢产品化的界面,有时可能满足不了日常观看使用的需求.因此软件提供丰富的HTTP接口,供第三方平台调用集成.但是有时客户这边可能没有专 ...

  10. javascript基础(整理自手册网)

    变量 person=null; //清空变量 carname="Volvo"; //赋值给未声明的变量, 它将会变成全局变量, 即使在函数内部 window.carnam; //所 ...