一、设备号基础

  一般来说,使用ls -l命令在时间一列的前一列的数字表示的是文件大小,但如果该文件表示的是一个设备的话,那时间一列的前一列将有两个数字,用逗号分隔开,如下图:

  

  前一个数字表示主设备号,后一个数组表示次设备号。主设备号用来区分不同种类的设备,而次设备号用来区分同一类型的多个设备。

  实际上主设备号和次设备号组合起来就是一个32位的数字,用dev_t类型表示,前12位表示主设备号,后20位表示次设备号。

  可以通过MAJOR提取出主设备号,可以通过MINOR提取出次设备号,或者用MKDEV将主设备号和次设备号组合成一个dev_t类型的设备号,它们的定义见下图:

   

  注意是在linux/kdev_t.h中定义的

  在内核代码Documentation目录下的devices.txt中记录了已经使用的各个设备的主设备号和次设备号如下图:

  

  比如/dev/mem主设备号为1,次设备号为1,这么说/dev/ram1主次设备号与/dev/mem一样,是不是就冲突了呢,事实上并没有/dev/ram1这个文件,如下图:

  

二、分配主设备号

  方法一:静态申请

    使用register_chrdev_region函数,该函数的原型如下:

/**
* register_chrdev_region() - register a range of device numbers
* @from: the first in the desired range of device numbers; must include
* the major number.
* @count: the number of consecutive device numbers required
* @name: the name of the device or driver.
*
* Return value is zero on success, a negative error code on failure.
*/
int register_chrdev_region(dev_t from, unsigned count, const char *name)

    功能:注册从from开始的count个设备号

    参数:

      from:希望注册的设备号。必须包含主设备号

      count:希望注册的设备号数目

      name:设备名(体现在/proc/devices)

    返回值:

      成功返回0,失败返回错误码

    注意:这个函数注册的设备号并不是主设备号不变,次设备号增加,比如from写的是(1, (2^20 - 1)),注册两个设备,则将会注册(1, (2^20 - 1))和(2, 0)两个设备,这两个设备的主设备号是不一样的,也就是说在内核里边认为这是两个不同类型的设备。

 

  方法二:动态分配

    使用alloc_chrdev_region函数,该函数的原型如下:

/**
* alloc_chrdev_region() - register a range of char device numbers
* @dev: output parameter for first assigned number
* @baseminor: first of the requested range of minor numbers
* @count: the number of minor numbers required
* @name: the name of the associated device or driver
*
* Allocates a range of char device numbers. The major number will be
* chosen dynamically, and returned (along with the first minor number)
* in @dev. Returns zero or a negative error code.
*/
int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)

    功能:申请一个范围的设备号

    参数:

      dev:输出参数,为申请到的第一个设备号

      baseminor:起始次设备号

      count:需要分配的设备号数量

      mame:设备名(体现在/proc/devices)

    返回值:

      成功返回0,失败返回错误码

  得到了设备号之后,在/proc/devices中就可以看到该设备对应的主设备号了。

三、注销设备号

  使用函数unregister_chrdev_region,原型如下:

/**
* unregister_chrdev_region() - unregister a range of device numbers
* @from: the first in the range of numbers to unregister
* @count: the number of device numbers to unregister
*
* This function will unregister a range of @count device numbers,
* starting with @from. The caller should normally be the one who
* allocated those numbers in the first place...
*/
void unregister_chrdev_region(dev_t from, unsigned count)

  

linux驱动设备号的更多相关文章

  1. Linux中设备号及设备文件【转】

    本文转载自:http://blog.csdn.net/ymangu666/article/details/39292651 主.次设备号 应用程序可以通过对/dev 目录下的设备文件读写,从而访问实际 ...

  2. linux主次设备号【转载】

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

  3. linux主次设备号介绍

    1.主设备号与次设备号的功能 在Linux内核中,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务:而次设备号则用来标识具体且唯一的某个设 ...

  4. ⭐linux主次设备号介绍

    1.主设备号与次设备号的功能 在Linux内核中,主设备号标识设备对应的驱动程序,告诉Linux内核使用哪一个驱动程序为该设备(也就是/dev下的设备文件)服务:而次设备号则用来标识具体且唯一的某个设 ...

  5. linux 驱动程序中断号的申请

    1.linux下查看硬中断与软中断 硬中断:/proc/interrupts 软中断:/proc/softirqs 往往一些硬件中断号都是跟CPU所分配的硬件中断号相匹配的. 即同类型的cpu可能对同 ...

  6. Linux驱动设备中的并发控制

    一.基本概念 二.中断屏蔽 三.原子操作 四.自旋锁 五.信号量 六.互斥体 七.自旋锁与信号量的比较 Linux设备驱动中必须解决的一个问题是多个进程对共享资源的并发访问,并发的访问会导致竞态,即使 ...

  7. linux学习笔记1:linux驱动设备概述

  8. linux设备管理之主设备号与次设备号

    主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号.主设备号和次设备号统称为设备号.主设备号用来表示一个特定的驱动程序.次设备号用来表示使用该驱动程序的其他设备.(主设备号和控制这类 ...

  9. linux中的设备名称和设备号

    看赵炯博士的<linux 0.11 源代码注释>已经两三周了,从今天起开始将一些个人总结和感悟分小标题写出来,聊作记忆以供后来查看.在linux0.11源码的 /linux/boot/bo ...

随机推荐

  1. kali2020创建root用户

    自kali更新到2020版后,默认取消了root用户的登录权限.只能用普通用户登录,这样做的优点在于对于kali的新手,在不懂的部分命令的情况下对系统的损害有所降低,也就说安全性提高了.但是普通用户权 ...

  2. 数组单调性判断以及all和diff函数的用法

    clc;clear all;close all; n = 1 ;x = zeros(100,1);while n~= 0 n = input('请输入向量的长度n(0退出程序):'); for i = ...

  3. python lambda表达式应用

    在python中有两种函数,一种是通过def得到的函数,一种是匿名函数,也就是lambda表达式.语法格式如下: lambda argument_list:expersion 语法中的argument ...

  4. IIS本地部署局域网可随时访问的项目+mysql可局域网内访问

    开端口即可 或者以下 原理 在本机的IIS下创建一个网站,文件目录直接指向Web项目文件夹 步骤 1.项目的启动项目为web 2.在iis中创建一个新的网站(Work_TK_EIS) 文件目录为web ...

  5. python初学者-判断一个数是否为素数

    while True: #判断为真 num = int(input('请输入一个数:')) for i in range(2,num):#判断在num之前的数能不能把num整除 if(num%i == ...

  6. [leetcode]449. Serialize and Deserialize BST设计BST的编解码

    这道题学到了东西. /* 一开始想着中序遍历,但是解码的时候才发现,中序遍历并不能唯一得确定二叉树. 后来看了网上的答案,发现先序遍历是可以的,观察了一下,对于BST,先序遍历确实是可以 唯一得确定. ...

  7. mysql性能调优注意事项

    1.最左原则  注意遇到> < like  between失效 2.对于like 查询  遇到最左%索引无效 3.SQL性能优化目标:至少要达到range(对索引进行范围查找)级别,要求是 ...

  8. IT 界那些朗朗上口的“名言

    中国有很多古代警世名言,朗朗上口,凝聚了很多故事与哲理.硅谷的互联网公司里头也有一些这样的名言,凝聚了很多公司价值观和做事的方法,对于很多程序员来说,其影响潜移默化.这里收集了一些,如下. Stay ...

  9. OpenSUSE 使用基础

    OpenSUSE OpenSUSE 是一个基于 RPM 的发行版,这和 RHEL/CentOS 一致. 但是它的官方包管理器是专有的 zypper,挺好用的,软件也很新. 本文以 OpenSUSE L ...

  10. 2.1 关系型数据的收集--Sqoop

    Sqoop应用场景: 1.数据迁移,将关系型数据库中的数据导入Hadoop存储系统 2.可视化分析结果,将Hadoop处理之后产生的结果导入关系型数据库,以便进行可视化展示 3.数据增量导入:减少ha ...