linux学习---char设备结构

17人阅读 评论(0) 收藏 举报
分类:

下图为字符设备驱动的结构框图,图中最重要就是:cdev结构体。

本质上讲写Char驱动就是对cdev结构进行定义:
这里写图片描述

下面小白带你们到<linux/cdev.h>中看一下它的结构:
这里写图片描述
cdev 中定义了六个成员,其中有三个需要我们自己定义。
第一个 struct module *owner /*所属模块*/, ;
这个很简单直接赋值为THIS_MODULE;

接下来这两个成员很重要: dev_t 和 file_operations

dev_t 是设备号,设备号是什么?
当你在系统中生成一个Char设备时,系统怎么知道你是哪个设备?这个时候就需要给每个设备一个唯一的标识符,dev_t 就是干这个的。
dev_t 是一个32位的整型,其中高12位为主设备号(major),低20位为次设备号(minor)。
major 和minor 可以自己定义:
通过MKDEV(int major,int minor)宏,可以将major和minor生成一个dev_t。
MKDEV 就是((u32)major <<12)| minor的宏 。
也可以通过MAJOR(dev_t dev)MINOR (dev_t dev)来查看主设备号和次设备号。

file_operations中的函数是字符设备驱动设计的主要内容,这些函数实际上会被应用程序进行的Linux的open()、read()、close()等函数调用。
下图给出了部分file_operations中的函数:
这里写图片描述

对 cdev 进行赋值,linux中提供了专门的函数(可封装性)。
这里写图片描述

其中cdev_init()是用来初始化cdev:
这里写图片描述
cdev_add () 是用来向系统添加一个cdev,完成字符设备。
这里写图片描述

但是,cdev_add() 给系统添加一个cdev时,系统怎么去识别这个cdev呢?你可能会说不是每个cdev都有设备号吗?用设备号(dev_t)不就行了。
对,确实是用设备号,可是在用设备号之前,字符设备是不是应该告诉一下系统,这个设备号是我的,不允许其他设备使用它。
这个时候就需要注册,注册有两种:
1、是已经有设备号了,给系统报备一下,这时就使用:

register_chrdev_region()

这里写图片描述
2、没有设备号,让系统给它一个,系统将设备号保存到第一个参数返还,这时就使用:

alloc_chrdev_region() //(推荐使用,不容易出错)

这里写图片描述

这边需要注意一下: 两个注册函数都使用了__register_chrdev_region()这个函数。
这里写图片描述
每次一次注册是要加锁的。
当major==0时就由系统来分配设备号,系统内部有个chrdevs的数组,所有注册的设备号都在这里,因此需要从数组中找一个NULL的给新设备用。
这里写图片描述
下面这段代码主要是检查已有的设备号(使用register_chrdev_region)和系统内部是否有冲突。
这里写图片描述
最后,将新的cdev加到系统的cdev的链表中。
这里写图片描述
alloc_chrdev_region()
最后调用cdev_del()函数从系统中注销之后,系统应该调用unregister_chardev_region()来释放原先申请的设备号。

查看评论

eMMC应用教程:关于RPMB的应用

RPMB的意思是Replay Protected Memory Block。 是eMMC一个比较特别的分区。 主要的作用是存放一些核心敏感数据。 在这里不讨论RPMB的具体技术细节,有兴趣的可以...
  • youdianhai
  • youdianhai
  • 2016-04-25 22:39:31
  • 3090

emmc 分区管理

eMMC 分区管理 Partitions Overview eMMC 标准中,将内部的 Flash Memory 划分为 4 类区域,最多可以支持 8 个硬件分区,如下图所示: ...
  • u014645605
  • u014645605
  • 2016-08-15 16:49:22
  • 7682

Android系统终端上不得不说的5个密钥!

从事手机开发、终端软件安全的相关从业者不得不面对以下5个密钥,其他密钥略:这5个密钥,有些是因为支付宝支付、微信支付所必须要的如IFAA Key、Soter Key。有些是Google最新Androi...
  • young_zyj
  • young_zyj
  • 2018-04-16 21:57:06
  • 37

eMMC分区详解

阅读:15472014-03-23 13:57 转载请注明出处,谢谢:http://blog.sina.cn/dpool/blog/s/blog_5c401a150101jcos.html?...
  • mirkerson
  • mirkerson
  • 2015-04-01 14:35:01
  • 7386

UFS 介绍 1

本文主要针对UFS的硬件架构及软件应用层架构做了简单的介绍,对于mipi层的协议没有过多的介绍,因为软件流程中mipi层对软件来说是不可见的也不大关心的,我们关心的是应用层协议栈的初始化,后面的文章会...
  • u014645605
  • u014645605
  • 2016-07-29 12:23:01
  • 3321

eMMC之分区管理、总线协议和工作模式

eMMC 是 embedded MultiMediaCard 的简称。MultiMediaCard,即 MMC, 是一种闪存卡(Flash Memory Card)标准,它定义了 MMC 的架构以及访...
  • u013686019
  • u013686019
  • 2017-03-26 12:11:01
  • 5406

linux 字符设备和misc设备

字符设备 2.6版本前使用的结构体和函数
  • xiaobu1990
  • xiaobu1990
  • 2014-10-15 00:15:20
  • 924

Linux Char-Driver (字符驱动 摘要)(一)

#PS:要转载请注明出处,本人版权所有 #PS:这个只是 《 我自己 》理解,如果和你的 #原则相冲突,请谅解,勿喷 Linux 系统运行时,文件系统与驱动的前世今生 ...
  • u011728480
  • u011728480
  • 2016-06-14 20:49:38
  • 869

23. OP-TEE中TA与CA执行流程-------tee-supplicant(TA请求具体请求的处理)

当tee_supplicant接收到来自TA的请求并解析出对应的请求func ID之后,tee_supplicant将会根据func ID来执行具体的请求操作。主要是针对在REE端的文件系统的操作。 ...
  • shuaifengyun
  • shuaifengyun
  • 2017-06-08 14:24:58
  • 1392

TencentSOTER总结

最近公司在做一个电子签约的APP,用到指纹登录和指纹签约,我们集成的是FIDO,完成了第一期,现在准备开第二期项目了,前期准备时,领导让我查一下腾讯的SOTER,总结一下平台功能和用到的技术等,这是第...
  • lsy759145211
  • lsy759145211
  • 2017-08-09 09:53:32
  • 1317
    个人资料
    持之以恒
    等级:
    访问量: 2010
    积分: 230
    排名: 36万+