1.网卡驱动架构分析
1.1初始化
1.1.1分配net_device结构-alloc_etherdev
1.1.2初始化net_device结构(设备号,基地址,MAC地址,netdev_ops)
1.1.3初始化硬件
1.1.4注册网卡驱动—register_netdev
发送数据frame的过程需要关中断,接收数据frame的过程不需要关中断的原因
答:在发送过程中是不能被打断的,在发送的过程中,不关中断,这时候如果有一个中断到来,那么cpu有可能会去相应该中断,如果该中断需要改写的数据是发送数据的缓冲区,那么缓冲区将被改写,这样即使cpu相应完毕该中断,再发送数据,接收方也不认识该数据不能接收。
在接收数据的时候,需要打开中断,是因为要及时的相应接收到的数据。如果关闭该中断,那么接收方有可能因为相应优先级高的中断而接收不到该数据。
1.2数据发送
1.2.1通知上层协议,暂停向网卡发送数据-netif_stop_queue
1.2.2将SKb的数据写入网卡寄存器,发送走。
1.2.3释放skb结构-dev_kfree_skb
1.2.4在发送中断处理过程中,通知上层协议可以向网卡送数据-netif_wake_queue
1.3.3数据接收
1.3.1读取接收状态
1.3.2读取接收到数据的长度
1.3.3分配skb结构-dev_alloc_skb
1.3.4把网卡寄存器读出数据存入skb
1.3.5把收到的skb数据包交给协议栈处理-netif_rx
2、驱动编写测试
(1)安装驱动,为网卡配置IP,先ping自己,再ping同一网段的IP
(2)eth0是开发板的DM9000 网卡
(3)查看网卡
(4)ping自己时能ping通,但是没有提供发包函数。这说明不经过硬件相关层,因而也就是在硬件相关层之上,也就是表明IP是纯软件的概念。
(5)ping别的IP时ping不通,因为需要通过硬件相关层进行收发。因为没有提供发包收包函数。
注意:如果电脑有两个网卡,不要设置为同一网段,否则ping一个IP,操作系统根本不知道把数据发给哪一个网卡。