scull设计和如何动态分配主设备
文章目录
一、scull设计解析
1.什么是scull
一个操作内存区域的字符设备驱动程序,这片内存区域相当于一个设备。
2.scull优点
1.在于它不和硬件相关
2.只是操作从内核中分配的一些内存。任何人都可以编译和运行scull
3.还可以将scull移植到Linux支持的计算机平台上,
4.展示内核和字符驱动之间的接口并且让用户运行某些测试。scull设备做不了任何事
3.scull设计
编写驱动程序的第一步就是定义驱动程序未用户程序提供的功能(机制)
scull的源代码实现了下列的设备,模块实现每一种设备称作一种 “类型”:
- scull0~scull3
这四个设备分别由一个全局且持久的内存区域组成,全局指的是:如果设备被多次打开,则打开她的所有文件描述符可共享该设备所包含的数据。“持久”是指 设备关闭在打开数据不丢失。 - scullpipe0~scullpipe3
一个进程读取由另一个进程写入的数据。如果多进程读取同一个设备。他们会产生竞争关系。scullpipe的内部实现将说明不借助与中断的情况下如何实现阻塞时和非阻塞式的读/写 - scullsingle
一次只允许一个进程使用该驱动程序 - scullpriv
而scullpriv对每个虚拟控制台式私有的。这是因为每个控制台/终端上的进程将获取不同的内存区域 - sculluid、scullwuid
sculluid和scullwuid可被多次打开,但每次只能由一个用户打开;如果另一个用户锁定该设备。sculluid将返回 “Device Busy”的错误,而scullwuid则实现了阻塞时open.这些scull设备的变种混淆了机制和策略,
如何动态分配主设备号
一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备
注:区分字符驱动设备和块驱动设备
字符设备驱动程序的设备文件可通过ls -l 命令输出的第一行的“c”来识别。块设备也出现在/dev ,标识用"b"标识
案例解析
如果执行ls -l命令,则可在设备文件项的最后修改日期前两个数(用逗号分隔),这个位置通常现实的时文件的长度; 而对设备文件,这两个数就是相应设备的主设备号和次设备号。主设备号是1,4,7,10和次设备号是1、3、5、64、65和129
通常而言、主设备号标识设备对应的驱动程序。例如,/dev/null和/dev/zero由驱动程序1管理。而虚拟控制台和串口终端由驱动程序4管理,类似地,vcsl和vcsal设备都有驱动程序7管理。,一个主设备号对应一个驱动程序的原则
次设备号
在内核中 dev_t 用来保持设备编号, 包括主从设备号,dev_t是一个32位的数,其中的12位用来标识主设备数,而其余20位用来标识次设备号。应该始终使用<linux/kdev_t.h>中定义的宏。比如获得dev_t的主从设备号应使用:
MAJOR(dev_t dev);