自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 字符设备驱动(11)-互斥与同步:原子变量

有时共享资源可能恰好是一个简单的整数值,我们也需要进行互斥访问,那么Linux内核专门提供了一种数据类型atomic_t,用它来定义的变量称为原子变量。下面这个是64位操作系统定义的原子变量数据类型atomic64_t。ARM专门提供了一些指令来实现原子操作,所谓原子操作就是对这个变量的操作是原子性的,类似于在汇编级代码上只要一条汇编指令就能完成,既然是这样进行操作,就不需要考虑并发带来的影响。当然还有对应的64位原子变量的操作。

2024-09-04 22:22:27 513

原创 字符设备驱动(10)-互斥与同步:中断屏蔽

现代操作系统基本都是多任务系统,多个任务并发执行可能同时使用同一个资源,也可能会有依赖关系。其中可能会被多个任务同时使用的资源被称为共享资源。多任务并行执行时,如果在一个时刻同时操作同一个资源,会引起资源的错乱,这种错乱情形被称为竞态。操作共享资源的代码段被称为临界区。在用户态程序中,造成竞态场景有:(1)多进程:当一个进程因为等待资源不可用时,就会主动让出CPU,内核会调度另外一个进程来执行。(2)多线程:同一进程不同线程使用同一个全局变量、静态变量等。

2024-08-31 21:08:14 484

原创 字符设备驱动(9)-异步IO

本文介绍的异步IO是POSIXS的异步IO,它为不同类型的文件进行了异步IO提供了一套一致的方法。它在提交完IO操作请求后就立即返回,程序不需要等到IO操作完成再去做别的事情,具有非阻塞的特性,当然你也可以等待它的结果,不过这就失去了异步的意义。当底层把IO操作完成后,可以给提交者发送信号,或者调用注册的回调函数,告知请求提交者IO操作已完成。在信号处理函数或者回调函数中,可以使用异步IO接口来获得IO的完成情况,比如获取读写操作返回的字节数或错误码、读取的数据等。

2024-08-28 22:24:12 591

原创 字符设备驱动(8)-信号驱动,又名异步通知

在前面的I/O模型中,用户态程序都是主动获取设备的资源信息,而异步通知是当设备资源可用时,有驱动主动通知用户态程序,在由用户态程序发起读写操作。这种机制和中断非常相似,可以借用中断的思路来理解这一过程。

2024-08-24 12:00:00 816

原创 字符设备驱动(7)-多路复用

当进程既要读取鼠标数据,又要读取触摸屏数据时,如果用阻塞方式操作的话,可能在读取鼠标数据时,由于没有数据,阻塞了,即使这时触摸屏有数据,也不能获取,要解决这个问题,我们有多种方案,比如多进程、多线程和这里要介绍的I/O多路复用。同样,我们对进行改造,使用I/O多路复用实现读写。由于历史原因,I/O多路复用,有select、poll及epoll三种方式,我们以select为例,进行说明。

2024-08-21 12:00:00 1052

原创 字符设备驱动(6)-阻塞I/O

当进程以阻塞的方式打开设备文件时(默认方式),如果资源不可用,那么进程阻塞,也可以说进程休眠,其的具体过程就是主动将自己的状态设置为TASK_UNINTERRUPTIBLE或者TASK_INTERRUNTIBLE,然后将自己加入一个等待队列中,调用schedule主动放弃CPU,操作系统将之从运行队列上移除,并调度就绪队列上的第一个进程运行。对比非阻塞I/O,当资源不可用时,它不占用CPU时间,但它也有缺点,就是在阻塞(休眠)期间,再也不能做其他事情了。

2024-08-17 11:59:32 1094

原创 字符设备驱动(5)-非阻塞I/O

前面字符设备驱动读写时,我们用户态程序是先往设备写数据,然后再读出来,数据是有效的,但是如果先读数据,这时设备里面没有数据,那么对读来说就是资源不可用,同理,如果设备的缓存(内核中的缓存)如果满了,我们往设备写数据,写也不会成功。当资源不可用时,用户态程序和驱动一起的各种配合就组成了多种I/O模型。这些I/O模型分为非阻塞I/O,阻塞I/O,多路复用,信号驱动和异步I/O。

2024-08-14 23:32:33 629

原创 字符设备驱动(4)-unlocked_ioctl

字符设备有些不是数据类型的读写操作,比如控制LED灯开关、蜂鸣器响不响,串口的设置等等,要做一些控制类的操作,系统给了我们iotrl的接口。那我们就以控制LED灯的开关为例,我们的需求是使LED灯间隔1s闪烁。

2024-08-10 16:13:36 923

原创 字符设备驱动(3)-read、write

先把一个字符串通过用户态write函数写进设备,再通过用户态read函数读出来。可以看到,my_read和my_write的返回值就是read和write的返回值。驱动程序就是实现cdev_ops (见。

2024-08-03 17:08:13 364

原创 字符设备驱动(2)-驱动框架及open、release

有了和的基础,并且字符设备驱动对上注册给内核,对下要操作硬件,所以分成2层:备注:上面只写了加载函数。其中对上注册给内核,又分成3步:1、注册设备号,2、初始化字符设备结构体,3、添加字符设备结构体给内核。类似去体检,先要预约个体检号(第一步),去之前要准备一下,比如前一天饮食清淡点,早上空腹等等(第二步),最后在去体检(第三步)。

2024-07-31 22:33:48 708

原创 字符设备驱动(1)--设备文件、设备号、设备结构体、设备文件操作

按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存,比如键盘、鼠标。另外相对简单,大部分嵌入式下的设备都可以把它当成字符设备来看待,比如传感器、ADC等。存储类型的设备,按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节,随机访问,设缓存以提高效率。比如:磁盘、光盘等。将各类服务器、PC、应用终端等节点相互连接,构成信息通信网络的专用硬件设备,针对网络数据收发的设备。

2024-07-27 17:35:33 1263

原创 内核模块高级2-模块依赖

模块依赖是指A模块引用了B模块的函数或者全局变量,A模块就依赖于B模块,B模块就是被依赖的模块,加载模块时,需要先加载B模块,再加载A模块。另外A模块使用B模块的函数或者全局变量,需要在B模块中导出,否则A模块会编译出错,导出使用宏EXPORT_SYMBOL。

2024-07-24 22:17:36 733

原创 内核模块高级1-多文件编译、加载、参数传递

对于比较复杂的驱动程序,常常会把它的功能进行拆分,由不同的文件实现,这样也能进行并行开发,缩短开发周期。多文件编译的简单例子如下:ext.cMakefile其中KERNELDIR是内核源码目录所在的路径。新增了ext.c及ext.h,在里面定义了xxx_init机xxx_exit函数。在Makefile里面的第2行“mymod-objs=mod.o ext.o”表示mymod模块是由mod.o和ext.o两个目标文件共同生成的,最后生成的文件为mymod.ko。

2024-07-21 21:54:47 1340

原创 内核模块编写及编译

操作系统是运行在硬件层之上的,给应用程序提供运行环境的裸机程序。目前操作系统有两种典型的内核实现模式:1、单内核(宏内核):所有子模块代码编译到一个比较大的可执行文件(镜像文件)中。各子模块代码共用同一套运行资源,各模块间的交互直接通过函数调用来进行。如:linux ​2、微内核:只将任务管理、内存管理、启动管理最其本的三个子模块编译到一个微型可执行文件中。其它子模块则各自编译成独立的后台服务程序,这些服务程序与微型内核以及APP间主要通过各种IPC进行通讯。如:windows ​。

2024-07-14 10:20:30 872 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除