Linux设备和分类

字符设备:能够像字节流一样被访问的设备,当对字符设备发出读写请求,相应的I/O操作立即发生。例,字符终端、串口、键盘、鼠标等;
块设备 :Linux系统中进行I/O操作时必须以块为单位进行访问的设备,块设备能够安装文件系统。块设备驱动会利用一块系统内存作为缓冲区,因此对块设备发出读写访问,并不一定立即产生硬件I/O操作。例,硬盘、软驱等;
网络设备:既可以是网卡这样的硬件设备,也可以是一个纯软件设备如回环设备。网络设备由Linux的网络子系统驱动,负责数据包的发送和接收,而不是面向流设备,因此在Linux系统文件系统中网络设备没有节点,对网络设备的访问是通过socket调用产生

1、设备节点和设备编号

dev_t类型来保存设备编号(包括主设备号和次设备号)。

在 2.62.6 版本的Linux内核中,dev_t 是一个 32 位数,高12位是主设备号,低20位是次设备号(从设备号)。
1、主设备号:
如果多个设备使用同一个驱动程序,则它们拥有相同的主设备号。主设备号由系统来维护,但是在使用主设备号的时候,注意一定不要使用系统已经的主设备号。
一般来说,231~239这几个设备是系统没有分配的,用户可以自行安排使用。cat /proc/devices查看运行系统占用了哪些主设备号。
2、次设备号:
用于确定该文件所指定的设备,如果一个设备驱动可以驱动一组相似的设备,此时就需要依赖于次设备号对这些外进行区分。

1.1 操作设备号

从dev_t获取。应当使用 <linux/kdev_t.h>中定义的 宏,而不应当对设备号位数和表述结构做任何假设,因为这样会导致不兼容以前的内核,或者未来版本设备号结构和表述方式发生变化。例如获取一个设备dev的主次设备号,可用:

#include<linux/kdev_t.h>MAJOR(dev_t dev);      //获取主设备号
MINOR(dev_t dev);       //获取次设备号

如果已知一个设备的主次设备号,要转换成dev_t类型的设备编号,则应当使用:

MKDEV(int major,int minor);

1.2 获取设备编号:

1)静态获取主设备:
只在特定系统运行,且系统设备号使用情况明确;系统应用所要求;如为了快速启动等。

#include<linux/fs.h>int register_chrdev_region(dev_t first,unsigned int count,char *name);  //向系统注册1个或多个设备号
//first是起始编号;
//count是主设备号的数量;
//name是设备名称
/*注册成功返回0,否则返回错误码*/

2)动态获取主设备号:

如果事先不知道设备的设备号,或者一个驱动可能在多个系统上运行,为了避免出现设备号冲突,必须采用动态设备号。

#include<linux/fs.h>alloc_chrdev_region(dev_t *dev,unsigned int firstminor,unsigned int count,char *name);//该函数可以从系统动态获得一个或者多个主设备号
//dev用于保存已经获得的编号范围的第一个值;
//firstminor是第一个次设备号,通常是0;
//count是获得的编号数量;
//name是设备名称;

动态获取得到的设备号,一定要用一个全局变量保存下来以便卸载使用,否则该设备号将不能被释放。

1.3 释放设备号

在设备注销的时候必须释放占用的主设备号,调在unregister_chrdev_region 可以释放设备号。函数原型:

void unregister_chrdev_region(dev_t from,unsigned count);
//from要释放的设备号,与注册的设备号一致;
//count释放设备号的个数;

1.4 测试程序

#include<linux/module.h>
#include<linux/init.h>
#include<linux/fs.h>
#include<linux/cdev.h>
#include<linux/device.h>static int dev_major;
static int dev_minor;module_param(dev_major,int,S_IRUGO);
module_param(dev_minor,int,S_IRUGO);
dev_t dev_no;           //dev number#define DEVICE_NAME     "cdev_hello"
#define MINOR_NUM       0
#define DEVICE_COUNT    1
static int __init hello_init(void)
{int ret;printk("Hello init!Get number is %d\n",dev_major);if(dev_major > 0)       //Static gain                   {dev_no = MKDEV(dev_major, dev_minor);           //Get the dev_t type.ret = register_chrdev_region (dev_no, DEVICE_COUNT, DEVICE_NAME);//Static acquisition deviceif(ret < 0){printk("static no error!\n");   //Fail to getreturn ret;}printk("static is ok!\n");              //Gain successprintk("major = %d,minor = %d\n",dev_major,dev_minor);}else                    //Dynamic acquisition{alloc_chrdev_region(&dev_no, MINOR_NUM, DEVICE_COUNT, DEVICE_NAME);dev_major = MAJOR(dev_no);      //Get majordev_minor = MINOR(dev_no);      //Get minorprintk("Dynamic is ok!\n");printk("major = %d,minor = %d\n",dev_major,dev_minor);}return 0;
}
static void __exit hello_exit(void)
{unregister_chrdev_region(dev_no,DEVICE_COUNT); //设备个数设置为宏定义后才能取消设备号??printk("Hello exit!\n");
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("GPL");

测试结果
1、

2、

02-Linux设备分类和设备编号学习相关推荐

  1. 设备维修管理系统 php,设备维修管理 设备维护保养管理系统 v5.8

    下面我们对设备维修管理 设备维护保养管理系统 v5.8文件阐述相关使用资料和设备维修管理 设备维护保养管理系统 v5.8文件的更新信息. 设备维修管理 设备维护保养管理系统 v5.8 设备维护保养管理 ...

  2. LINUX下USB1.1设备学习小记(2)_协…

    LINUX下USB1.1设备学习小记(2)_协议 (2009-03-27 14:40) 分类: 文章转载 USB协议: 先看USB接口 可以看出,在USB使用了4根线,分别为电源线,地线,信号线和差分 ...

  3. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备

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

  4. 【Android 逆向】Linux 文件分类 ( 普通文件 | 目录文件 | 链接文件 | 字符设备文件 | 管道文件 | 块设备文件 )

    文章目录 一.Linux 文件分类 1.普通文件 2.链接文件 3.字符设备文件 4.管道文件 5.块设备文件 一.Linux 文件分类 Linux 文件分类 : " - " 表示 ...

  5. linux内核驱动之 设备和模块的分类

    目录 字符设备 块设备 网络接口 其他划分方式 以 Linux 的方式看待设备可区分为 3 种基本设备类型. 每个模块常常实现 3 种类型中的 1 种, 因此可分类成字符模块, 块模块, 或者一个网络 ...

  6. LINUX下USB1.1设备学习小记(5)_uhci与设备(2)

    hub_port_wait_reset在/drivers/usb/core/hub.c中   static int hub_port_wait_reset(struct usb_hub *hub, i ...

  7. linux uart寄存器 代替 printk,Linux驱动学习之设备树(设备树下的LED驱动实验),...

    Linux驱动学习之设备树(设备树下的LED驱动实验), 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.相当于从驱动代码分离出来的配置文件,比如串口的波特率通过设 ...

  8. 【学习笔记】第五章——I/O(设备分类、控制方式、软件层次结构、假脱机、缓冲)

    文章目录 一. 设备分类与控制方式 1)设备分类 2)控制方式 1. 程序直接控制方式 2. 中断驱动方式 3. DMA 方式 4. 通道控制方式 总结 二. 软件层次结构与假脱机 1)软件层次结构 ...

  9. linux内核创建字符节点,Tiny6410学习ing—(四)、嵌入式Linux内核驱动进阶—(7)、高级字符设备驱动(自动创建节点)—#931...

    按照国嵌的视频教程上来说的,最后就是-自动创建设备文件! 其实我感觉以前完全可以直接是手动创建了设备文件,然后就可以直接讲述自动创建设备文件,为啥非要拖到最后来讲述,我也就不清楚了!! 不管了,写完收 ...

最新文章

  1. python日期格式化
  2. 如果让我重新设计一款Android App
  3. 第十一届山东省大学生程序设计竞赛(热身赛)Mika with Cherry Cake
  4. MSP430程序库五SPI同步串行通信
  5. Python几种加密算法
  6. python开发测试岗_作为测试开发岗的面试官,我都是怎么选人的?
  7. pymol怎么做底物口袋表面_如何系统的去做有机合成工艺优化---之实战策略
  8. 高职计算机等级考试试题,高职院校计算机等级考试的教学与思考
  9. comsol稀物质传递_COMSOL电弧仿真
  10. 谨慎设计方法签名(40)
  11. web服务器python_一个简单的web服务器(python)
  12. linuxmove命令_linux中mv命令使用详解
  13. 大连理工大学计算机组织与结构实验,大连理工大学计算机系统结构实验-实验四.doc...
  14. 【定时任务】cron表达式在线生成器怎么用?
  15. 海淘尺码表,贡献给论坛买衣服裤子鞋子的朋友
  16. 数学 - 基本初等函数导数公式及求导法则
  17. C#项目获取当前时间的农历时间
  18. 微信HOOK协议(PC版)源码demo
  19. 信息学奥赛一本通 1348:【例4-9】城市公交网建设问题
  20. 机器学习中的数学——学习曲线如何区别欠拟合与过拟合

热门文章

  1. php中文网视频放不了,【杂谈】看php中文网视频课程的正确姿势!
  2. 面向对象和C++基础—面向对象(构造与析构函数篇)
  3. 从DeepFace到AdaFace,一文搞懂人脸识别!
  4. python 0xff_正在解压缩“0xff”与“\xff”
  5. 采购申请审批-MEPO822
  6. solidworks设计树规则
  7. wol远程唤醒ubuntu
  8. 2022美赛E题思路记录
  9. 一文搞定MySQL聚合函数
  10. 用Python的第三方库抓取某点评网站的评论数据