上一节中介绍了并发和竞态的概念,以及介绍了一些手段用于避免产生竞态,包括信号量、completion机制、自旋锁、原子变量等。 本节我们使用其中的信号量来编写一个简单的示例,来看看这些手段是怎么工作的。 本节主要的内容是: 使用信号量 1. 驱动设计 本节我们基于之前的scull设备进行驱动设计,新
之前的scull字符设备驱动实例中,我说过还有许多不完善的地方。考虑如下状态:当读取的数据量比较大或者比较耗时,此时有其他的线程在我们的数据区域中写入新的数据,那此时我们读到的数据会是什么情况呢? 本节以介绍一些概念为主,主要学习以下内容: 竞态和并发的概念; 避免出现竞态的一些手段介绍(信号量、互
上一节介绍了字符驱动中的一些概念,这一节我们将会基于系统内存编写一个字符设备驱动,加深对上一节中的概念的理解。 本节主要学会的内容: 字符设备注册 对设备节点进行cat和echo操作 1. 驱动设计 编写驱动之前,我们要明确我们的驱动需要或者能够为用户程序提供什么功能,这也是我们之前提到的机制。 在
之前我们说过,Linux设备主要分为三类:字符设备、块设备和网络接口。 字符设备相对于另外两个设备更加容易理解,同时,这类设备也适合大多数简单的硬件设备,因此,接下来我们学习一下字符设备驱动。 字符驱动的学习分为两节:先介绍一下字符驱动驱动中的一些概念,这些概念有些在块设备中也是相同的;然后基于系统
之前完成了Hello World模块,学会了基本的模块编译、加载和卸载。 作为一个模块,对于不同的系统,可能需要的参数会有所变化,或者对于相同的系统,在不同情况下有不同的参数需求。为了满足这个需求,内核允许在加载驱动模块的过程中指定参数。 本节主要学会以下内容:. 在加载模块过程中设定参数 1. 支
Hello World是许多人开始写代码的时候第一个编写的例子,这里也延续传统,从Hello World开始。 本节主要学会以下内容: 了解模块相关的内容:模块概念、模块编译、模块加载/卸载命令 HelloWorld模块:编译、加载 1. 模块相关内容 Linux本身是一个单内核,为了提高其可扩展性
有多少Linux驱动工程师是通过《Linux设备驱动程序》这本书入门的呢?今天翻到了抽屉里的这本书,想想也是挺感慨的。 Linux设备驱动程序封面 想着自己工作也快三年了,对于Linux驱动程序的开发还是有许多不清楚的地方。所以重新翻开这本书,通过文章来记录并实践其中的知识要点,加强自己对于Linu