个人网站的域名注册,怎么做手机app软件开发,网站建设公司加优化,阿里云备案网站备案域名一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统#xff0c;有两个LED指示灯#xff0c;LED灯需要独立的打开或者关闭。那么#xf…一个字符设备或者块设备都有一个主设备号和次设备号。主设备号和次设备号统称为设备号。主设备号用来表示一个特定的驱动程序。次设备号用来表示使用该驱动程序的各设备。例如一个嵌入式系统有两个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文件包含字符设备和块设备的设备号如下所示。[roottom /]# cat /proc/devices /*cat命令查看/proc/devices文件的内容*/ Character devices: /*字符设备*/1 mem 4 /dev/vc/0 7 vcs 13 input 14 sound 21 sg Blockdevices: /*块设备*/ 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()函数。