linux主设备号和次设备号

Linux的设备管理是和文件系统紧密结合的,各种设备都以文件的形式存放在/dev目录下,称为设备文件。应用程序可以打开、关闭和读写这些设备文件, 完成对设备的操作,就像操作普通的数据文件一样。为了管理这些设备,系统为设备编了号,每个设备号又分为主设备号和次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。对于常用设备,Linux有约定俗成的编号,如硬盘的主设备号是3。

Linux为所有的设备文件都提供了统一的操作函数接口,方法是使用数据结构struct file_operations。这个数据结构中包括许多操作函数的指针,如open()、close()、read()和write()等,但由于外设 的种类较多,操作方式各不相同。Struct file_operations结构体中的成员为一系列的接口函数,如用于读/写的read/write函数和用于控制的ioctl等。打开一个文件就是 调用这个文件file_operations中的open操作。不同类型的文l件有不同的file_operations成员函数,如普通的磁盘数据文件, 接口函数完成磁盘数据块读写操作;而对于各种设备文件,则最终调用各自驱动程序中的I/O函数进行具体设备的操作。这样,应用程序根本不必考虑操作的是设 备还是普通文件,可一律当作文件处理,具有非常清晰统一的I/O接口。所以file_operations是文件层次的I/O接口。

转自:http://hi.baidu.com/wudaovip/blog/item/479b451e95c475f81ad57621.html

设备号是在驱动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://fanyihui1986.blog.163.com/blog/static/784485920091132043905/

linux中的 主设备号与次设备号相关推荐

  1. Linux嵌入式开发_主设备号与次设备号详解

    前言 在Linux内核中设备号的作用是用来区分不同的设备类型. 比如: 设备号23,对应的是LED 设备号17,对应的是某个存储设备 等等... 主次设备号 主设备号:对应设备的主号码 次设备号:对应 ...

  2. 一张图说明linux 设备 节点 驱动 主设备号 和次设备号之间的关系

    Linux各种设备都以文件的形式存放在/dev目录下,称为设备文件. 应用程序可以打开.关闭和读写这些设备文件,完成对设备的操作,就像操作普通的数据文件一样.为了管理这些设备,系统为设备编了号,每个设 ...

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

    一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为设 备号.主设备号用来表示一个特定的驱动程序.次设备号用来表示使用该驱动程序的各 设备.例如一个嵌入式系统,有两个LED指示灯 ...

  4. 主设备号与次设备号代码分析---MAJOR、MINOR

    <linux/kdev.h>内容如下: #ifndef _LINUX_KDEV_T_H #define _LINUX_KDEV_T_H #ifdef __KERNEL__ #define ...

  5. 【001 设备驱动】主设备号和次设备号的用途

    一.请简述主设备号和次设备号的用途 Linux 中每个设备都有一个设备号,设备号由主设备号和次设备号两部分组成,主设备号表示某一个具体的驱动,次设备号表示使用这个驱动的各个设备. Linux 提供了一 ...

  6. linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 - jinzi - 博客园+ 剽窃 过来的.  记录下,以备查. 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为 ...

  7. Linux主设备号和次设备号

    Linux主设备号用来区分不同硬件设备类型,如串口和USB之间的区别: Linux次设备号用来区分不同硬件设备,如串口1和串口2之间的区别: 可以通过命令ls -l /dev来查看系统的设备号: 现在 ...

  8. linux中的住设备号和次设备号

    转自:http://linux-tutorial.info/modules.php?name=MContent&pageid=94 做了少许加粗和删减,需要完整版的请看原文. Major an ...

  9. 在linux中的virtualbox无法挂载usb设备的解决方法

    方法来源于网络. 在安装完virtualbox之后,virtualbox会建立一个名为 vboxusers 的组,将你的用户名加入到该组即可. 命令参考: #usermod -a -G vboxuse ...

最新文章

  1. java为什么实现_为什么在java中这样实现了这样的实现?
  2. 1470篇!CVPR2020结果出炉(附13篇论文链接/开源代码/解读)
  3. 教你破解XP系统Administrator权限
  4. ffmpeg基本用法
  5. 后缀数组求最长重复子串
  6. 【JavaWeb】石家庄地铁搭乘系统——第一版(功能尚未完善)
  7. 会计基础第二次模拟试题(1)
  8. iOS之NSURLSessionDownloadTask下载
  9. 3项目里面全局用less变量 cli vue_vue-cli3全局载入scss变量或less变量配置
  10. 计算机毕设 ai_2020年计算机人工智能方向保研经历分享(南大,复旦,中科院计算所)...
  11. 生日祝福html_更新,礼包选择,头像框及太子生日金币活动
  12. 按键精灵操作mysql数据库_按键精灵mysql数据库
  13. HTTP协议请求头部的User-Agen和Cookie
  14. bi数据分析工具有哪些?
  15. Java面试题消息队列
  16. 后缀001,002,003等的文件解压
  17. Welearn的cookie值怎么获取?
  18. 什么是Principle?能做什么?
  19. 神眼MT9V034摄像头的原理及采集图像过程
  20. java代码将链接转换为二维码

热门文章

  1. 水果店开业朋友圈宣传,水果店开业朋友圈宣传语
  2. [必藏]Android 最棒的开源集合库
  3. android+注销功能,QQ 终于可以注销账号,但暂时只有安卓用户能用
  4. 移动端html5网页a标签实现打电话、发短信
  5. Mac电脑如何查看配置
  6. uniapp的uParse富文本改图片大小
  7. ai如何复制文字并对齐_ai字体左右对齐 ai怎么让多行文字左右都对齐
  8. 渲染图片纹理与原图不一致的原因
  9. maya:FK和IK基础讲解(新手向)
  10. C语言 return不等式