![Rank: 8](images/default/star_level3.gif) ![Rank: 8](images/default/star_level3.gif)
- UID
- 872238
|
![](http://images.eccn.com/silabs/silicon_chip_980x60_202203.jpg)
不是,则需要自动检测。
if (base_addr > 0x1ff)
return ne_probe1(dev, base_addr);
else if (base_addr != 0)
return -ENXIO;
//如果有ISAPnP设备,则调用ne_probe_isapnp()检测这种类型的网卡。
if (isapnp_present() && (ne_probe_isapnp(dev) == 0))
return 0;
…//省略
return -ENODEV;
}
这其中两个函数ne_probe_isapnp()和ne_probe19()的区别在于检测中断号上。PCI方式只需指定I/O基地址就可以自动获得IRQ,是由BIOS自动分配的;而ISA方式需要获得空闲的中断资源才能分配。
3.网络接口设备打开和关闭
网络接口设备打开就是激活网络接口,使它能接收来自网络的数据并且传递到网络协议栈的上面,也可以将数据发送到网络上。设备关闭就是停止操作。
在NE2000网络驱动程序中,网络设备打开由dev_open()和ne_open()完成,设备关闭有dev_close()和ne_close()完成。它们相应调用底层函数ei_open()和ei_close()来完成。其实现过程相对简单,不再赘述。
4.数据包接收和发送
在驱动程序层次上的发送和接收数据都是通过低层对硬件的读写来完成的。当网络上的数据到来时,将触发硬件中断,根据注册的中断向量表确定处理函数,进入中断向量处理程序,将数据送到上层协议进行处理。
对NE2000网卡的数据接收过程是由ne_probe()函数中的中断处理函数ei_interrupt来完成的。在进入ei_interrupt()之后再通过ei_receive()从8309的接收缓冲区获得数据,并组合成sk_buff结构,再通过netif_rx()函数将接收到的数据存放在系统的饿接收队列之中。
Ei-interrupt()的函数原型:void ei_interrupt(int irq,void *dev_id, struct pt_regs *regs)。其中irq为中断号,dev-id是表示产生中断的网络接口设备对应的结构指针,regs表示当前的寄存器内容。数据发送是由dev_dev_start_xmit函数指针对应的ei_start_xmit函数它来完成数据包的发送。在函数ethdev_init()把net_device结构的hard_start_xmit指针初始化为ei_start_xmit。
设计Linux网络设备驱动程序有一定的模式。遵循这个模式,将会大大减轻我们设计程序的工作量。本文分析了网络驱动程序在内核中的工作机理,提出了设计网络驱动程序的一种模式,并给出了实例。这对设计复杂的网络驱动程序是很有帮助的。 |
|