设为首页 加入收藏

TOP

设计Linux系统网络设备驱动程序(二)
2010-12-30 20:36:04 】 浏览:7335
Tags:设计 Linux 系统 网络设备 驱动程序
evice数据结构中的init函数指针所指的初始化函数来完成的。当内核启动或加载网络驱动模块的时候,就会调用初始化过程。这个过程将首先检测网络物理设备是否存在。它通过检测物理设备的硬件特征来完成,然后再对设备进行资源配置。这些完成之后就要构造设备的device数据结构,用检测到的数值来对device中的变量初始化。这一步很重要。最后向Linux内核注册该设备并申请内存空间。

3. 数据包的发送与接收

数据包的发送和接收是实现Linux网络驱动程序中两个最关键的过程。对这两个过程处理的好坏将直接影响到驱动程序的整体运行质量。图1中也很明确地说明了网络数据包的传输过程。首先在网络设备驱动加载时,通过device域中的init函数指针调用网络设备的初始化函数,对设备进行初始化。如果操作成功就可以通过device域中的open函数指针调用网络设备的打开函数打开设备,再通过device域中的建立硬件包头函数指针hard_header来建立硬件包头信息。最后通过协议接口层函数dev_queue_xmit(详见/linux/net/core/dev.c)来调用device域中的hard_start_xmit函数指针,完成数据包的发送。该函数将把存放在套接字缓冲区中的数据发送到物理设备。该缓冲区是由数据结构sk_buff (详见/linux/include/linux/sk_buff.h)来表示的。

数据包的接收是通过中断机制来完成的。当有数据到达时,就产生中断信号,网络设备驱动功能层就调用中断处理程序,即数据包接收程序来处理数据包的接收。然后,网络协议接口层调用netif_rx函数(详见/linux/net/core/dev.c),把接收到的数据包传输到网络协议的上层进行处理。

实现模式

实现Linux网络设备驱动功能主要有两种形式:一是通过内核来进行加载,当内核启动的时候,就开始加载网络设备驱动程序,内核启动完成之后,网络驱动功能也随即实现了;再就是通过模块加载的形式。比较两者,第二种形式更加灵活。在此着重对模块加载形式进行讨论。

模块设计是Linux中特有的技术,它使Linux内核功能更容易扩展。采用模块来设计Linux网络设备驱动程序会很轻松,并且能够形成固定的模式。任何人只要依照这个模式去设计,都能设计出优良的网络驱动程序。先简要介绍一下基于模块加载网络驱动程
首页 上一页 1 2 3 4 5 6 下一页 尾页 2/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Linux部分命令简介 下一篇Linux系统调用跟我学――僵尸进程

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目