字符设备驱动01 | 学习笔记

简介: 快速学习字符设备驱动01

开发者学堂课程【物联网开发 - Linux 驱动开发实操演练:字符设备驱动01】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/657/detail/10873


字符设备驱动01


内容介绍:

一、回顾

二、驱动的种类

三、字符驱动设备


一、回顾

在上节课中,讲了内核模块的相关内容,包括内核模块的编写编译,内核模块的使用,只要将编译考虑的内核模块充当内核,当不想使用的时,怎样将模块下载出来,还有模块相关的一些查看信息等的这些命令,内核模块的知识点是比较重要的,要学习和复习好内核模块的基础知识,才有助于字符设备驱动的学习。

Linux 将设备分成三大类:一字符设备驱动,二块设备驱动,三网络设备驱动。

前面讲解了 linux 内核模块,那它和设备驱动有什么关系呢?

(1)模块是 linux 内核进行组件管理的一种方式,驱动是基于模块进行注册和注销的。

(2)不单单是字符设备,块设备驱动和网络设备驱动都是基于模块进行加载和删除的。


二、驱动的种类

1、字符设备(种类多)

A、IO传输过程中以字符为单位进行传输

B、用户对字符设备发出读或写请求,实实际的硬件读或写操作一般紧接着发生(体现了同步的过程)

Eg: LCD、鼠标、键盘、

2、块设备

块设备与字符相反,它的数据传输一块,内存缓冲为单位传输。

用户对块设备读或写时,硬件上的读或写操作不会紧接着发生及用户请求和硬件操作是异步的。

Eg:磁盘类、内存类等设备都封装成块设备

3、网络设备(网卡设备)

网络设备是一类特殊的设备,它不像字符设备或块设备那样通过对应的设备文件访问,也不能直接通过 read 或 write 进行数据请求,而是通过 socket 接口函数进行访问。

除了网络设备和块设备以外都为字符设备。

设备文件:字符设备和块设备有设备文件、网络设备没有设备文件。(一切兼文件)对文件的操作就是对设备的操作。(理解)

 

三、 字符驱动设备

字符设备是最基本的,最常用的设备,它将千差万别的各种硬件设备采用一个统一的接口封装起来,屏蔽硬件差异简化的应用层的操作。

所以,提到一个就是简化了应用层操作,相当于是这些硬件,只要是把驱动写好以后,给应用层提供一个统一的接口,那这样应用层,就统一用这个接口就能实现对硬件的。

这个操作就不需要去关心应用层到底是怎样的一个差异,有怎样的一个差异性,这是我们这个字符设备呢,要给大家提前讲的一些最基本的概念。

这个字符设备,他应该怎样去写,大家想一下,我们之前,给大家讲过 Linux 内核,或者 Linux 操作系统它的一个层次结构,再给大家来分析一下这个层次结构。

Linux 操作系统的层次结构:

从整体来看分为:应用层、内核层、设备。

设备分网络设备、字符设备、块设备。

学习字符设备,那应该就是字符设备,那这个设备要工作,既然他要工作的,我们首先需要把这个硬件,让他初始化配置好。然后,如果硬件是一个被控制的一个设备,那要控制他,让他去干什么事情?

如果它是某一类传感器要采集数据,那要跟这个设备进行通信,要提供一些读写方法,那这些东西,要在驱动里头完成的。就为每一个设备去写一个驱动,写个驱动去驱动我们这些设备。

首先,将设备硬件初始化配置好,通过驱动来将设备进行初始化分配

驱动对应设备。

内核的作用:

内核的五大作用,内存的管理,进程的调度,网络协议栈的支持,文件系统的管理,除了这四个,还有一个比较重要的就是设备管理或者叫驱动管理。

驱动都是由内核的设备管理来完成的。

在应用层和内核层之间有一层,应用程序必须通过系统调用才能操控设备系统调用,通过系统调用以后,经过系统管理,然后,找到对应的驱动,然后,去调用驱动里头的方法,最后实现对设备的一个操作。

image.png

因此在这个框架里,能够看到从应用层到底层的一个调用过程,而且还能清楚驱动实际上是由内核来管理的,由内核来管理,应该清楚,这个驱动在编写的时候,实际上是要遵循内核的一个框架的,要遵循内核给提供的一个字符设备驱动框架,如果不遵循这个框架,那内核的驱动管理,也没法进行统一的管理,必须得遵循我们这个内核提供的一个框架。

驱动在编写时应遵循内核框架,应建立一个结构体来描写驱动的所有信息,将结构体初始化注册到内核,让内核统一管理。

这点清楚以后,接下来想一想来讲内核,既然要管理设备,把设备分成了三大类,字符,块和网络,那它分成三大类以后,对我们字符设备的描述,应该统一抽象出来一个结构体来描述设备所有的通信。或者描述他所有的共性的信息。

管理的时候,要去写驱动,写的是一个字符设备驱动,他用了一个结构体,弄一个结构体。描述所有字符设备的通用的信息,来描述它所以同样的信息。

在写这个驱动的时候,应该去申请分配一个结构体,然后,给这个结构体去赋值,把这个结构体赋值,也就是一个初始化的过程,初始化好这个结构体以后,接下来应该把这个结构体,写的这个描述字符设备的一个结构体,注册给内核,让内核统一来管理,这就是内核去管理设备驱动的一个思路。

结构图:

image.png

管理内核驱动的一个思路,接下来所有的这个设备,所有的这个驱动,包括这个网络设备和块设备这个驱动,他也是这样的一个思路,不管怎么说呢,都是由内核统一管理的,内核就会抽象出这么一个结构体。

所以内核结构会抽象出结构体,字符结构为字符结构体块,设备为块设备结构体,网络设备为网络设备结构体,来描述设备。

那另外字符设备,网络设备和块设备又不止一种,它的特性的东西,是需要用户自己去描述,在描述具体的这个设备的时,也可以封装一个具体的设备信息的一个结构体,只不过是这个结构体里,必须包含通用信息的一个结构体。

内核到底是什么,这个结构体里到底有哪些信息,需要去掌握,需要去赋值,结构体的内容,结构体的成员变量分析完,后要讲就是这个结构体,策划完成以后,怎样将这个结构体注册给内核,调的是内核,提供的哪一个方法,这些是接下来课程中重点讲解和分析的内容。

相关文章
|
8月前
|
安全 网络协议 Linux
Linux驱动开发 设备驱动的基本概念
Linux驱动开发 设备驱动的基本概念
|
3月前
|
Linux API
字符设备驱动(1):Linux字符设备驱动结构
字符设备驱动(1):Linux字符设备驱动结构
35 1
|
6月前
|
存储 Linux API
嵌入式Linux 字符设备驱动标准ioctl接口
嵌入式Linux 字符设备驱动标准ioctl接口
|
7月前
|
存储 安全 Unix
【Linux驱动】字符设备驱动
【Linux驱动】字符设备驱动
34 0
|
8月前
|
存储 Linux 文件存储
Linux驱动入门(6.1)LED驱动---设备树
Linux驱动入门(6.1)LED驱动---设备树
84 0
|
9月前
|
Linux 编译器
Linux设备驱动---字符设备驱动接口函数
Linux设备驱动---字符设备驱动接口函数
84 1
|
9月前
|
存储 缓存 Unix
Linux设备驱动程序(三)——字符驱动
本章的目的是编写一个完整的字符设备驱动,我们开发一个字符驱动是因为这一类适合大部分简单硬件设备,字符驱动也比块驱动易于理解。
188 0
|
9月前
|
网络协议 Unix Linux
Linux设备驱动程序(一)——设备驱动简介
这一部分主要是用来介绍 Linux 设备驱动程序的一些基本概念,包括:Linux 设备驱动程序的作用、内核功能的划分、设备和模块的分类以及版本编号。
186 0
|
11月前
|
Linux API
字符设备驱动基础知识
字符设备驱动基础知识
|
11月前
|
Linux 芯片
Linux驱动之I2C设备驱动
下面的代码分析主要都在注释中,会按照驱动中函数的执行顺序分析。