Linux驱动开发基础

1.Linux驱动开发思维

裸机开发的思维:

是跟底层的寄存器之间打交道,有一些MCU的官方会提供相应的库。比如说SDK包。

linux应用开发思维:

以一个摄像头的应用开发为例。它的过程是:首先把摄像头连接到ubuntu。在/dev下会出现一个设备节点,比如/dev/video1。然后在网上找到一个摄像的源代码。在源代码的.c中把video1带入到相应的设备名就可以了。

linux驱动开发思维:

直接操作寄存器不太现实,它是根据linux下的各种驱动框架进行开发。

驱动的最终表现就是/dev/xxx文件。 打开、关闭、读写。

现在新的内核支持设备树,这是一个.dts文件,相当于说开发板上的每一个设备都对应有一个存储设备信息的文件,挂载在设备树上。

当我们要添加新的设备时,首先我们把设备挂载到设备树上,然后把相应的驱动程序挂载上去,然后match进行匹配,从而通过应用程序操作驱动程序,驱动程序再操作设备。

2.Linux驱动分类:

字符设备驱动  :

字符设备是指只能一个字节一个字节读写的设备(读写大小:单字节),不能随机读取设备内存中的某一数据,读取数据需要按照先后数据(读写顺序:顺序)。

ep:IIC   鼠标  USB                   USB WIFI (既属于字符设备,又属于网络设备)

块设备驱动  :

系统中能够随机访问固定大小数据片的设备被称之为块设备。

网络设备驱动:

字符设备在 /dev 目录下会有对应设备文件节点并且在注册时会有设备号。网络设备没有对应设备节点和设备号,网络设备使用套接字来实现网络数据的接收和发送。

上层协议:就是主机(PC机)中的通信协议。

**网络设备与媒介层:**对应实际的硬件设备。

**设备驱动功能层:**对应net_device结构体中的设备驱动功能函数。

**网络设备接口层:**的主要功能是为千变万化的网络设备定义了统一、 抽象的数据结构 net_device 结构体。 Linux内核使用 net_device结构体表示一个具体的网络设备,网络驱动的核心就是初始化net_device 结构体中的各个成员变量,然后将初始化完成以后的net_device 注册到 Linux内核中。有些类似于字符设备的c_device。

当上层的协议需要发送数据包时,就会调用 dev_queue_xmit() 函数。当上层需要接收数据包时,就会调用netif_rx()函数。skb表示要发送的数据,是一个sk_buff的结构体指针。在发送数据时,网络数据都是以sk_buff保存的,各个协议层都会在sk_buff中添加自己的协议头,最终由底层驱动将sk_buff中的数据发送出去。在接收数据时,网络底层驱动将接收到的原始数据打包成sk_buff,然后发送给上层协议,上层协议会逐步去掉对应头部,然后将最终数据发送给用户。

**网络协议接口层:**实现数据的收发功能。为上层协议提供透明的数据包发送和接受接口。

3.驱动与应用程序的交互原理

用户空间和内核空间:

内核空间:

它是操作系统内核运行的空间,它包括了操作系统的内核代码,设备驱动程序等。只有操作系统内核(处于内核态)才能访问。

用户空间:

它是指应用程序运行的空间。

对于一个32位操作系统而言。它的4GB寻址空间(虚拟地址空间)。最高的1G字节地址(0xC0000000 ~ 0xFFFFFFFF)分配给内核空间。3G字节的地址分配给用户空间(0x00000000 ~ 0xBFFFFFFF)。

用户空间的虚拟地址是由操作系统分配和管理的,他们通过页表映射到物理地址空间。内核空间的虚拟地址是由内核自己管理,直接映射到物理地址空间。最终的目的是安全性,防止应用程序去访问,修改CPU等核心资源。

所以,应用程序访问内核空间的驱动程序,有3种方式:系统调用、异常(中断)和陷入。

C库向应用提供一个printf()函数,同时它通过陷入的方式(软中断)进入内核空间,指定某一个系统调用号码,然后这个系统调用号码对应哪一个系统函数,以此来实现调用功能。应用程序也可以直接调用系统调用(很少见)。

4.字符设备驱动框架

我们用到的read() open()等函数,都在linux源码下/include/linux/fs.h中,在struct file_operation中调用相关函数即可。

Linux驱动有两种运行方式,一种是编译到内核中,当内核启动的时候,会自动运行驱动程序。

一种是编译成模块。在Linux内核启动以后,用insmod命令/modprobe命令加载驱动模块。调试完成之后卸载即可。这种方式对于调试来说更为方便。

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值