Linux驱动-(一)驱动综述

Linux驱动-(一)驱动综述

一、Linux驱动

  • Linux是一个成功的优秀的开源项目,随着应用的日益广泛,Linux已受到越来越多的软件开发者的追捧。但是从官网上面下载下来Linux源码后,我们会发现Linux的世界是如此巨大,代码量是如此巨大。要想学习,Linux到底该从哪里入手呢?

    之前在一本很有名气讲述Linux的书中,看到作者有提到两个不错的突破口,可以帮助我们更好的进入Linux的世界—网络和驱动。

    那么从本篇博文开始我将本着学习和交流的态度在这里分享一些关于Linux驱动相关的一些知识,一些是我从书上或是其他博文看到的,一些是我自己的编程体会,我将这些都融入到一起记录在这里。

  • Linux的驱动开发的是内核级别的开发,所以他对编程的要求会更加的高。因为,我们很小的一个纰漏都很有可能导致系统的崩溃。特别注意的是在内核开发过程中指针的使用,每一步必须清楚的知道自己的指针是指向何处的,以及它访问的地址是否是合法的。

  • 同裸机开发一样,驱动开发同样也需要进行中断的处理。在内核驱动中中断又分为中断上下文,即一部分先去响应中断,一部分去处理中断。(这部分后续会详细讲述,这里只是提出一个概念)

  • 驱动程序是要被上层应用程序调用的,所以我们应该给上层应用程序提供好API,以供上层程序去调用。当然啦,这也就是驱动程序的核心所在啦,虽然我们是系统层的编程呢?当然要为运行在我们是上面的程序提供一个合适的环境以及硬件驱动的接口啦。

  • 一类驱动都有一个特定的驱动模板,以后统一称之为驱动框架吧。所有的驱动都有一种类似的实现模式,就是构造核心的数据结构,然后注册到内核。编写驱动,实际上就是去学习这些核心的数据结构和与之相关的一套API(注意这句话,后面基本是围绕这句话来是实现相关驱动的讲解)。同样我们在编写内核驱动的时候,应该尽量利用内核中已有的实现而不是自己重新去构建。

二、Linux驱动分类

当然啦,上面有讲过,不同设备类型不同与之对应的驱动框架也是不同的,那么Linux中的驱动框架主要分为哪些呢?其实,Linux的驱动主要分为以下三种:

字符设备;这类设备的访问是按照字节流(类似文件)一样被访问的设备,由字符设备驱动程序来实现这种特性。字符驱动程序至少要实现open(),close(),read()以及write()的系统调用。例如:字符终端(/dev/console)和串口(/dev/ttySo以及类似设备)就是两个字符设备,他们可以很好的说明"流"的概念。字符设备可以通过设备结点来访问,比如:/dev/tty1和/dev/lp0等等。这些设备文件和普通文件之间的唯一差别在于对普通文件的访问可以先后移动访问位置,而大多数字符设备是一个只能顺序访问的数据通道。然而,也存在具有数据特性的字符设备,访问他们可前后移动位置。例如framebuffer就是这样一个设备,APP可以通过map或lseek访问抓取整个图像。

块设备:所谓块设备就是每次读写时只能传输一个完整的或多个完整的块,而每块包含512个字节(或2的更高字节的数据)。和字符设备类似,块设备也是通过/dev目录下的文件系统节点来访问。块设备,例如磁盘上能够容纳filesystem。块设备和字符设备的去呗在于内核内部管理数据的方式,也就是内核及驱动程序之间的接口,在内核中,块设备的驱动程序的接口和字符设备完全不同。

网络设备:网络设备呢,和上面两个都不一样。当然啦,它要更加复杂一些。我们知道任何网络事物都需要经过一个网络接口形成,网络接口是一个能够和其他主机交换数据的设备。接口通常是一个硬件设备,但是通常也可能是一个纯软件设备,比如回环(loopback)接口。网络接口是由内核中的网络子系统驱动的,负责发送和接收数据包。由于不是面向流的设备,因此将网络设备接口映射到filesystem中的节点(比如/dev/tty1)比较困难。Unix访问网络接口的方法仍然是给他们分配一个唯一的名字(比如:rth0),但这个名字在filesystem中不存在对应的节点。内核和网络驱动程序的通信,完全不同于内核和字符设备以及块设备之间的通信,内核调用一套和数据包相关的函数而不是上面提到的read和write等。

好啦,通过上面的分析我们已经在心里对Linux设备驱动有了一个清晰的分类。

  • Linux驱动是基于GNU C的一些标准开发的,其中包含了一些C语言语法的扩展和GNU C的一些标准。(GNU呢,是当前世界上最大的一个软件开源组织。想要具体了解的小伙伴可以去网上搜搜看看)

  • 当然啦,想要对Linux内核有一个基础了解的小伙伴可以去看下我的另一篇博文,里面有对Linux内核的一些基础介绍:

    https://blog.csdn.net/wit_732/article/details/102806376

  • 最后,是文中提到的一些网络的地址,我把他们贴到这里,供查阅使用

    GNU C标准相关文档:https://www.kernel.org/doc/Documentation/CodingStytle

    Linux 原码下载文档:https://www.kernel.org/

发布了49 篇原创文章 · 获赞 15 · 访问量 9260

猜你喜欢

转载自blog.csdn.net/wit_732/article/details/102881266