一、引言

很久前接触linux驱动就知道主设备号找驱动,次设备号找设备。这句到底怎么理解呢,如何在驱动中实现呢,在介绍该实现之前先看下内核中主次设备号的管理:

二、Linux内核主次设备号的管理

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

设备号的内部表示

在内核中,dev_t  类型( 在 头文件有定义 ) 用来表示设备号,包括主设备号和次设备号两部分。对于 2.6.x内核,dev_t是个32位量,其中高12位用来表示主设备号,低20位用来表示次设备号。

在 linux/types.h 头文件里定义有

typedef __kernel_dev_t          dev_t;  typedef __u32 __kernel_dev_t;

主设备号和次设备号的获取

为了写出可移植的驱动程序,不能假定主设备号和次设备号的位数。不同的机型中,主设备号和次设备号的位数可能是不同的。应该使用MAJOR宏得到主设备号,使用MINOR宏来得到次设备号。下面是两个宏的定义:(linux/kdev_t.h)

#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)相或,得到设备号

三、主设备号找驱动、次设备号找设备的内核实现

Linux内核允许多个驱动共享一个主设备号,但更多的设备都遵循一个驱动对一个主设备号的原则。

内核维护着一个以主设备号为key的全局哈希表,而哈希表中数据部分则为与该主设备号设备对应的驱动程序(只有一个次设备)的指针或者多个同类设备驱动程序组成的数组的指针(设备共享主设备号)。根据所编写的驱动程序,可以从内核那里得到一个直接指向设备驱动的指针,或者使用次设备号作为索引的数组来找到设备驱动程序。但无论哪种方式,内核自身几乎不知道次设备号的什么事情。如下图所示:

图1:应用程序调用open时通过主次设备号找到相应驱动

posted on 2013-05-08 10:16 顺其自然EVO 阅读(235) 评论(0)  编辑  收藏

linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备相关推荐

  1. Linux驱动开发之主设备号找驱动,次设备号找设备

    原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8805179,作者:gqb666 一.引言   最近成都地 ...

  2. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想

    文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...

  3. LINUX USB驱动开发(2)-USB驱动体系分析

    一.日常USB现象: 1.将USB设备接入电脑上,右下角弹出"发现android phone" 2.跳出对话框.提示你安装驱动程序 问题1:既然没有安装驱动,为何能知道设备是&qu ...

  4. linux驱动开发(一)—GPIO驱动框架

    前言 GPIO驱动是Linux驱动开发中最基础.但却是很常用.很重要的驱动.比如你要点亮一个LED灯.键盘扫描.输出高低电平等等.而Linux内核的强大之处在于对最底层的GPIO硬件操作层的基础上封装 ...

  5. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架

    文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...

  6. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树

    文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...

  7. Linux驱动开发学习笔记-电容触摸屏驱动

    <电容触摸屏驱动框架> 电容触摸屏驱动其实是以下几种 linux 驱动框架的组合: ① IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动. ...

  8. Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构

    前面我们学习了USB 驱动的一个描述符,下面来学习 USB 驱动的几个重要数据结构 一.struct usb_interface  接口函数 [cpp] view plaincopy struct u ...

  9. linux 下usb驱动开发,LINUX_ARM下的USB驱动开发.pdf

    LINUX_ARM下的USB驱动开发 CN 431258 / TP 计算机工程与科学 2006年第 28卷第 3期 ISSN 1007130X COM PU TER EN GIN EER IN G & ...

最新文章

  1. EE4J项目情况汇总,微软加入Jakarta EE工作组
  2. 市面上主流的TCC框架介绍
  3. Java核心技术卷1心得笔记1---Java程序设计概述
  4. 信息学奥赛一本通 1102:与指定数字相同的数的个数 | OpenJudge NOI 1.6 01
  5. 在win7下搭建php+apache+mysql环境
  6. 李宏毅机器学习2021】机器学习模型的可解释性 (Explainable ML)
  7. 例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
  8. Redis百万级别数据迁移
  9. 织梦5.7 10万新闻文章 生成测试
  10. Python入门--列表元素的删除,remove(),pop(),切片,clear(),del
  11. win10 mysql zip 安装教程_windows10+mysql8.0.11zip安装教程详解
  12. sublime 安装 sql 格式化插件
  13. Xmind8 思维导图
  14. mapinfo professional 学习资料
  15. 计算机休眠下睡眠的不同点是什么,电脑休眠和睡眠的区别
  16. UVA - 11604 General Sultan 题解
  17. PYQT5 打包后无法显示jpg图片问题
  18. Python中os.listdir() 函数用法及实例
  19. jCore中文本地化工作札记 - 1
  20. google为何选择kotlin?kotlin如何解决java开发痛点【续】?

热门文章

  1. python 调用摄像头拍照_《自拍教程67》Python调用摄像头, 拍照拍照!
  2. mysql数据采集中间件_开源 | MySQL数据传输中间件—DTLE
  3. oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...
  4. mapreduce value 排序_MapReduce知识点一
  5. 在研究所工作是什么体验?和互联网公司比,你会怎么选?
  6. 皮一皮:老板是个学渣...
  7. 搞 Java 的年薪 50w 什么水平?
  8. Redis Cluster 原理你了解不?
  9. Java虚拟机最多支持多少个线程的探讨
  10. Metaspace 引起的 FullGC 问题排查过程及解决方案