Chinaunix首页 | 论坛 | 博客
  • 博客访问: 384036
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1620
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-10 16:55
个人简介

当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。

文章分类

全部博文(138)

文章存档

2016年(2)

2015年(2)

2014年(15)

2013年(119)

我的朋友

分类: 网络与安全

2013-07-03 06:46:57

网络设备驱动的任务:
1,发送数据,接受数据
2,管理网络设备
*********************************************************************************************************************


内核模块的方式 和编译进内核的方式:


驱动程序要提供 网卡的自动检测函数
                 1)当我们以模块的方式加载网卡驱动。 网卡驱动的init函数要首先创建net_device结构体,并初始化部分元素,然后调用上面我们提到的网卡的自动检测函数

                    

                 2)当我们把设备驱动编译进内核的时候,内核在启动的时候,会自动调用网卡的自动检测函数。 这个时候,自动检测函数是怎么被调用的呢? 我们认为每一种网卡都是作为一种总线设备存在的,比如ISA总线。 每一种总线,对应一个结构体数组。 struct devprobe2 isa_probes[]。 这个数组的成员变量就是一个一个的函数指针,指向我们的自动检测函数,内核在启动的时候,会挨个遍历调用这些函数指针,尝试识别网卡。







                我这边开发板上,CS8900A是练到S3C2440的网卡控制器上的,如何检测??? 平台设备????


        ------------------------------------------------------------------------------------------------------------------------------------
        probe函数功能:

        1)检测网卡是否存在。形式就是读取参数(我们指定的一个或一组端口地址)。一个网卡只能工作在有限的几个I/O端口上。一种识别的方式是读取MAC地址。

        2)当需要跳线来制定中断信号线的,要在这里申请中断。如果可以动态分配的,那么在open函数中申请终端。 DMA通道一样一样的。

        3)向内核提供 各种函数的指针(下面会挨个介绍),这些函数指针才是真正的功能函数,包括发送数据,接受数据等等。提供的方式就是把这些函数指针关联到 net_device中去
  dev->netdev_ops = &netcard_netdev_ops;
    

        

 
********************************************************************************************************************
驱动程序要提供函数指针,函数指针都保存在结构体中:




            
           激活停止设备,主要是用户空间的ifconfig命令来触发的。 当ifconfig命令执行的时候,内核会执行ioctl()系统调用。然后ioctl系统调用会调用我们的驱动程序提供的
open close函数。 ioctl部分内核来做,驱动程序不负责。
        ------------------------------------------------------------------------------------------------------------------------------------
        open 函数:
        1)申请系统资源,比如中断,I/O端口。
        2)复制硬件地址到net_device中去。
        3)激活硬件发送队列(网卡都有硬件发送队列,这个操作应该是操作寄存器)


         close函数: 和open相反


        ------------------------------------------------------------------------------------------------------------------------------------
        发送数据包函数。
  
        一个网络适配器就是一个接口,按照给定的MAC协议(以太网,令牌环等)自动的向网络介质发送或者接受数据包,也即网络适配器和CPU有着独立控制的逻辑,他们通过I/O端口(硬件寄存器),中断 与CPU交互。
        当CPU需要发送数据给网络设备时,CPU将数据写到I/O端口(硬件寄存器),然后向网络设备的命令寄存器写发送控制命令。就好了,就自动发送出去。


        上面是最基本的逻辑,考虑到性能,网卡上有发送队列(硬件层面的)。我们可以写寄存器来stop和restart这个队列。

        ------------------------------------------------------------------------------------------------------------------------------------

       数据发送超时函数

        ------------------------------------------------------------------------------------------------------------------------------------
        如果是NAPI的接口的驱动,还要实现 poll函数指针。 用于轮询网络设备以读取多个数据包。


        ------------------------------------------------------------------------------------------------------------------------------------



        ------------------------------------------------------------------------------------------------------------------------------------



        ------------------------------------------------------------------------------------------------------------------------------------





*******************************************************************************************************************



*******************************************************************************************************************



*******************************************************************************************************************



*******************************************************************************************************************





阅读(834) | 评论(0) | 转发(0) |
0

上一篇:console

下一篇:ARM Linux静态映射分析

给主人留下些什么吧!~~