字符设备驱动基础3——使用register_chrdev()函数注册字符设备

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。

一、系统工作原理

1、工作流程

系统的整体工作流程是:应用层—>API—>设备驱动—>硬件。

操作系统提供的API包括open、read、write、close等函数,它们只是一种操作逻辑,并不涉及具体的硬件操作。驱动源码提供真正的open、read、write、close等函数实体。

换个形象的说法,API就好比“吃饭”这个操作逻辑(没有说明具体怎样吃),而驱动程序详细地说明了吃饭的方式,比如用什么餐具、吃什么东西、先吃什么后吃什么等等。

2、举例说明

比如通过QQ与他人进行文件传输,则需要调用操作系统提供的与套接字有关的API,而这些API的逻辑操作最终将映射为网卡驱动中的某些具体操作函数。网卡驱动里面的具体操作函数,通过对网卡这个硬件(的寄存器)的一些设置,达到数据传输的目的。

二、注册字符设备

1、如何表示设备与驱动

(1)设备的表示方法

1)与设备有关的两个概念:设备文件、设备编号。

在Linux系统中一切皆文件,所以设备也表现为文件,这种文件叫做设备文件。设备文件的名字就是设备的名字。设备文件一般在/dev目录中。

不同的设备具有不同的设备号,以区分不同的设备。设备号由主设备号和次设备号组成,其中主设备号表示某一种类的设备,次设备号用来区分同一类型的设备。

设备文件名与设备号都是设备的象征,就好比某个同学的名字和学号都指向这个同学。

2)设备文件的创建

在/dev目录下使用ls -l查看字符设备文件(开头字母为'c'的文件),可以得知已有的设备文件的主次设备号。

xjh@ubuntu:/dev$ ls -l
总用量 0
crw-rw----  1 root video    10, 175 Jul 16 22:09 agpgart
crw-------  1 root root     10, 235 Jul 16 22:09 autofs
drwxr-xr-x  2 root root         640 Jul 16 22:09 block
drwxr-xr-x  2 root root         100 Jul 17 19:23 bsg
crw-------  1 root root     10, 234 Jul 16 22:09 btrfs-control
drwxr-xr-x  3 root root          60 Jul 16 22:09 bus
lrwxrwxrwx  1 root root           3 Jul 16 22:09 cdrom -> sr0
drwxr-xr-x  2 root root        3560 Jul 19 12:56 char
crw-------  1 root root      5,   1 Jul 16 22:09 console
lrwxrwxrwx  1 root root          11 Jul 16 22:09 core -> /proc/kcore
drwxr-xr-x  2 root root          60 Jul 16 22:09 cpu

使用cat /proc/devices可以查看内核中已经注册过的字符设备驱动和块设备驱动(见下文),然后找到一个没被占用的主设备号,使用“mknod /dev/xxx c 主设备号 次设备号”来创建设备文件,其中xxx表示设备文件名,c表示字符设备。

注意,xxx不能使用vim来打开,但可以用ls /dev/xxx -l查看。

/dev目录下的设备文件,与/poc/devices文件中的设备列表,它们之间有什么关系?proc目录是一个虚拟文件系统,可以为linux用户空间和内核空间提供交互;它只存在于内存中,而不占实际的flash或硬盘空间。/proc/devices/里的设备是加载驱动程序时生成的,而/dev/下的设备是通过创建设备节点生成的,用户通过此设备节点来访问内核里的驱动。

(2)驱动的表示方法

可以这么理解,file_operation 结构体就象征着驱动。

  • 这个结构体的元素主要是函数指针,用来挂接实体函数地址。
  • 每个设备驱动都需要一个该结构体类型的变量。
  • 设备驱动向内核注册时,提供该结构体类型的变量。
  • 该结构体的成员函数是字符设备驱动程序设计的主体内容。
  • 这些函数在应用程序进行open()、read()等系统调用时被内核调用。

关于此结构体的更多解释,见博客:file_operations结构体_天糊土的博客-CSDN博客。

2、字符设备的注册:register_chrdev()函数

在没有驱动模型前(注意不是驱动框架。驱动模型是面向对象的设计,区分设备、驱动和总线;而驱动框架是指驱动的分层设计,包括核心层和具体操作层),驱动与设备的注册混为一谈,设备号和 file_opertion紧结合,一个驱动的信息包含两者。

使用硬件设备之前,需要先注册其驱动程序。驱动程序利用内核提供的注册函数,向内核注册自己。注册之后,内核可以调用此驱动程序去使用硬件。

这里说的注册函数是指:register_chrdev()函数

static inline int register_chrdev(unsigned int major, const char *name,const struct file_operations *fops)
{return __register_chrdev(major, 0, 256, name, fops);
}
函数所在文件路径/include/linux/fs.h
函数作用向内核注册某设备的 file_operations
返回值

major如果设置为0,则返回自动分配的主设备号;

如果设置为指定的主设备号,成功则返回值为0,失败返回负数。

参数说明

major,表示当前设备的主设备号,范围是1~254。可以自己指定,也可以设置为0让内核自动分配。犹如学号。

name,表示当前设备的驱动名称,犹如名字。

fops,是file_operations结构体指针。

inline修饰符说明

此函数定义在头文件里面,如果被两个文件包含,就会重复定义。使用inline后,就表示函数体,而不是函数定义。

三、内核如何管理字符设备驱动

1、管理方法

内核中使用一个数组,来存储已注册的字符设备(或者说驱动,因为这里还没有驱动模型的概念)。register_chrdev函数将驱动的信息(包括设备号和 file_operations)存储在数组中相应的位置。

2、查看已注册的设备驱动

使用cat /proc/devices可以查看内核中已经注册过的字符设备驱动和块设备驱动。

从中我们看到:

(1)有很多同类设备的主设备号是相同的;

(2)有些编号默认分配给了某些设备;

(3)由于使用数组来存储的缘故,设备编号只有1~254。

xjh@ubuntu:/proc$ cat /proc/devices
Character devices:1 mem4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console
//省略
253 watchdog
254 rtcBlock devices:1 ramdisk2 fd
259 blkext7 loop
//省略
254 mdp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7在未关闭vmware情况下直接关机,导致虚拟机无法克隆

今天有点小激动啊,着急关机,结果发现重启之后的虚拟机不能进行克隆操作。系统提示如下:the Specific Virtual Disk Needs Repair .查询“度娘”,突然看到一篇文章说,删除这啊,修改那的....特别复杂&#xf…

hdu 1159(最长公共子序列)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1159 思路&#xff1a;dp[i][j]表示s1从0~i-1,s2从0~j-1的最长公共子序列&#xff1b; 递推方程为&#xff1a;dp[i][j](s1[i-1]s2[j-1])?d[i-1][j-1]1:max(dp[i-1][j],dp[i][j-1]); View Code 1 #include<…

mysql applier_MySQL推出Applier,可实时复制数据到Hadoop-阿里云开发者社区

http://labs.mysql.comMySQL复制操作可以将数据从一个MySQL服务器(主)复制到其他的一个或多个MySQL服务器(从)。试想一下&#xff0c;如果从服务器不再局限为一个MySQL服务器&#xff0c;而是其他任何数据库服务器或平台&#xff0c;并且复制事件要求实时进行&#xff0c;是否可…

字符设备驱动基础4——读写接口的操作实践

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、细节提要 1、与用户与内核数据交换有关的函数 &#xff08;1&#xff09;copy_from_user()函数 该将数据从用户空间复制到内核空间。 如果成功复制则返回0&#xff0c;如果不成功复制则返回尚未…

mysql分区表mycat_MySQL 中间件之Mycat垂直分表配置

垂直分表就是将一个库下的多个表拆分到多个MySQL实例&#xff0c;实现库压力分流。通过GTID模式复制&#xff0c;db01与db02之间不进行任何连接与复制当前环境&#xff1a;mycat --> db01与db02db01 --> db03db02 --> db04当前垂直分表架构&#xff1a;后端数据库创建…

深入浅出mysql gtid_深入理解MySQL GTID

GTID的概念何为GITDGTID(global transaction identifier)是全局事务标识符&#xff0c;在MySQL5.6版本中作为一个超级特性被推出。事务标识不仅对于Master(起源)的服务器来说是惟一的&#xff0c;而且在整个复制拓扑架构来说&#xff0c;也是全局唯一的。1.GTID的格式GTID sou…

winform 64位系统中使用

WINFOR编译成X86的 转载于:https://blog.51cto.com/agilitygod/1419939

long 转为string_面试必问 Redis数据结构底层原理String、List篇

点击关注上方“Java大厂面试官”&#xff0c;第一时间送达技术干货。阅读文本大概需要 8 分钟。前言今天来整理学习下Redis有哪些常用数据结构&#xff0c;都是怎么使用的呢&#xff1f;首先看下全局存储结构。全局存储结构基础你们肯定都知道&#xff0c;redis支持的基础数据结…

wpf 3D学习

最近在看一些关于wpf 3d的效果&#xff0c;研究了一些代码特效&#xff0c;现在和广大博友共享一下. 首先用到的是MeshGeometry3D&#xff0c;msdn上介绍&#xff1a;用于生成三维形状的三角形基元。主要有4个依赖属性&#xff1a;NormalsProperty&#xff0c;PositionsPropert…

unicode字符、python乱码问题

http://www.cnblogs.com/BeginMan/archive/2013/08/08/3246619.html#a1 Python常见常用知识点http://blog.csdn.net/tingsking18/article/details/4033645 Unicode和Python的中文处理如何让Python的Unicode字符串支持中文&#xff1f;要想利用Python的Unicode机制处理字符串&…

win10下如何安装vb6.0sp6_Mac如何安装win10系统?Parallels Desktop 15 Mac安装win10系统教程...

Parallels Desktop 15 mac版是mac上非常强大也非常好用的虚拟机软件&#xff0c;最新版本的parallels desktop mac 15针对最新的Windows 10更新和macOS Catalina&#xff08;10.15&#xff09;进行了优化。今天分享的内容就是Parallels Desktop 15 mac版如何安装win10系统。PD虚…

字符设备驱动高级篇5——静态映射表的建立过程,动态映射结构体方式操作寄存器

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 补充内容&#xff1a;字符设备驱动基础5——驱动如何操控硬件_天糊土的博客-CSDN博客 一、静态映射表的建立过程 关于“静态映射表的建立”这部分内容&#xff0c;有以下三个关键&#xff1a; &…

python 分布图_python数据分布型图表柱形分布图系列带误差线的柱形图

柱形分布图系列柱形分布图系列使用柱形图的方式展示数据的分布规律&#xff1b;可以借助误差线或散点图&#xff1b;带误差线的柱形图就是使用每个类别的均值作为柱形的高度&#xff1b;再根据每个类别的标准差绘制误差线&#xff1b;缺点&#xff1a;无法显示数据的分布情况&a…

[汇编] 002基础知识-CPU和寄存器

CPU是什么 当然这里的内存不仅仅指电脑上的内存&#xff0c;例如&#xff1a;我的金士顿8G内存&#xff0c;七彩虹1G独显&#xff0c;在这里来说&#xff0c;显卡也是有内存的(寄存器) CPU如何控制其它部件的&#xff1f; 问题&#xff1a;CPU是如何和电脑主机中其它芯片有条不…

字符设备驱动高级篇6——内核提供的读写寄存器接口

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、访问寄存器的方式 之前对寄存器的操作&#xff0c;都是先定义指向寄存器的指针&#xff0c;然后再解引用来对寄存器进行操作。这是因为ARM体系中&#xff0c;内存和IO是统一编址的。但是其他体系…

java台球游戏设计原理_Java实现简单台球游戏

Java实现简单台球桌问题&#xff0c;供大家参考&#xff0c;具体内容如下需求&#xff1a;使小球可以在桌面上移动&#xff0c;移动到桌面边缘将被弹回&#xff0c;显示小区的移动素材&#xff1a;小球照片桌球照片程序源代码&#xff1a;package 桌球游戏;import java.awt.*;i…

关于java assertion

大部分转载自参考资料&#xff1a;http://www.ibm.com/developerworks/cn/java/l-javaassertion/index.html assertion(断言)在软件开发中是一种常用的调试方式&#xff0c;assertion就是在程序中的一条语句&#xff0c;它对一个boolean表达式进行检查&#xff0c;一个正确程序…

IOC是什么?

2019独角兽企业重金招聘Python工程师标准>>> Inversion of Control&#xff0c;即反转控制&#xff0c;或许说为依赖注入更为合适。IoC就是一种设计模式。 Interface Driven Design接口驱动&#xff0c;接口驱动有很多好处&#xff0c;可以提供不同灵活的子类实现&a…

poj2516Minimum Cost

http://poj.org/problem?id2516 建图的时候 有个地方写错了 卡了半年。。 题意看了N久啊 有N个店主需要K种物品 有M个供应点 每个供应点有K种物品 其实是算K次最小费用 然后叠加 分解开来这题就是求把某种物品从供应点送到店主那里 多个源点-》多个汇点 所以加一个超级源点 和…

myeclipse连接mysql怎么调用_myeclipse连接mysql数据库详细步骤

第一步 打开Database windows-prefenrence-showview-DBbrowser ,此时会在工具底部有个DBbrowser &#xff0c;选中它&#xff0c;再它所控制的页面的任意位置 右击new---跳转到一个配置driver的页面 (选择连接方式)图一打开myeclipse然后点击window窗口 点击Open Perspective…