首页 >> 知识 >> rtl8139网卡驱动源码解析

rtl8139网卡驱动源码解析

学习应该是一个先把问题简单化,在把问题复杂化的过程。一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉。读Linux网卡驱动也是一样。那长长的源码夹杂着那些蜜桃成人网站入口陌生的变量和符号,望而生畏便是理所当然的了。不要担心,事情总有解决的办法,先把一些蜜桃成人网站入口管不着的代码切割出去,留下必须的部分,把框架掌握了,哪其他的事情自然就水到渠成了,这是笔者的心得。 一般在使用的Linux网卡驱动代码动辄3000行左右,这个代码量以及它所表达出来的知识量无疑是庞大的,蜜桃成人网站入口有没有办法缩短一下这个代码量,使蜜桃成人网站入口的学习变的简单些呢,经过笔者的不懈努力,在仍然能够使网络设备正常工作的前提下,把它缩减到了600多行,蜜桃成人网站入口把暂时还用不上的功能先割出去。这样一来,事情就简单多了,真的就剩下一个框架了。下面蜜桃成人网站入口就来剖析这个可以执行的框架。

限于篇幅,以下分析用到的所有涉及到内核中的函数代码,我都不予列出,但给出在哪个具体文件中,请读者自行查阅。

在安装自己的驱动程序前,首先要卸载原始的驱动程序:ifconfig eth%d 和 rmmod rtl8139。再执行insmod rtl8139,这样就进入module_init(rtl8139_init_module);在蜜桃成人网站入口的程序中,rtl8139_init_module()这个函数就是驱动程序入口。

static int __init rtl8139_init_module (void){return pci_module_init (&rtl8139_pci_driver);} 它直接调用了pci_module_init(),这个函数代码在Linux/drivers/net/eepro100.c中,并且把rtl8139_pci_driver(这个结构是在蜜桃成人网站入口的驱动代码里定义的,它是驱动程序和PCI设备联系的纽带)的地址作为参数传给了它。rtl8139_pci_driver定义如下 :

static struct pci_driver rtl8139_pci_driver = {name: MODNAME,id_table: rtl8139_pci_tbl,probe: rtl8139_init_one,remove: rtl8139_remove_one,};

pci_module_init()在驱动代码里没有定义,你一定想到了,它是Linux内核提供给模块是一个标准接口,那么这个接口都干了些什么,笔者跟踪了这个函数。里面调用了pci_register_driver(),这个函数代码在Linux/drivers/pci/pci.c中,pci_register_driver做了三件事情:

1、是把带过来的参数rtl8139_pci_driver在内核中进行了注册,内核中有一个PCI设备的大的链表,这里负责把这个PCI驱动挂到里面去。

2、是查看总线上所有PCI设备(网卡设备属于PCI设备的一种)的配置空间如果发现标识信息与rtl8139_pci_driver中的id_table相同即rtl8139_pci_tbl,而它的定义 如下:

static struct pci_device_id rtl8139_pci_tbl[] __devinitdata = {{0x10ec, 0×8129, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 1},{PCI_ANY_ID, 0×8139, 0x10ec, 0×8139, 0, 0,0 },{0,}}; 那么就说明这个驱动程序就是用来驱动这个设备的,于是调用rtl8139_pci_driver中的probe函数即rtl8139_init_one,这个函数是在蜜桃成人网站入口的驱动程序中定义了的,它是 用来初始化整个设备和做一些准备工作。这里需要注意一下pci_device_id是内核定义的用来辨别不同PCI设备的一个结构,例如在蜜桃成人网站入口这里0x10ec代表的是Realtek公 司,蜜桃成人网站入口扫描PCI设备配置空间如果发现有Realtek公司制造的设备时,两者就对上了。当然对上了公司号后还得看其他的设备号什么的,都对上了才说明这个驱动是可 以为这个设备服务的。

3、是把这个rtl8139_pci_driver结构挂在这个设备的数据结构(pci_dev)上,表示这个设备从此就有了自己的驱动了。而驱动也找到了它服务的对象了。

PCI是一个总线标准,PCI总线上的设备就是PCI设备,这些设备有很多类型,当然也包括网卡设备,每一个PCI设备在内核中抽象为一个数据结构pci_dev,它描述了一个PCI设备的所有的特性,具体请查询相关文档,

网站地图