Linux驱动笔记

驱动
1.网络设备
    其实是一个软件概念,一个物理网卡安装到了你的开发板上或者安装到了你的电脑上,经过了驱动的作用,
    在我们的Linux内核里面能够ifconfig查看到,Linux内核能够借用这个网卡与外界进行通信,那么这一套硬件加
    软件的体系,尤其指的是这一套软件,就被称为网络设备。
    ifconfig查看到的eth0和lo就是两个网络设备,网络名称eth0及lo有点类似于设备文件,但是它不是设备文件,
    准确来说它只是设备的一个名称。
    网络设备被抽象成一个能够发送和接收数据包的抽象设备,我们把它称为“网络接口”。把它理解为软件虚拟出来的一个网卡,
    这个网卡能够完成的任务是对外发送和接收数据包。网卡有虚拟(比如VMnet8)的也有真实的。
2. 物理网卡
    加了物理二字,这里指的是硬件,真正的硬件网卡设备。
    驱动的目的是什么?驱动是让应用来调用的,应用于驱动之间有一个调用接口。
    这个接口就是/dev下的设备文件,或者是/sys下的属性文件。不管是块设备还是字符设备都是这样来操作的。
    应用层是不知道有几个网卡的,只有驱动层才知道,应用层是通过命令ifconfig来查看驱动层有几个网卡,
    ifconfig背后肯定是调用了网卡的驱动;ping本身是应用层的一个命令,它调用了网卡的驱动来跟远端设备来通信
    网络设备的应用层和驱动层给我们的一个感受是它们是通过特殊命令(如ifconfig、ping等)来访问网卡硬件(调用驱动)的,
    本质上应用调用驱动的方法可以通过分析ping、ifconfig等命令的实现来得知。
    实际就是通过:socket、bind、listen、connect、send、recv等API来实现的。
    网络设备被抽象成一个结构体 struct net_device,通过这个结构体来管理所有网络接口
3. 网络设备的访问方法
(1)网络设备的访问方法和字符设备及块设备访问方法不一样。
     字符和块设备是通过文件来访问的,它们两践行了一切皆文件的这套理论。
(2)两个数据结构(net_device和sk_buff) 这个sk_buff是内存里面开发出来的用来存储一个sockey文件包,
    这个包就是网络文件发送和接收的一个数据包,发送和接收都要通过sk_buff,所有sk_buff这个结构体你可以
    把它看成是数据包的一个抽象,net_device就是网络设备。可以这么来表述,一个net_device就是可以发送和接收
    sk_buff的接口。
(3)一个虚拟网卡案例代码分析+DM9000驱动源码分析。
    虚拟网卡是不能用的,即不能用了上网,毕竟没有硬件的支持,
    aston_net_probe里面:
    astonnet_devs=alloc_etherdev()先分配内存,
    astonnet_devs->netdev_ops=&astonnet_netdev_ops;填充
    result = register_netdev(astonnet_devs);注册,注册完了以后内核里面就有这么一个设备了,
    注册完了以后就等着应用层来调用了,应用层就是通过ifconfig来调用的,
    例如ifconfig enss33 up对应函数astonnet_open这个函数,
    netif_start_queue(dev); //打开传输队列,这样才能进行数据传输,这个函数是内核来提供的,这个队列起到缓存的作用
    struct astonnet_priv;//把当前网卡的全部信息全部定义出来,
    网卡接收是采用中断模式,所有struct net_device_ops里面没有rx相关的变量
4. DM9000驱动源码分析
    

猜你喜欢

转载自blog.csdn.net/taotongning/article/details/82857007