之所以要关注数据类型,主要是要解决程序可移植性的问题。Linux是可以用在多个平台上的,因此要保证驱动程序具有可移植性。 内核中使用的数据类型主要包括以下三类: 标准C语言类型(例如:int) 确定大小的类型(例如:u32) 特定内核对象类型(例如:pid_t) 1. 标准C语言类型 在我们需要使用
设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。 轮询让CPU以固定的频率读取设备,看看数据是否准备好,准备好就读取; 如果确定知道设备数据会在很短的未来准备好,也可以让CPU等待一段时间,之后读取数据; 设备准备好数据后,拉中断信号,CPU在中
使用计算机离不开IO设备(键盘、鼠标、串口、打印机等),IO设备一般都有几个寄存器,通常我们都是对寄存器进行读写来控制IO设备的行为的。 不论什么设备,其读写寄存器的过程在硬件层面都是相同的:向地址总线发送电平信号(寻址),向控制总线发送电平信号(例如读写控制等),通过数据总线读写所需的数据。 上面
之前在编写字符设备的时候,我们使用过 kmalloc 和 kfree 来分配和释放内存,除了这个方法外,内核还提供了其他分配内存的方法。 本节主要说一下Linux中的内存分配问题。主要包括以下内容: kmalloc 介绍; slab 介绍; vmalloc 介绍; 1. kmalloc详细介绍 使用
上一节主要说了如何进行延迟操作,这些延迟都是操作当前线程,使得当前线程阻塞或休眠,等到时间到达后再继续在当前线程执行的延迟方法。如果需要在将来的某个时间点执行,而当前线程不阻塞,则需要使用异步延迟的操作方法。 本节主要介绍几个异步延迟操作的方法,包括以下: 内核定时器 tasklet机制 工作队列
之前我们学会了如何编写一个字符设备,并对其中的一些重要操作进行了说明。对于一个完整的设备而已,可能还有许多工作要做。 本节我们将要说一下内核中是如何对时间问题进行操作的。 本节主要涉及到以下内容: 内核中的时间描述; 如何获取当前时间; 如何进行延时操作; 1. 内核中的时间描述 在内核中,系统定时
本节是本书中《高级字符驱动程序操作》章节的第四节内容,也是最后一节,主要是关于设备读写位置定位和设备文件的访问控制相关的概念和内容。 本节主要有以下内容: llseek的实现 设备文件的访问控制 1. llseek的实现 llseek操作只对于具有明确定义的数据区的设备有意义,而对于提供数据流的设备
本节是本书中《高级字符驱动程序操作》章节的第三节内容。本节主要涉及到的是多路复用IO接口poll、select和epoll。 本文主要的内容有以下: poll、select和epoll的作用; 驱动中的poll操作; epoll实例 1. poll、select和epoll的作用 在非阻塞IO的应用
本节是本书中《高级字符驱动程序操作》章节的第二节内容。本节主要涉及到的是进程睡眠和唤醒相关的内容。 本节主要涉及以下内容: 休眠的简单介绍 休眠与唤醒相关的操作函数 1. 休眠简介 休眠是指进程被标记为一种特殊状态,并从调度器的运行队列中移走。休眠的进程会被搁置在一边,等待将来的某个事件发生,修改这
接下来要说的内容是书中的《高级字符驱动程序操作》章节。本章的内容比较长,所以分多节介绍。本节主要介绍的是其中的ioctl操作。 1. 简介 对于一个设备,除了具有读取和写入功能之外,还需要通过驱动程序执行各种类型的硬件控制,而ioctl就是用于设备控制的接口。 在用户空间中,ioctl系统调用的原型