申请和注销设备号的方法

news2024/11/15 11:15:08

一、Linux内核对设备的分类

linux的文件种类:

  1. -:普通文件

  2. d:目录文件

  3. p:管道文件

  4. s:本地socket文件

  5. l:链接文件

  6. c:字符设备

  7. b:块设备

Linux内核按驱动程序实现模型框架的不同,将设备分为三类:

  1. 字符设备:按字节流形式进行数据读写的设备,一般情况下按顺序访问,数据量不大,一般不设缓存

  2. 块设备:按整块进行数据读写的设备,最小的块大小为512字节(一个扇区),块的大小必须是扇区的整数倍,Linux系统的块大小一般为4096字节,随机访问,设缓存以提高效率

  3. 网络设备:针对网络数据收发的设备

总体框架图:

 

二、设备号------内核中同类设备的区分

内核用设备号来区分同类里不同的设备,设备号是一个无符号32位整数,数据类型为dev_t,设备号分为两部分:

  1. 主设备号:占高12位,用来表示驱动程序相同的一类设备

  2. 次设备号:占低20位,用来表示被操作的哪个具体设备

应用程序打开一个设备文件时,通过设备号来查找定位内核中管理的设备。

MKDEV宏用来将主设备号和次设备号组合成32位完整的设备号,用法:

dev_t devno;
int major = 251;//主设备号
int minor = 2;//次设备号
devno = MKDEV(major,minor);//将自定义的主设备号和次设备号结合为内核可以区分的32位的设备号

MAJOR宏用来从32位设备号中分离出主设备号,用法:

dev_t devno = MKDEV(249,1);
int major = MAJOR(devno);

MINOR宏用来从32位设备号中分离出次设备号,用法:

dev_t devno = MKDEV(249,1);
int minor = MINOR(devno);

如果已知一个设备的主次设备号,应用层指定好设备文件名,那么可以用mknod命令在/dev目录创建代表这个设备的文件,即此后应用程序对此文件的操作就是对其代表的设备操作,mknod用法如下:

@ cd /dev
@ mknod 设备文件名 设备种类(c为字符设备,b为块设备)  主设备号  次设备号    //ubuntu下需加sudo执行 ,例如在dev目录下要创建的设备文件名为mydev,其为字符设备,主设备号自定义为20,次设备号为1,则使用命令 sudo mknod /dev/mydev c 20 1 来创建对应的设备驱动文件。

在应用程序中如果要创建设备可以调用系统调用函数mknod,其原型如下:

int mknod(const char *pathname,mode_t mode,dev_t dev);
pathname:带路径的设备文件名,无路径默认为当前目录,一般都创建在/dev下
mode:文件权限 位或 S_IFCHR/S_IFBLK
dev:32位设备号
返回值:成功为0,失败-1

三、申请和注销设备号

字符驱动开发的第一步是通过模块的入口函数向内核添加本设备驱动的代码框架,主要完成:

  1. 申请设备号

  2. 定义、初始化、向内核添加代表本设备的结构体元素

int register_chrdev_region(dev_t from, unsigned count, const char *name)
功能:手动分配设备号,先验证设备号是否被占用,如果没有则申请占用该设备号
参数:
    from:自己指定的设备号
    count:申请的设备数量
    name:/proc/devices文件中与该设备对应的名字,方便用户层查询主设备号
返回值:
    成功为0,失败负数,绝对值为错误码

int alloc_chrdev_region(dev_t *dev,unsigned baseminor,unsigned count, const char *name)
功能:动态分配设备号,查询内核里未被占用的设备号,如果找到则占用该设备号
参数:
    dev:分配设备号成功后用来存放分配到的设备号
    baseminior:起始的次设备号,一般为0
    count:申请的设备数量
    name:/proc/devices文件中与该设备对应的名字,方便用户层查询主次设备号
返回值:
    成功为0,失败负数,绝对值为错误码

分配成功后在/proc/devices 可以查看到申请到主设备号和对应的设备名,mknod时参数可以参考查到的此设备信息

void unregister_chrdev_region(dev_t from, unsigned count)
功能:释放设备号
参数:
    from:已成功分配的设备号将被释放
    count:申请成功的设备数量

释放后/proc/devices文件对应的记录消失

注:在申请时若是动态申请,则需要使用MAJOR来重新为主设备号赋值,因为动态申请使用的主设备号是我们所不知道的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/739619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++练习】经典的排列组合问题(回溯算法)——电话号码的字母组合

📖题目描述 题目出处:电话号码的字母组合 示例: 📖题解  这是一道典型的排列组合问题,根据输入,我们需要找到所有的组合。下面以输入字符串digits "23"为例来讲解这道题目。 图解&#xff1…

Java入门到入土(集合篇)

前言 初出茅庐 Collection集合特点 Map集合特点 牛刀小试 List集合用法 迭代器原理 Set集合用法 Map集合用法 追根溯源 List集合解析 Set集合解析 Map集合解析 结束语 前言 Java中用来批量存储数据的方式有…

mac 怎么批量修改文件后缀?

mac 批量修改文件后缀的方法教程~平时在电脑上使用文件的时候,经常需要对文件的后缀名进行修改,文件后缀名也就是文件扩展名,如果仅是单纯的修改文件后缀名,并不涉及格式转换的情况下,其实方法很简单,只需要…

ZBrush 3D游戏建模教程:创建女武士模型

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 介绍 在本教程中,演示创建实时武士角色的流程,该流程基于 Kati Sarin S 的原始概念。我将使用各种各样的软件,如ZBrush,Maya&#xff…

微信小程序外卖管理的设计与实现(论文+源码)_kaic

摘要 随着互联网技术的不断更新和发展,人们的生活水平也在不断的提高,人们对互联网的依赖越来越紧密,尤其是网上外卖也越来越习惯了。它的功能包括在主页上列出出售的外卖。您也可以直接在首页顶部搜索想要的产品,如果余额不足&am…

信号与系统课程实验报告: 连续信号及其傅里叶变换的编程

一、实验目的 认识并熟悉Matlab软件的使用,并能利用其进行编程利用Matlab实现连续信号的表示掌握数值法和符号法进行编程实现连续周期信号的傅里叶级数求解编程算法实现连续信号的傅里叶变换求解编程算法理解Matlab代码的具体意义并熟练使用利用Matlab对LTI系统的频…

Maven依赖管理(核心)

依赖配置 依赖&#xff1a;指当前项目运行所需要的jar包&#xff0c;一个项目可以引入多个依赖配置&#xff1a; 在pom.xml中编写<dependencies>标签在<dependencies>标签中使用<dependency>引入坐标定义坐标的groupId、artifacId、version点击刷新按钮&…

二叉树层序遍历

目录 一、什么是层序遍历 二、层序遍历的实现 三、判断一棵树是否为完全二叉树 总结&#xff1a; 学习二叉树结构&#xff0c;最简单的就是遍历。 所谓二叉树遍历就是按照某种规则对二叉树中的节点进行相应操作&#xff0c;每个节点值操作一次。 遍历是二叉树的重要运算之…

深入篇【C++】手搓模拟实现string类(详细剖析常见的各接口):【400行代码实现】

深入篇【C】手搓模拟实现string类(包含常见的各接口&#xff09;&#xff1a;【400行代码实现】 【string类模拟实现完整代码】Ⅰ.构造/析构1.string()2.operator3.~string() Ⅱ.访问遍历1.operator[]2.iterator3.范围for Ⅲ.增操作1.push_back()2.append()3.operator4.insert(…

Harbor未授权创建管理员

人处在幸福与不幸交织的矛盾之中&#xff0c;反而使内心有一种更为深刻的痛苦&#xff0c;看来近在眼前的幸福而实际上又远得相当渺茫&#xff0c;海市蜃楼。放不得抓不住。 漏洞描述 近日&#xff0c;镜像仓库Harbor爆出任意管理员注册漏洞&#xff0c;攻击者在请求中构造特…

eNSP-VLAN多端口成员模式+DHCP

VLAN多端口成员模式DHCP 文章目录 VLAN多端口成员模式DHCP一、题目要求二、题目分析三、拓扑结构四、基本配置五、测试验证1.网段测试2.访问测试 一、题目要求 1、PC1和pc3所在接口为Access接口&#xff0c;PC2/4/5/6处于同一网段&#xff0c;其中PC2可以访问PC4/5/6&#xff…

Webkit内核探究——Webkit CSS实现

文章目录 前言1、CSS是什么2、CSS实现模型3、CSS默认样式表4、CSS解析5、CSS如何作用于Render Tree 前言 CSS在Webkit中的实现属于相对独立的一个模块&#xff0c;注意这里说的是相对。 CSS在Webkit中的作用自然是不言而喻的&#xff0c;在Web早期&#xff0c;文档的结构和样…

【运维工程师学习五】数据库

【运维工程师学习五】数据库 1、常用的关系型数据库2、C/S结构3、MariaDB图形客户端4、安装MariaDB5、启动MariaDB及验证启动是否成功6、验证启动——端口7、验证启动——进程8、MariaDB配置文件路径主配置文件解读&#xff1a; 9、MariaDB的配置选项10、MariaDB客户端连接1、在…

Windows下 Oracle 12c 安装保姆级图文详解

Windows下 Oracle 12c 安装步骤如下&#xff1a; 1、将压缩包“winx64_12c_database_1of2.zip“和“winx64_12c_database_2of2.zip”解压到同一目录“database”目录。 2、双击“database”目录下的“setup.exe"&#xff0c;软件会加载并初步校验系统是否可以达到了数据…

华为云出品《深入理解高并发编程:Java线程池核心技术》电子书发布

系统拆解线程池核心源码的开源小册 透过源码看清线程池背后的设计和思路 详细解析AQS并发工具类 点击下方链接进入官网&#xff0c;右上角搜索框搜索“《深入理解高并发编程&#xff1a;Java线程池核心技术》” 即可获取下载。 https://auth.huaweicloud.com/authui/login…

01-线性表 (数据结构和算法)

要点&#xff1a; 程序 数据结构 算法 一、数据结构的概述 程序 数据结构 算法 数据结构&#xff1a;计算机存储、组织数据的方式 算法&#xff1a;处理数据的方式 1.1 基本概念和术语 1、数据 数据&#xff08;data&#xff09;&#xff1a;所有能够输入到计算机中…

【Method】稀疏与压缩感知 | 图像稀疏性及压缩感知方法白话讲解

【Method】稀疏与压缩感知 | 图像稀疏性及压缩感知方法白话讲解 文章目录 【Method】稀疏与压缩感知 | 图像稀疏性及压缩感知方法白话讲解1. 为什么图像是可压缩的&#xff1a;图像空间的广阔2. 什么是Sparsity&#xff1f;3.压缩感知&#xff1a;简介4.压缩感知&#xff1a;数…

matlab学习指南(3):最全MATLAB工具箱Toolbox下载地址大汇总

&#x1f305;*&#x1f539;** φ(゜▽゜*)♪ **&#x1f539;*&#x1f305; 欢迎来到馒头侠的博客&#xff0c;该类目主要讲数学建模的知识&#xff0c;大家一起学习&#xff0c;联系最后的横幅&#xff01; 喜欢的朋友可以关注下&#xff0c;私信下次更新不迷路&#xff0…

火车头采集器AI伪原创【php源码】

本文介绍火车头采集器AI伪原创&#xff0c;对于新媒体从业者来说&#xff0c;会写文章是最基本的职业技能&#xff0c;而伪原创是我们经常使用的技能。今天我要讲的是SEO标兵如何在伪原创上创作文章。 首先&#xff0c;原创性永远是最好的&#xff0c;更受读者欢迎。伪原创的出…

Microsoft Dynamics 365:VS2019引用BC发布的SOAP服务

1、搜索网页服务 2、点击新建 3、选择对象类型&#xff1a;页面、单元、查询&#xff0c;输入ID&#xff0c;勾选即可发布服务 4、复制SOAP URL到浏览器里看看是否可以访问&#xff0c;这样就OK的 5、 右键添加服务引用 6、选择高级 7、添加web引用 8、服务地址粘贴进去查找服…