主设备号与次设备号以及申请

一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设
备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各
设备。例如一个嵌入式系统,有两个LED指示灯,LED灯需要独立的打开或者关闭。那么
,可以写一个LED灯的字符设备驱动程序,可以将其主设备号注册成5号设备,次设备号
分别为1和2。这里,次设备号就分别表示两个LED灯。
1.主设备号和次设备号的表示
在Linux内核中,dev_t类型用来表示设备号。在Linux 2.6.29.4中,dev_t定义为一个
无符号长整型变量,如下:typedef u_long dev_t;
u_long在32位机中是4个字节,在64位机中是8字节。以32位机为例,其中高12表示主设备号,低20为表示次设备号,如图6.1所示。
2.主设备号和次设备号的获取
为了写出可移植的驱动程序,不能假定主设备号和次设备号的位数。不同的机型中,主
设备号和次设备号的位数可能是不同的。应该使用MAJOR宏得到主设备号,使用MINOR宏来得到次设备号。下面是两个宏的定义:
#define MINORBITS   20                                  /*次设备号位数*/
#define MINORMASK   ((1U << MINORBITS) - 1)             /*次设备号掩码*/
#define MAJOR(dev)  ((unsigned int) ((dev) >> MINORBITS))
/*dev右移20位得到主设备号*/ 
#define MINOR(dev)((unsigned int) ((dev) & MINORMASK))
   /*与次设备掩码与,得到次设备号*/
MAJOR宏将dev_t向右移动20位,得到主设备号;MINOR宏将dev_t的高12位清零,得到次
设备号。相反,可以将主设备号和次设备号转换为设备号类型(dev_t),使用宏
MKDEV可以完成这个功能。#define MKDEV(ma,mi) (((ma) << MINORBITS) | (mi))  
MKDEV宏将主设备号(ma)左移20位,然后与次设备号(mi)相与,得到设备号。
3.静态分配设备号
静态分配设备号,就是驱动程序开发者,静态地指定一个设备号。对于一部分常用的设
备,内核开发者已经为其分配了设备号。这些设备号可以在内核源码documentation/
devices.txt文件中找到。如果只有开发者自己使用这些设备驱动程序,那么其可以选
择一个尚未使用的设备号。在不添加新硬件的时候,这种方式不会产生设备号冲突。但
是当添加新硬件时,则很可能造成设备号冲突,影响设备的使用。
4.动态分配设备号
由于静态分配设备号存在冲突的问题,所以内核社区建议开发者使用动态分配设备号的
方法。动态分配设备号的函数是alloc_chrdev_region()。
5.查看设备号
当静态分配设备号时,需要查看系统中已经存在的设备号,从而决定使用哪个新设备号
。可以读取/proc/devices文件获得设备的设备号。/proc/devices文件包含字符设备和
块设备的设备号,如下所示。[root@tom /]# cat /proc/devices /*cat命令查看
/proc/devices文件的内容*/  Character devices:                  /*字符设备*/
1 mem    4 /dev/vc/0    7 vcs    13 input    14 sound    21 sg  Block
devices:  /*块设备*/    1 ramdisk    2 fd    8 sd    253  device-mapper    254 mdp   
3. 6.1.3 申请和释放设备号
 内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该
给设备申请一个设备号,使系统可以明确设备对应的设备号。设备驱动程序中的很多功
能,是通过设备号来操作设备的。下面,首先对申请设备号进行简述。
1.申请设备号
在构建字符设备之前,首先要向系统申请一个或者多个设备号。完成该工作的函数是
register_chrdev_region(),该函数在<fs/char_dev.c>中定义:
int register_chrdev_region(dev_t from, unsigned count, const char *name);
其中,from是要分配的设备号范围的起始值。一般只提供from的主设备号,from的次设
备号通常被设置成0。count是需要申请的连续设备号的个数。最后name是和该范围编号
关联的设备名称,该名称不能超过64字节。
和大多数内核函数一样,register_chrdev_region()函数成功时返回0。错误时,返回
一个负的错误码,并且不能为字符设备分配设备号。下面是一个例子代码,其申请了
CS5535_GPIO_COUNT个设备号。retval = register_chrdev_region(dev_id,
CS5535_GPIO_COUNT,NAME);
在Linux中有非常多的字符设备,在人为的为字符设备分配设备号时,很可能发生冲突
。Linux内核开发者一直在努力将设备号变为动态的。可以使用
alloc_chrdev_region()函数达到这个目的。
int alloc_chrdev_region(dev_t *dev, unsigned baseminor,unsigned count, const char *name)
在上面的函数中,dev作为输出参数,在函数成功返回后将保存已经分配的设备号。函
数有可能申请一段连续的设备号,这是dev返回第一个设备号。baseminor表示要申请的
第一个次设备号,其通常设为0。count和name与register_chrdev_region()函数的对应
参数一样。count表示要申请的连续次设备号个数,name表示设备的名字。下面是一个例
子代码,其申请了CS5535_GPIO_COUNT个次设备号。retval =
alloc_chrdev_region(&dev_id, 0, CS5535_GPIO_COUNT, NAME);
2.释放设备号
使用上面两种方式申请的设备号,都应该在不使用设备时,释放设备号。设备号的释放
统一使用下面的函数:void unregister_chrdev_region(dev_t from, unsignedcount);
在上面这个函数中,from表示要释放的设备号,count表示从from开始要释放的次设备号

个数。通常,在模块的卸载函数中调用unregister_chrdev_region()函数。


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

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

相关文章

javascript 变量作用域

为什么80%的码农都做不了架构师&#xff1f;>>> javascript中的变量的作用域不同于java/c的变量规则。 1、在java/c中&#xff0c;如果有一个全局变量与一个局部变量重名&#xff0c;那么在局部变量的作用域中&#xff0c;局部变量会覆盖掉全局变量的值。当离开局部…

七月算法--12月机器学习在线班-第五次课笔记—回归

七月算法--12月机器学习在线班-第五次课笔记—回归 七月算法&#xff08;julyedu.com&#xff09;12月机器学习在线班学习笔记 http://www.julyedu.com 转载于:https://www.cnblogs.com/sweet-dew/p/5491271.html

集合添加元素python_Python基础:列表、字典、元组、集合、添加和删除元素,增删...

列表&#xff08;有序&#xff09; 添加 list.append(元素)&#xff1a;在列表末尾添加新的元素 list.extend(seq)&#xff1a;在列表末尾一次性追加另一个序列中的多个值 –seq可以是列表、元组、字典&#xff0c;若为字典,则仅会将键(key)作为元素依次添加至原列表的末尾。 l…

file_operations结构体分析 (设备文件的操作)

linux设备驱动中file_operations结构体分析 struct module *owner第一个 file_operations 成员根本不是一个操作; 它是一个指向拥有这个结构的模块的指针. 这个成员用来在它的操作还在被使用时阻止模块被卸载. 几乎所有时间中, 它被简单初始化为 THIS_MODULE, 一个在 <Linux…

公司网络搭建及×××到公司配置

一、公司路由器及子网配置公司192.168.1.0/24子网用于服务器集群&#xff0c;192.168.0.0/24子网用于办公子网&#xff0c;两个子网物理上不在一块。公司开业时&#xff0c;申请了电信40Mbps专线光纤&#xff0c;5个IP地址&#xff0c;网关&#xff1a;*.168.112.9 255.255.25…

js——全选框 checkbox

一直会碰见input 全选框的问题&#xff0c;先整理一种情况&#xff1a; 1. <input id"selectAll" type"checkbox" />全选 2. <input typecheckbox idid1 namecb value1 />value1 <input typecheckbox idid2 namecb value2 />value2 &…

手机编写python程序_Python实现自动上京东抢手机

本文实例为大家分享了Python自动上京东抢手机的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下 上次抢荣耀V9&#xff0c;被京东给恶心到了&#xff0c;所以就写了个简单的Python来自动抢V9。虽然用的是比较蠢的方法&#xff0c;但觉得还是有可以学习的地方。所以在这…

struct cdev结构体和cdev_init和cdev_add函数

在Linux内核2.6版本以前&#xff0c;注册一个字符设备的的经典方法是使用register_chrdev&#xff0c;相应的从设备中注销字符设备的方法是unregister_chrdev&#xff0c;而在2.6版本以后&#xff0c;字符设备函数的注册与注销使用的是如下一套方法&#xff1a; #include<li…

蓝鸥零基础学习HTML5第五讲 CSS的基础样式

蓝鸥零基础学习HTML5第五讲 CSS的基础样式1.border<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title><style>div {width:0px;height:0px;/*background: url("img/1.jpg…

class_create()函数

内核中定义了struct class结构体&#xff0c;一个struct class 结构体类型变量对应一个类&#xff0c;内核同时提供了class_create()函数&#xff0c;可以用它来创建一个类&#xff0c;这个类存放于sysfs下面&#xff0c;一旦创建了这个类&#xff0c;再调用device_create()函数…

C# 使用Conditional特性而不是#if条件编译

概述 #if/#endif 语句常用来基于同一份源码生成不同的编译结果&#xff0c;其中最常见的就是debug版和release版。但是这些工具在实际应用中并不是非常友好&#xff0c;因为它们容易被滥用&#xff0c;其代码页进而难以理解或调试。C#设计中考虑到这个问题&#xff0c;并提供了…

python安装opencv出现错误_Python3安装OpenCV出错,如何解决?

$ sudo pip install opencv-python $ sudo pip install opencv-contrib-python 参考下&#xff1a;python作业毕设&#xff1a;安装人工智能图像处理工具OpenCV​zhuanlan.zhihu.compython版本安装 适合所有平台&#xff1a; $ sudo pip install opencv-python $ sudo pip inst…

PHP中面向对象的图片处理类

我们对图片的处理主要是添加水印和等比缩放&#xff0c;在PHP中&#xff0c;封装一个类来实现两个功能。源代码如下&#xff1a;<?php/***图片处理*/ class Image {//路径private $path ./upload/;//随机文件名private $isRandName;//初始化成员方法public function __con…

ioread32函数有关知识

x86体系和ARM体系的寻址方式是有差别的&#xff1a; 在x86下&#xff0c;为了能够满足CPU高速地运行&#xff0c;内存与CPU之间通过北桥相连并通过地址方式访问&#xff0c;而外设通过南桥与CPU相连并通过端口访问。 在ARM下也实现了类似的操作&#xff0c;通过两条不同的总线…

几何分布的期望和方差公式推导_超几何分布的数学期望与方差推导

考虑 个外表相同的物品&#xff0c;其中有 个同类物品与另一类的 个物品&#xff1b;抽取 个物品&#xff0c;每个物品的抽取等概率随机。上述便是一个超几何分布&#xff08;Hypergeometric Distribution&#xff09;的基本模型。抽取 个 类物品的概率 在研究超几何分布的数学…

FPGA开发全攻略—— 调试

原文链接&#xff1a; FPGA开发全攻略连载之十三&#xff1a;FPGA实战开发技巧&#xff08;12&#xff09; 5.6 大规模设计的调试经验 在大规模设计的调试应该按照和设计理念相反的顺序&#xff0c;从底层测试&#xff0c;主要依靠ChipScope Pro 工具。下面主要介绍ChipScope P…

003很好的网络博客(TCP/IP)-很全

http://www.cnblogs.com/obama/p/3292335.html 很全的计算机网络方面的资料。

linux驱动文件操作简单介绍

1、设备号 主设备号标识设备对应的驱动程序&#xff0c;次设备号由内核使用&#xff0c;用于确定设备文件所指的设备。 通过次设备号获得一个指向内核设备的直接指针&#xff0c;也可将此设备号当作设备本地数组的索引。 设备编号用dev_t表示&#xff08;Linux/types.h 32位…

php学习笔记细节部分。

<?phpclass Car{public function Car()//构造函数 {//codeing 当实例化类的时候会调用这里面的方法}public function _destruct()//析构函数 {//codeing 对象的所有引用被删除&#xff0c;或者对象被显式的销毁时会执行的函数。 }} l转载于:https://www.cnblogs.com/OnlyL…

ctypes python_[python学习之路]ctypes,Python

ctypes 基本用法 ctypes 是一个方便 Python 调用本地已经编译好的外部库的模块。 from ctypes import util, CDLL 标准 C 库 使用 util 来找到标准 C 库&#xff1a; libc_name util.find_library(c) # on WINDOWS print libc_name msvcr90.dll 使用 CDLL 来加载 C 库&#xf…