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

news2024/10/6 8:37:25

     大家好,今天给大家分享一下,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.coloradmin.cn/o/1067148.html

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

相关文章

OMV6 安装Extras 插件失败的解决方法

# Time: 2023/10/07 #Author: Xiaohong # 运行环境: OS: OMV6 # 功能: 安装Extras 插件失败的解决方法 问题描述:OMV6 安装插件omv-extras,只能按如下提示的命令行,但安装过程中,会提示raw.githubusercontent.com 无法访问插…

校招秋招,性格和职业有关系吗?

企业在招聘应届毕业生时不再局限于普通的面试或者笔试,在互联网时代,为了能够更好的匹配需要的优质人才,企业会通过各种测试来提高招聘的准确率以及成功率。也许以前很多人都听说过性格和职业是有一定关系的,但是如何确定自己的性…

win安装ESPHome教程

感谢 Little-Bear-Bear 博主的教程,ESPHome入门 windows环境安装 -01 1.安装python 从Python官方网站下载。 确保选中“将Python添加到PATH”,然后一直通过 安装。 安装后重新启动计算机 winR 。按回车键。cmd python --version输入 查看 是否安装成功 python…

基于虚拟同步发电机控制的双机并联Simulink仿真模型

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

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

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

8.2 JUC - 4.Semaphore

目录 一、是什么?二、简单使用三、semaphore应用四、Semaphore原理 一、是什么? Semaphore:信号量,用来限制能同时访问共享资源的线程上限 二、简单使用 public class TestSemaphore {public static void main(String[] args) …

freeRTOS的数据类型定义(portmacro.h文件里)

freeRTOS的数据类型定义(portmacro.h文件里) 解读: https://www.bilibili.com/video/BV1n8411y7DF/?buvidXY4F2994565924F2FFA7142AEEB2220A602A4&is_story_h5false&mid%2B8iBjJuKH0VIWaMd8h0wSQ%3D%3D&p1&plat_id114&s…

铭控传感亮相2023国际物联网展,聚焦“多场景物联感知方案”应用

金秋九月,聚焦IoT基石技术,荟萃最全物联感知企业,齐聚IOTE 2023第20届国际物联网展深圳站。铭控传感携智慧楼宇,数字工厂,智慧消防,智慧泵房等多场景物联感知方案及多品类无线传感器闪亮登场,现…

windows内核编程(2021年出版)笔记

1. Windows内部概览 1.1 进程 进程包含以下内容: 可执行程序,代码和数据私有的虚拟地址空间,分配内存时从这里分配主令牌,保存进程默认安全上下文,进程中的线程执行代码时会用到它私有句柄表,保存进程运…

C语言之共用体、枚举类型、typedef

共用体 共用体的所有成员共享同一个内存地址 插入一个知识点&#xff1a;字符串不可以直接赋值&#xff0c;要不就在定义的时候赋值&#xff0c;要不就只能使用scanf函数赋值或者<string>中的strcpy赋值 证明 如果要同时访问联合体中多个成员的值...... 则会出现以下情…

自动化项目实战->测试博客系统

1.熟悉项目-->哪些场景容易出现问题 2.针对核心流程设计测试用例(手工测试用例) 3.将手工测试用例转换为自动化测试用例 4.部署到服务器 一、针对核心流程设计测试用例 二、将手工测试用例转换为自动化测试用例 2.1设计自动化测试用例的代码结构 初始化动作:BeforeAll--…

[NISACTF 2022]popchains - 反序列化+伪协议

[NISACTF 2022]popchains 一、解题流程二、小小疑惑 一、解题流程 1、链条&#xff1a;Road_is_Long&#xff08;construct->wakeup【page$r】-> toString【string$m】&#xff09;-> Make_a_Change&#xff08;construct->get【effort$t】&#xff09;-> Try_W…

数据压缩与管理:掌握Linux VDO和LVM的力量

1.逻辑卷(LVM&#xff0c;Logical Volume Management) 动态的为服务器磁盘添加空间&#xff0c;而不会影响原磁盘的数据&#xff0c;也不需要对原始磁盘重新分区。 1.1 LVM介绍 以下是LVM的示意图&#xff1a; 我们拿到一块硬盘后首先对齐进行划分分区&#xff0c;也就得到…

Web:前端常用的几种Http请求GET和POST样例

1、简述 在Web开发过程中&#xff0c;少不了发起Http请求服务端的接口数据&#xff0c;在不同的框架中使用了不同的Http请求方式&#xff0c;常用的请求有fetch、 ajax、 axios、XMLHttpRequest、request&#xff0c;以下样例仅供参考。 2、Fetch Fetch API 是一种 JavaScr…

Redis的五种常用数据类型

1.字符串 String的数据结构是简单的Key-Value模型&#xff0c;Value可以是字符串&#xff0c;也可以是数字。 String是Redis最基本的类型&#xff0c;是二进制安全的&#xff0c;意味着Redis的string可以包含任何数据&#xff0c;比如jpg图片。 一个redis中字符串value最大是…

光伏系统MPPT、恒功率控制切换Simulink仿真

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

从0开始学go第五天

gin框架返回JSON package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/json", func(c *gin.Context) {//用map序列化//方法一&#xff1a;用map&#xff0c;后面用接口类型// data : map[string…

电视盒子什么品牌好?内行分享权威电视盒子品牌排行榜

因工作关系每天都会接触到各种类型的电视盒子&#xff0c;对整个行业可以说了如指掌&#xff0c;身边朋友们在挑选电视盒子时也会问我电视盒子什么品牌好&#xff0c;哪些电视盒子值得入手&#xff0c;今天我来分享业内公认最权威的电视盒子品牌排行榜&#xff1a; TOP 1.泰捷超…

使用 labelImg 制作YOLO系列目标检测数据集(.xml文件)

文章转载自K同学&#xff0c;谨防原文失效 第一步&#xff1a; WIN键R 输入cmd 打开命令行窗口 第二步&#xff1a; 在命令行窗口中输入pip3 install labelImg&#xff0c;安装 labelImg 第三步&#xff1a; 输入labelImg 打开labelImg窗口 第四步&#xff1a; ✨ 标注小技巧…

Edge浏览器无法下载RP插件问题解决方案

1、进入本地C:\Windows\System32\drivers\etc 2、编辑hosts文件&#xff0c;在最后结尾加入以下内容 131.253.33.219 edge.microsoft.com 131.253.33.219 msedgeextensions.sf.tlu.dl.delivery.mp.microsoft.com3、进入 https://microsoftedge.microsoft.com/addons/search/RP…