【Linux device driver】网络设备驱动程序(二)

<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
2.1 网络驱动程序的结构    
  Linux网络驱动程序的体系结构如图1所示。
可以划分为四层:
(1)协议接口层
(2)网络设备接口层
(3)设备驱动功能层
(4)及网络设备和网络媒介层。
网络驱动程序重点:完成设备驱动功能层
在Linux中,所有网络设备都抽象为一个接口(interface)。这个接口提供了对所有网络设备的操作集合,由数据结构 struct net_device表示。
数据结构net_device中有很多供系统访问和协议层调用的设备方法,包括供设备初始化和往系统注册用的init函数、打开和关闭网络设备的open和stop函数、处理数据包发送的函数hard_ start_xmit,以及中断处理函数等。有关net_device数据结构(在内核中也就是net_device)的详细内容,请参看/linux/include/linux/netdevice.h
2.2 网络驱动实现模式
  
  实现Linux网络设备驱动功能主要有两种形式:

    (1)通过内核来进行加载,当内核启动的时候,就开始加载网络设备驱动程序,内核启动完成之后,网络驱动功能也随即实现了;

    (2)再就是通过模块加载的形式。

    比较两者,第二种形式更加灵活。
在此着重对模块加载形式进行讨论。
  (1)insmod 来把网络设备驱动程序插入到内核之中。
    (2) insmod将调用init_module()函数
    (3) 对dev->init
函数指针赋值
    (4)register_netdev()函数注册该网络设备。如果成功,网络设备初始化,
        将net_device 数据结构插入到dev_base链表的末尾。
    (5)模块卸载 rmmod
具体实现过程见图2所示。

 

2.3 网络驱动程序的基本方法
2.3.1 初始化
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux设备驱动程序是一种软件模块,它允许操作系统与硬件设备进行通信。设备驱动程序的设计需要遵循一定的规范和流程,包括以下几个步骤: 1. 确定设备类型:设备可以是字符设备、块设备网络设备等。每种设备类型都有不同的驱动程序接口和操作方法。 2. 编写设备驱动程序设备驱动程序是一个内核模块,它包含了设备的初始化、读写操作、中断处理等函数。驱动程序需要遵循Linux内核的编程规范和API。 3. 注册设备驱动程序驱动程序需要在内核中注册,以便操作系统能够识别和加载它。注册过程包括分配设备号、初始化设备结构体、注册字符设备或块设备等。 4. 测试设备驱动程序:测试设备驱动程序需要使用一些工具和技术,例如ioctl命令、proc文件系统、sysfs文件系统等。测试过程需要验证设备的正确性、性能和稳定性。 以下是一个简单的字符设备驱动程序的例子: ```c #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #define DEVICE_NAME "mydevice" #define BUF_LEN 1024 static int Major; static char msg[BUF_LEN]; static char *msg_ptr; static int device_open(struct inode *inode, struct file *file) { msg_ptr = msg; try_module_get(THIS_MODULE); return 0; } static int device_release(struct inode *inode, struct file *file) { module_put(THIS_MODULE); return 0; } static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t *offset) { int bytes_read = 0; if (*msg_ptr == 0) return 0; while (length && *msg_ptr) { put_user(*(msg_ptr++), buffer++); length--; bytes_read++; } return bytes_read; } static ssize_t device_write(struct file *filp, const char *buffer, size_t length, loff_t *offset) { int i; for (i = 0; i < length && i < BUF_LEN; i++) get_user(msg[i], buffer + i); msg_ptr = msg; return i; } static struct file_operations fops = { .read = device_read, .write = device_write, .open = device_open, .release = device_release }; static int __init init_module(void) { Major = register_chrdev(0, DEVICE_NAME, &fops); if (Major < 0) { printk(KERN_ALERT "Registering char device failed with %d\n", Major); return Major; } printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major); printk(KERN_INFO "the driver, create a dev file with\n"); printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major); return 0; } static void __exit cleanup_module(void) { unregister_chrdev(Major, DEVICE_NAME); } MODULE_LICENSE("GPL"); MODULE_AUTHOR("Your Name"); MODULE_DESCRIPTION("A simple example Linux module."); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值