首页 > 代码库 > 设备驱动简介 -- ldd3读书笔记

设备驱动简介 -- ldd3读书笔记

    1. 概述

    读《Linux Device Drivers 3》(影印版)(简称 ldd3)已经到第九章了,感觉前面的也忘的差不多了。所以准备把以前读过的内容做一下笔记,并且主要侧重代码的注释与理解。因为我也是一个Linux内核新手,所以将一步一步的介绍在学习驱动过程中的每一个细节。希望这些博客在巩固知识的同时,能够帮助到其他像我一样摸索在Linux驱动和内核学习领域的入门新手。

    这一篇博客算是后续系列博客的开篇,主要介绍一下与Linux的设备驱动相关的概念以及驱动环境的搭建。


    2. Linux驱动简介

    以前还没有接触过驱动之前,就听我的同学说,他以后要做驱动开发,因为驱动处于底层,技术更新比较慢,这样他就不用整天跟着流行技术跑了。当时就感觉驱动是高大上的技术,下定决心也要学习底层的东西。后来我的同学去了华为,不知道他有没有在做驱动,反正我是下定决心学习要学习Linux内核。

    简单的说,驱动就是用来管理硬件的内核代码。驱动程序的本质就是内核代码,用来为上层的应用程序提供支持。学习了驱动程序之后,才明白了上层的应用到底是如何工作的。驱动程序既可以以模块的形式独立存在,在需要的时候再被加载到内核中;又可以被编译到内核中,直接使用。两种方式各有优缺点,模块化的驱动使得内核的体积更小,而内置的驱动可以不用每次启动系统后都加载需要的模块。一般来说,如果某个模块是你所经常需要用到的,建议将这个模块编译到内核中。不过现在模块化已经深入人心,所以ldd3这本书介绍的驱动主要是模块化(module)的。

    驱动可以划分为三类:字符设备驱动,块设备驱动和网络驱动。

    字符设备驱动是最常见的一类驱动,例如写一个控制LED的驱动程序就属于字符设备驱动。这类驱动就像一个文件一样,通过文件系统中的一个节点(存在于/dev目录之下)进行访问。字符设备驱动实现的操作应该包括open,close,read和write,对它的操作是基于字节流的,就像是在一个操作一个文件(可能没有lseek操作)。

    块设备驱动通常与存储设备有关,在块设备上可以安装一个文件系统,例如硬盘等。在大多数unix系统上,块设备驱动的操作不是基于字节流,而是基于块,一个块一般为512字节。不过在Linux系统中,已经掩盖这个特点,使得块驱动一次可以传输任意的数据,这也就和字符设备完全一样了。另外,应用程序对于块设备驱动的访问也是通过/dev下的文件系统节点来进行的。

    网络设备在这里就先不介绍了。

 

    3. 驱动开发环境搭建

    关于 ldd3 的代码可以使用下面的命令从 git 仓库进行拷贝:

git clone https://github.com/duxing2007/ldd3-examples-3.x

将仓库克隆到本地之后,进入到仓库的目录,运行 make 命令进行编译,就可以使用了。这个仓库包含了 ldd3 每一章介绍的代码示例,很有参考价值。关于仓库中具体模块的使用,以及在编译过程中出现的错误,将会在以后的博客中介绍。

设备驱动简介 -- ldd3读书笔记