归档

2023 年 12 月

上一节主要说了如何进行延迟操作,这些延迟都是操作当前线程,使得当前线程阻塞或休眠,等到时间到达后再继续在当前线程执行的延迟方法。如果需要在将来的某个时间点执行,而当前线程不阻塞,则需要使用异步延迟的操作方法。 本节主要介绍几个异步延迟操作的方法,包括以下: 内核定时器 tasklet机制 工作队列
之前我们学会了如何编写一个字符设备,并对其中的一些重要操作进行了说明。对于一个完整的设备而已,可能还有许多工作要做。 本节我们将要说一下内核中是如何对时间问题进行操作的。 本节主要涉及到以下内容: 内核中的时间描述; 如何获取当前时间; 如何进行延时操作; 1. 内核中的时间描述 在内核中,系统定时
本节是本书中《高级字符驱动程序操作》章节的第四节内容,也是最后一节,主要是关于设备读写位置定位和设备文件的访问控制相关的概念和内容。 本节主要有以下内容: llseek的实现 设备文件的访问控制 1. llseek的实现 llseek操作只对于具有明确定义的数据区的设备有意义,而对于提供数据流的设备

2023-12-26

本节是本书中《高级字符驱动程序操作》章节的第三节内容。本节主要涉及到的是多路复用IO接口poll、select和epoll。 本文主要的内容有以下: poll、select和epoll的作用; 驱动中的poll操作; epoll实例 1. poll、select和epoll的作用 在非阻塞IO的应用

2023-12-26

本节是本书中《高级字符驱动程序操作》章节的第二节内容。本节主要涉及到的是进程睡眠和唤醒相关的内容。 本节主要涉及以下内容: 休眠的简单介绍 休眠与唤醒相关的操作函数 1. 休眠简介 休眠是指进程被标记为一种特殊状态,并从调度器的运行队列中移走。休眠的进程会被搁置在一边,等待将来的某个事件发生,修改这
接下来要说的内容是书中的《高级字符驱动程序操作》章节。本章的内容比较长,所以分多节介绍。本节主要介绍的是其中的ioctl操作。 1. 简介 对于一个设备,除了具有读取和写入功能之外,还需要通过驱动程序执行各种类型的硬件控制,而ioctl就是用于设备控制的接口。 在用户空间中,ioctl系统调用的原型
上一节中介绍了并发和竞态的概念,以及介绍了一些手段用于避免产生竞态,包括信号量、completion机制、自旋锁、原子变量等。 本节我们使用其中的信号量来编写一个简单的示例,来看看这些手段是怎么工作的。 本节主要的内容是: 使用信号量 1. 驱动设计 本节我们基于之前的scull设备进行驱动设计,新
之前的scull字符设备驱动实例中,我说过还有许多不完善的地方。考虑如下状态:当读取的数据量比较大或者比较耗时,此时有其他的线程在我们的数据区域中写入新的数据,那此时我们读到的数据会是什么情况呢? 本节以介绍一些概念为主,主要学习以下内容: 竞态和并发的概念; 避免出现竞态的一些手段介绍(信号量、互
上一节介绍了字符驱动中的一些概念,这一节我们将会基于系统内存编写一个字符设备驱动,加深对上一节中的概念的理解。 本节主要学会的内容: 字符设备注册 对设备节点进行cat和echo操作 1. 驱动设计 编写驱动之前,我们要明确我们的驱动需要或者能够为用户程序提供什么功能,这也是我们之前提到的机制。 在
之前我们说过,Linux设备主要分为三类:字符设备、块设备和网络接口。 字符设备相对于另外两个设备更加容易理解,同时,这类设备也适合大多数简单的硬件设备,因此,接下来我们学习一下字符设备驱动。 字符驱动的学习分为两节:先介绍一下字符驱动驱动中的一些概念,这些概念有些在块设备中也是相同的;然后基于系统