首页 理论教育 嵌入式Linux编程实例:加载网络设备驱动

嵌入式Linux编程实例:加载网络设备驱动

时间:2023-10-31 理论教育 版权反馈
【摘要】:网络设备驱动程序的内核启动加载dev_base链表中的第一个节点是环回设备,即通常所说的环回接口,用于检测系统是否支持网络通信。链表中的下一个网络设备给出不同配置的Linux内核,通常由宏NEXT_DEV指定。网络设备驱动程序的模块加载通过模块驱动的方法是Linux中使用模块设计的一种方案。然后调用网络设备驱动程序中的init_function,也就是dev->init函数指针来检测网卡设备是否存在,并且做dev的初始化工作。

嵌入式Linux编程实例:加载网络设备驱动

网络设备的驱动程序可通过两种方式进行加载:内核启动加载的方法和模块加载的方法。

(1)网络设备驱动程序的内核启动加载

dev_base链表中的第一个节点是环回设备(loopback_dev),即通常所说的环回接口,用于检测系统是否支持网络通信。链表中的下一个网络设备给出不同配置的Linux内核,通常由宏NEXT_DEV指定。所有支持的网络设备都通过这个宏存放在dev_base链表中。其中,以太网检测设备在函数ethif_probe中通过调用probe_list函数来实现。内核启动方式的函数调用流程如图8-7所示。

(2)网络设备驱动程序的模块加载

通过模块驱动的方法是Linux中使用模块设计的一种方案。Linux的内核是将所有的支持编译在一起的。如果对Linux内核增加一项功能,就把它的实现直接放在内核代码中。为了让Linux的内核体积不致过于庞大,采用了编译成内核的方式。在需要用到这个模块时,用insmod命令将该模块插入到内核的运行空间;如果不需要,就用rmmod命令将该模块卸载。

978-7-111-33316-6-Chapter08-38.jpg(www.xing528.com)

图8-7 内核启动方式的函数调用流程

在ne.c中,init_module()函数首先初始化dev设备的init函数指针,然后调用register_netdev()函数在系统中登记该设备。若登记成功,则模块成功插入,否则返回出错信息。在register_netdev()里面,首先检查该网络设备名是否确定,如果没有,就赋一个默认的名称。然后调用网络设备驱动程序中的init_function,也就是dev->init函数指针来检测网卡设备是否存在,并且做dev的初始化工作。如果初始化成功,就将该dev设备加入到dev_base链表尾部。采用模块加载方式启动网络设备的流程如图8-8所示。

978-7-111-33316-6-Chapter08-39.jpg

图8-8 采用模块加载方式启动网络设备的流程

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈