linux字符设备驱动模型,linux字符驱动包括哪些内容和功能
本内容由系统网小编为大家分享,Windows系统安装教程、办公系统、软件怎么使用、软件使用教程、办公软件攻略等信息。
一. 对性格设备的基本理解
1、设备驱动分类
Linux操作系统将设备分为三类:字符装置、区块装置和网络装置。
字符设备:是指只能读写需要一个字节和一个字节。字符设备是面向流动的设备,具有典型的字符设备,如鼠标、键盘、序列、控制台和LED设备,无法从设备内存中随机读取数据。
一组设备是一种能够从设备上的任何位置读取特定长度数据的设备,例如块设备包括硬盘、软磁盘、闪存盘和SD卡。
每个字符设备或区块设备在 / dev 目录中由设备文件表示。 Linux 用户程序使用设备文件( 或设备节点) 通过驱动程序操作字符和区块设备。
2. 字符装置、字符装置驱动器和该装置的用户空间接入之间的关系。
例如,在Linux核心:
a- 描述字符装置,使用cdev结构。
b- 确定字符设备的独特性,按其成员 dev_t 来定义设备编号,将其分为主要和次级设备编号。
c. 界定其成员赋予的 VFS 界面功能,例如共同开放() 、 读( )、 写( ) 等。
Linux 中的设备驱动器 :
a. 通过注册_chrdev_region () 或 alloc_chrdev_region () 或 alloc_chrdev_ region () 以静态或动态方式获取装置编号的模块装载程序;
- 完成注册,使用 cdev_init () 在 cdev 和 file_ operations 和 cdev_ add () 之间建立联系,以便在系统中添加一个 cdev 。
c- 模块卸载功能使用 cdev_del () 来禁用 cdev 和 unregister_cherdev_ region () 来放弃装置编号 。
访问设备用户空间:
a. 指定通过Linux系统(如Open ()、读()和写())调用文件操作提供的 VFS 接口方法;
3. 字符设备驱动器模型
二、结构问题决议
Cdev结构用于描述Linux内核中的字符装置,描述如下:
内核的界面与构造立方体结构的功能大致如下:
a -- void cdev_init(struct cdev *, const struct file_operations *);
包括代码清单在内的源代码如下:
此函数基本上初始化了 struct cdev 的结构, 而 cdev 和 文件选项之间的关系最为重要 :
(1) 完全清理大楼;
(2) 设立成员自首;
(3) kobj 成员初始化;
(4) 启动业务成员;
b --struct cdev *cdev_alloc(void);
此方法创建一个 ruct cdev 结构, 然后指定它 。我一直在尝试获得Cdev记忆, 但我不确定它是否有效。在cdev_init中,我完成了启动的前三个阶段。 (启动第四阶段需要拨打cdev_alloc电话。 )我不知道你在说什么 我不知道你在说什么
其源代码清单如下:
在前两个初始化常规中我们没有看到成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员、成员当地成员的存在表明司机与内核模块有着密切的联系。固态模式是模块基本核心的抽象化。成员可以指定字符设备中设备所属的模块 。成员阻止设备被使用的方式。 THIS_ MODULE, 这是创建驱动程序时用户专用初始化 。设备模块已卸载。在 cdev_add 中, dev 和 count 的成员只能提供有效值 。
c -- int cdev_add(struct cdev *p, dev_t dev, unsigned count);
此函数在内核中添加一个 sruct cdev结构。 通知内核以 sruct cdev*p 表示的字符设备, 它正在起作用 。
当然,必须在此具体说明两个参数:
(1) 第一个装置编号是dev。
(2) 与装备有关的装备编号数量。
这两个参数直接分配给sruct cdev的成员和计数成员。
d -- void cdev_del(struct cdev *p);
此方法从内部内核中移除一个构造的 cdev 结构 。,这意味着由 sruct cdev*p 表示的字符设备不再功能。
根据接口会谈,我们发现,我们需要在建造和登记建筑时给几个项目。
( 一 ) 文件 - 操作 结构 指南 ;
(2) 开发设备的数量;
(3) 次级设备编号的数。
但我们仍然不知道这些价值观代表着什么,或者我们如何创造这些价值观!
三、设备号相应操作
1 - 设备编号(包括主要和次级设备编号):
为每个字符设备或设备中的每一件设备指定了主设备编号和次级设备编号。主设备编号用于识别与设备文件相连的驱动器,并代表设备类型。驱动器使用次级设备编号来识别运行中的设备,并区分类似的设备类型。
装置编号在Dev_t 2.Six.28的Linux内核内核中描述,其定义如下:
typedef u_long dev_t;
在这32个字节中,4个字节用于主要装置,20个字节用于次设备。
此外,内核还为我们提供了几个简单的宏观实施标准:
(1) 获得装置编号,少校和Minior
MAJOR(dev_t dev);
MINOR(dev_t dev);
2) 创建基于 Major 和 Major 和 Major 的装置编号。
MKDEV(int major,int minor); 这只是一个建筑设备编号,没有登记,需要静态应用才能运行注册_cherdev_region;
2. 设备编号分配(两种方法):
a. 静态执行:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其源代码清单如下:
- 动态分散:
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);
其源代码清单如下:
如你所见,他们俩都被转移了__register_chrdev_region函数的源代码如下:
该代码显示了注册区域与注册区域之间的区别。这是妇女首次登记为美利坚合众国公民。Aloc_chrdev地区以少校=0开始逐个查找设备号,在发现一个闲置设备号码之前并将其注册进去;其用途可归纳如下:
register_chrdev_regionalloc_chrdev_region
devno = MKDEV(major,minor);ret = register_chrdev_region(devno, 1, "hello");cdev_init(&cdev,&hello_ops);ret = cdev_add(&cdev,devno,1); | alloc_chrdev_region(&devno, minor, 1, "hello");major = MAJOR(devno);cdev_init(&cdev,&hello_ops);ret = cdev_add(&cdev,devno,1) | register_chrdev(major,"hello",&hello |
可以看出,除了前两种方法外,还引入了注册_chrdev函数,其应用相当容易,只需要一个短语来处理先前的函数所做的一切。
源代码定义如下的注册_chrdev 函数将进一步审查如下:
_register_cherdev(major, 0, 256, name, pops):
如你所见,这个功能不仅有助于我们登记装置号码,而且有助于我们启动和登记Cdev。
3、注销设备号:
void unregister_chrdev_region(dev_t from, unsigned count);
4、创建设备文件:
要检查指定的设备名称和装置编号,请使用 cat/proc/ devices。
(1) 手动创建 mknod: mknod 文件名类型
2) 自动创建设备节点 :
使用 dudv (mdev) 自动构建设备文件,首先,应当保证得到dudev(mdev)的支持。Buschbox 配置的 。在驱动程序启动代码中,使用类创建为设备构建一个类 。对于每个装置,它创造出合适的装置。
更多信息,请查阅 Linux 字符设备驱动开发 (二) - 自动创建设备节点。
下面是上面发生的事情的一个例子。
hello.c
测试方案.c/
makefile:
成功编译后, 使用 Insmod 命令装入 :
然后将检查猫/程序/装置,并发现装置编号已成功应用。
XTw.com.Cn系统网专业应用软件下载教程,免费windows10系统,win11,办公软件,OA办公系统,OA软件,办公自动化软件,开源系统,移动办公软件等信息,解决一体化的办公方案。
免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!
联系邮箱:773537036@qq.com