linux系统中常见注册函数的使用方法

     大家好,今天给大家分享一下,linux系统中常见的注册函数register_chrdev_region()、register_chrdev()、 alloc_chrdev_region()的使用方法​。

一、函数包含的头文件:

分配设备编号,注册设备与注销设备的函数均在fs.h中申明,如下:

extern int register_chrdev_region(dev_t, unsigned, const char *); //静态的申请和注册设备号 

extern int  alloc_chrdev_region(dev_t, unsigned, const char *);     //动态的申请注册一个设备号

extern int register_chrdev(unsigned int, const char *,struct file_operations *);//int为0时候动态注册,非零时候静态注册。

extern int unregister_chrdev(unsigned int, const char *);   //注销设备号

extern void unregister_chrdev_region(dev_t, unsigned);   //注销设备号

二、注册设备号

静态注册:

使用register_chrdev_region()首先需要定义一个dev_t变量来作为一个设备号,

dev_t   dev_num; 

要想注册一个设备则需要一个主设备号。

根据主设备号获取设备号:

dev_num=MKDEV(major,minor);  major是一个表示设备号的主设备号,minor次设备号

注册:

register_chrdev_region(dev_num,2,"dev_name");

第一个参数表示设备号,第二个参数表示注册的此设备数目,第三个表示设备名称。

动态注册:

如果我们提前知道设备的编号,那么就用register_chrdev_region(),但是如果我们不知道呢,我们就使用动态申请设备编号。

alloc_chrdev_region(&dev_num, minor, 2, "dev_name");

第一个参数保存生成的设备号,第二个参数注册设备的数目,第三个参数表示设备名称。

根据设备号获取主设备号:

dev_major = MAJOR(dev_num); 

三、向内核中添加设备

struct cdev  devno;

cdev_init(&devno,&file_ops); //初始化设备

devno.owner = THIS_MODULE;   //.owner这表示谁拥有你这个驱动程序,

devno.ops = &mem_fops;

对于已经知道了主设备号,就用cdev_add(&devno, dev_num,count);来添加设备

如果是动态申请的设备号,就用cdev_add(&devno, MKDEV(mem_major, 0), count);

向内核添加设备,第一个参数是设备,第二个参数是设备号,第三个参数是要注册的次设备数目,mem_major在动态申请时候保存起来了。

四、注销设备

注销设备时候,使用unregister_chrdev_region(dev_t, unsigned);第一个参数设备号,和注册时候的要一致,因此如果是动态分配的就需要保存起来,第二个参数是次设备的个数。

五、register_chrdev()函数的不一致

register_chrdev(unsigned int, const char *,struct file_operations *); // 申请注册设备号以第一个参数来辨别动态与静态。

1、如果第一个参数是0,表示动态的分配给此驱动程序一个主设备号,

2、非零时候,表示备驱动程序向系统申请主设备号,

第二个是设备名,第三个file_operations,如果是动态分配的,则函数返回分配的主设备号。

对应的使用unregister_chrdev(unsigned int, const char *);来注销设备,第一个参数是主设备号,必须和注册时候的主设备号一致,如果注册时候是动态的分配的主设备号,就需要保存起来,第二个是设备名。

综上得出:register_chrdev_region()比register_chrdev()多了一步,就是想内核注册添加cdev设备的步骤。

register_chrdev_region()是register_chrdev()的升级版本。

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

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

相关文章

根据前序与中序遍历结果构造二叉树

文章前言:如果不知道什么是前序与中序的小白同学,作者推荐:二叉树的初步认识_加瓦不加班的博客-CSDN博客 思路: 先通过前序遍历结果定位根节点 再结合中序遍历结果切分左右子树 public class E09Leetcode105 {//1. pre-order 前…

C#上位机——根据命令发送

C#上位机——根据命令发送 第一步:设置窗口的布局 第二步:设置各个属性 第三步:编写各个模块之间的关系

PostgreSQL ash —— pgsentinel插件

一、 插件作用 众所周知,pg是没有像oracle那样的ash视图的,因此要回溯历史问题不太方便。pgsentinel插件会将pg_stat_activity与pg_stat_statements视图内容定期快照,并存入pg_active_session_history和pg_stat_statements_history视图中。 1…

基于LADRC自抗扰控制的VSG三相逆变器预同步并网控制策略(Simulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

网络相关的基础知识整理

一、历史 1.1 早期阿帕网特点⭐⭐⭐ 没有纠错功能不能互联不同类型的计算机和不同类型的操作系统 1. 2 TCP/IP协议 点击【此处】跳转🔗 TCP:用来检测网络传输中差错的传输控制协议IP:专门负责对不同网络进行互联的互联网协议&#xff08…

数学建模预测模型MATLAB代码大合集及皮尔逊相关性分析(无需调试、开源)

已知2010-2020数据,预测2021-2060数据 一、Logistic预测人口 %%logistic预测2021-2060年结果 clear;clc; X[7869.34, 8022.99, 8119.81, 8192.44, 8281.09, 8315.11, 8381.47, 8423.50, 8446.19, 8469.09, 8477.26]; nlength(X)-1; for t1:nZ(t)(X(t1)-X(t))/X(t1…

【MVDiffusion】完美复刻场景,可多视图设计的生成式模型

文章目录 MVDiffusion1. 自回归 生成 全景图1.1 错误积累1.2 角度变换大 2. 模型结构2.1 多视图潜在扩散模型(mutil-view LDM)2.1.1 Text-conditioned generation model2.1.2 Image&text-conditioned generation model2.1.3 额外的卷积层 2.2 Correspondence-aware Attenti…

使用python-opencv检测图片中的人像

最简单的方法进行图片中的人像检测 使用python-opencv配合yolov3模型进行图片中的人像检测 1、安装python-opencv、numpy pip install opencv-python pip install numpy 2、下载yolo模型文件和配置文件: 下载地址: https://download.csdn.net/down…

参与现场问题解决总结(Kafka、Hbase)

一. 背景 Kafka和Hbase在现场应用广泛,现场问题也较多,本季度通过对现场问题就行跟踪和总结,同时结合一些调研,尝试提高难点问题的解决效率,从而提高客户和现场满意度。非难点问题(历史遇到过问题&#xf…

三模块七电平级联H桥整流器电压平衡控制策略Simulink仿真

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

[ubuntu]ubuntu设置虚拟内存

首先查看自己是否加过虚拟内存或者查看虚拟内存当前状态可以命令: free -mh 创建交换分区: sudo mkdir /swap cd /swap sudo dd if/dev/zero ofswapfile bs1024 count12582912 其中count是自己分配内存大小,上面为12GB,你可…

travel总结:

目录 1、前期准备: 2、项目期间: (1)注册功能的实现: 1、前端: 1、表单数据的校验:(js) 2、使用ajax完成表单提交 3、注册成功跳转页面 2、web: 1、获取表单数据、封装数据 2、调…

【Java8】线程问题排查分析

文章目录 thread dump简介JDK 工具jstackjattachjvisualvm Java程序CPU消耗较高,怎么快速看出是那个线程导致的呢?我们可以使用命令 jstack/jattach来快速定位问题 thread dump简介 thread dump 是 Java 进程的所有线程状态的快照。每个线程的状态都通过…

练[MRCTF2020]套娃

[MRCTF2020]套娃 文章目录 [MRCTF2020]套娃掌握知识解题思路代码分析1代码分析2 关键paylaod 掌握知识 ​ 参数的_符号的替换,正则和强等于联合绕过,jsfuck编码,bp请求方式的转变,本地ip的请求头,代码审计&#xff0c…

操作系统的五种IO模型

高级IO 阻塞IO 在内核将数据准备好之前,系统调用会一直等待,所有的套接字默认都是阻塞方式。 非阻塞IO 如果内核还未将数据准备好,系统调用仍然会直接返回,并且返回EWOULDBLOCK错误码。 非阻塞IO往往需要程序员循环的方式反复尝试…

TCP四次挥手

四次挥手发生在断开连接的时候,在程序中当调用了close()会使用TCP协议进行四次挥手。 客户端和服务器端都可以主动发起断开连接,谁先调用close()谁就是发起。 因为在TCP连接的时候,采用三次握手建立的的连接是双向的,在断开的时候…

电脑被删除的文件怎么恢复?2023年数据恢复方法分享

大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…

【力扣】42. 接雨水

这道题我卡了差不多1个小时,不是不会做,是不知道怎么能用栈来实现,后面看了一个博主的视频,豁然开朗,我主要的纠结点在于当指针指到7的时候,我计算出4到7的水块是2,但实际上是0,因为…

SpringBoot 可以同时处理多少请求

目录 一、前言 二、相关配置 1、配置信息 2、配置说明 3、案例说明 三、代码验证 1、测试代码 2、测试步骤 四、总结 一、前言 首先,在Spring Boot应用中,我们可以使用 Tomcat、Jetty、Undertow 等嵌入式 Web 服务器作为应用程序的运行容器。这…

Vue中如何进行拖拽与排序功能实现

在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…