linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备
一、引言
很久前接触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驱动开发之主设备号找驱动,次设备号找设备相关推荐
- Linux驱动开发之主设备号找驱动,次设备号找设备
原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8805179,作者:gqb666 一.引言 最近成都地 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED驱动框架--面向对象、分层设计思想
文章目录 前言 1.LED驱动程序框架 1.1.对于LED驱动,我们想要什么样的接口? 1.2.LED驱动要怎么写,才能支持多个板子?分层写 1.3.程序分析 驱动程序 应用程序 Makefile 1 ...
- LINUX USB驱动开发(2)-USB驱动体系分析
一.日常USB现象: 1.将USB设备接入电脑上,右下角弹出"发现android phone" 2.跳出对话框.提示你安装驱动程序 问题1:既然没有安装驱动,为何能知道设备是&qu ...
- linux驱动开发(一)—GPIO驱动框架
前言 GPIO驱动是Linux驱动开发中最基础.但却是很常用.很重要的驱动.比如你要点亮一个LED灯.键盘扫描.输出高低电平等等.而Linux内核的强大之处在于对最底层的GPIO硬件操作层的基础上封装 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之按键驱动框架
文章目录 前言 1.APP怎么读取按键值 1.1.查询方式 1.2.休眠-唤醒方式 1.3.poll方式 1.3.异步通知方式 1.5. 驱动程序提供能力,不提供策略 2.按键驱动程序框架--查询方式 ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之LED模板驱动程序的改造:设备树
文章目录 前言 1.驱动的三种编写方法 2.怎么使用设备树写驱动程序 2.1.设备树节点要与platform_driver能匹配 2.2.修改platform_driver的源码 3.实验和调试技巧 ...
- Linux驱动开发学习笔记-电容触摸屏驱动
<电容触摸屏驱动框架> 电容触摸屏驱动其实是以下几种 linux 驱动框架的组合: ① IIC 设备驱动,因为电容触摸 IC 基本都是 IIC 接口的,因此大框架就是 IIC 设备驱动. ...
- Linux USB 驱动开发(二)—— USB 驱动几个重要数据结构
前面我们学习了USB 驱动的一个描述符,下面来学习 USB 驱动的几个重要数据结构 一.struct usb_interface 接口函数 [cpp] view plaincopy struct u ...
- 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 & ...
最新文章
- EE4J项目情况汇总,微软加入Jakarta EE工作组
- 市面上主流的TCC框架介绍
- Java核心技术卷1心得笔记1---Java程序设计概述
- 信息学奥赛一本通 1102:与指定数字相同的数的个数 | OpenJudge NOI 1.6 01
- 在win7下搭建php+apache+mysql环境
- 李宏毅机器学习2021】机器学习模型的可解释性 (Explainable ML)
- 例解 autoconf 和 automake 生成 Makefile 文件[转+个人修改]
- Redis百万级别数据迁移
- 织梦5.7 10万新闻文章 生成测试
- Python入门--列表元素的删除,remove(),pop(),切片,clear(),del
- win10 mysql zip 安装教程_windows10+mysql8.0.11zip安装教程详解
- sublime 安装 sql 格式化插件
- Xmind8 思维导图
- mapinfo professional 学习资料
- 计算机休眠下睡眠的不同点是什么,电脑休眠和睡眠的区别
- UVA - 11604 General Sultan 题解
- PYQT5 打包后无法显示jpg图片问题
- Python中os.listdir() 函数用法及实例
- jCore中文本地化工作札记 - 1
- google为何选择kotlin?kotlin如何解决java开发痛点【续】?
热门文章
- python 调用摄像头拍照_《自拍教程67》Python调用摄像头, 拍照拍照!
- mysql数据采集中间件_开源 | MySQL数据传输中间件—DTLE
- oracle查询表的字段类型有哪些,oracle中查询表的信息,包括表名,字段名,字段类型,主键(精)...
- mapreduce value 排序_MapReduce知识点一
- 在研究所工作是什么体验?和互联网公司比,你会怎么选?
- 皮一皮:老板是个学渣...
- 搞 Java 的年薪 50w 什么水平?
- Redis Cluster 原理你了解不?
- Java虚拟机最多支持多少个线程的探讨
- Metaspace 引起的 FullGC 问题排查过程及解决方案