主设备号、次设备号

分配并注册主次设备号
    设备号是在驱动module中分配并注册的,也就是说,驱动module拥有这个设备号(我的理解),而/dev目录下的设备文件是根据这个设备号创建的,因此,当访问/dev目录下的设备文件时,驱动module就知道,自己该出场服务了(当然是由内核通知)。
    在Linux内核看来,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务;而次设备号则用来标识具体且唯一的某个设备。
    在内核中,用dev_t类型(其实就是一个32位的无符号整数)的变量来保存设备的主次设备号,其中高12位表示主设备号,低20位表示次设备号。
    设备获得主次设备号有两种方式:一种是手动给定一个32位数,并将它与设备联系起来(即用某个函数注册);另一种是调用系统函数给设备动态分配一个主次设备号。

对于手动给定一个主次设备号,使用以下函数:
int register_chrdev_region(dev_t         first,
                           unsigned int -count,
                           char          *name)
    其中first是我们手动给定的设备号,count是所请求的连续设备号的个数,而name是和该设备号范围关联的设备名称,它将出现在/proc/devices和sysfs中。
    比如,若first为0x3FFFF0,count为0x5,那么该函数就会为5个设备注册设备号,分别是0x3FFFF0、 0x3FFFF1、 0x3FFFF2、 0x3FFFF3、 0x3FFFF4,其中0x3(高12位)为这5个设备所共有的主设备号(也就是说这5个设备都使用同一个驱动程序)。而0xFFFF0、 0xFFFF1、 0xFFFF2、 0xFFFF3、 0xFFFF4就分别是这5个设备的次设备号了。需要注意的是,若count的值太大了,那么所请求的设备号范围可能会和下一个主设备号重叠。比如若first还是为0x3FFFF0,而count为0x11,那么first+count=0x400001,也就是说为最后两个设备分配的主设备号已经不是0x3,而是0x4了!用这种方法注册设备号有一个缺点,那就是若该驱动module被其他人广泛使用,那么无法保证注册的设备号是其他人的Linux系统中未分配使用的设备号。


对于动态分配设备号,使用以下函数:
int alloc_chrdev_region(dev_t         *dev,
                        unsigned int -
firstminor,
                        unsigned int
-
count,
                        char          *name)
    该函数需要传递给它指定的第一个次设备号firstminor(一般为0)和要分配的设备数count,以及设备名,调用该函数后自动分配得到的设备号保存在dev中。动态分配设备号可以避免手动指定设备号时带来的缺点,但是它却也有自己的缺点,那就是无法预先在/dev下创建设备节点,因为动态分配设备号不能保证在每次加载驱动module时始终一致(其实若在两次加载同一个驱动module之间并没有加载其他的module,那么自动分配的设备号还是一致的,因为内核分配设备号并不是随机的,但是书上说某些内核开发人员预示不久的将来会用随机方式进行处理),不过,这个缺点可以避免,因为在加载驱动module后,我们可以读取/proc/devices文件以获得Linux内核分配给该设备的主设备号。

与主次设备号相关的3个宏:
MAJOR(dev_t dev):根据设备号dev获得主设备号;
MINOR(dev_t dev):根据设备号dev获得次设备号;
MKDEV(int major, int minor):根据主设备号major和次设备号minor构建设备号。

 

http://hi.baidu.com/zengzhaonong/blog/item/8d7be4ed9597d84b79f0551c.html

 

### 设备号、主设备号次设备号 #### 设备号定义 在Linux操作系统中,每个硬件设备都被视为一个特殊类型的文件——设备文件。这些文件用于表示连接到系统的物理或虚拟设备。设备号是识别特定设备的关键标识符。 #### 主设备号定义 主设备号用来区分不同种类的设备驱动程序。它指定了哪个模块负责处理该类别的所有请求。对于字符设备而言,其主设备号可以通过静态方式自行分配或是由系统动态分配[^1]。而杂项设备则有一个固定的主设备号10,并能自动创建对应的设备节点。 #### 次设备号定义 次设备号用于在同一类别下进一步细分具体的实例。当多个相同类型的设备存在时(比如多张网卡),它们会共享同一个主设备号但是具有不同的次设备号以便于单独寻址。 #### 区别与联系 - **区别** - 主要在于功能定位上有所不同;前者决定了调用哪一个驱动程序去管理这个设备,后者则是同一类型里边更细致化的编号。 - **联系** - 这两者共同构成了完整的设备号码,在访问某个具体外设的时候二者缺一不可。 #### 使用场景 - 对于开发者来说,在编写内核模块或者用户空间应用程序时需要用到这两个参数来进行正确的资源绑定。 - 当管理员需要手动建立新的设备节点时也需要指定这两者的信息。例如,如果想要添加一个新的字符型磁带备份装置,则可能涉及到为其设置合适的主次设备号组合。 ```bash mknod /dev/mytape c MAJOR MINOR ``` 在这个例子中`c`代表这是一个字符设备,MAJOR MINOR分别对应着所选设备应有的主次设备号数值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值