当你比别人优秀一点点,别人会嫉妒你。当你比别人优秀很多,别人会羡慕你。
分类: 网络与安全
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函数指针。 用于轮询网络设备以读取多个数据包。
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
*******************************************************************************************************************
*******************************************************************************************************************
*******************************************************************************************************************
*******************************************************************************************************************