linux驱动12:主设备号和次设备号

2023-11-14

/dev目录下执行ls -l

设备文件项的最后修改日期前的用逗号分割的两个数,对设备文件来说就是相应的主设备号和次设备号。

第一个字符c表示字符设备,b表示块设备

主设备号标识设备对应的驱动程序,次设备号由内核使用,用于正确确定设备文件所指的设备。依赖于驱动程序的编写方式,我们可以通过次设备号获得一个指向内核设备的直接指针,也可将次设备号当作设备本地数组的索引。

设备编号的内部表达

在内核中dev_t类型(在<linux/types.h>中定义)用来保存设备编号,包括主设备号和次设备号。dev_t是一个32位数,12位用来表示主设备号,20位用来表示次设备号。

设备号相关宏(在<linux/kdev_t.h>中定义):

MAJOR(dev_t dev); #获取主设备号

MINOR(dev_t dev); #获取次设备号

MKDEV(int major, init minor); #主设备号和次设备号转换成dev_t类型

分配和释放设备编号

头文件<linux/fs.h>

静态分配

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 int firstminor, unsigned int count, char *name);

dev:调用成功将返回已分配范围的第一个设备编号

firstminor:要使用的被请求的第一个次设备号,通常为0

count:请求的连续设备编号的个数

name:和该编号范围关联的设备名称(/proc/devices)

释放

void unregister_chrdev_region(dev_t from, unsigned count);

在模块的清除函数中调用

#include <linux/init.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/kdev_t.h>
#include <linux/fs.h>

static int major = 277;
static int minor = 0;
static dev_t devnum1;
static dev_t devnum2;

static int hello_init(void)
{
	printk("hello_init\n");
	devnum1 = MKDEV(major,minor);
	printk("major:%d, minor:%d\n", MAJOR(devnum1), MINOR(devnum1));
	if (register_chrdev_region(devnum1, 1, "hello1"))
	{
		printk("register_chrdev_region failed\n");
		return -1;
	}

	if (alloc_chrdev_region(&devnum2, 0, 1, "hello2"))
	{
		printk("alloc_chrdev_region failed\n");
		return -1;
	}
	printk("major:%d, minor:%d\n", MAJOR(devnum2), MINOR(devnum2));
	
	return 0;
}

static void hello_exit(void)
{
	printk("hello_exit\n");
	unregister_chrdev_region(devnum1, 1);
	unregister_chrdev_region(devnum2, 1);
}

MODULE_LICENSE("GPL");
module_init(hello_init);
module_exit(hello_exit);

 cat /proc/devices查看主设备号和设备名称,静态分配需要确保主设备号没有被注册。

驱动程序需要将设备编号和内部函数连接起来,内部函数用来实现设备的操作。

scull_load脚步用于在/dev目录创建设备文件:装载模块、获取主设备号、创建设备文件、改变设备文件的组和访问权限。

mknod  /dev/设备文件名  c   主设备号  次设备号   #创建设备文件

引导阶段的启动脚步:在运行级别的目录(如 rc3.d)创建一个指向该脚步的链接。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux驱动12:主设备号和次设备号 的相关文章

  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 如何通过替换为空页映射来取消映射 mmap 文件

    Linux 用户空间有没有办法用空页面 映射自 dev null 或者可能是一个空页面 重复映射到从文件映射的页面的顶部 对于上下文 我想找到这个 JDK bug 的修复 https bugs openjdk java net browse
  • 使用 grep 查找包含所有搜索字符串的行

    我有一个文件 其中包含很多与此类似的行 id 2796 some model Profile message type MODEL SAVE fields account 14 address null modification times
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • Jenkins中找不到环境变量

    我想在詹金斯中设置很多变量 我试过把它们放进去 bashrc bash profile and profile of the jenkins用户 但 Jenkins 在构建发生时找不到它们 唯一有效的方法是将所有环境变量放入Jenkinsf
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • Discord.net 无法在 Linux 上运行

    我正在尝试让在 Linux VPS 上运行的 Discord net 中编码的不和谐机器人 我通过单声道运行 但我不断收到此错误 Unhandled Exception System Exception Connection lost at
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack
  • 将 PDF 转换为 600dpi 的 TIFF 和 jpg 96 dpi

    我想使用 ImageMagick 从 Python 脚本将 pdf 转换为 600 dpi 的 tiff 和 96 dpi 的 jpg 我使用 imagemagick 命令行完成了这项任务 但我想使用python中的Imagemagick将
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • 安装J语言的JQt IDE,出现错误

    我一直按照这里的说明进行操作 http code jsoftware com wiki System Installation Linux http code jsoftware com wiki System Installation L
  • Linux 中什么处理 ping?

    我想覆盖 更改 linux 处理 ping icmp echo 请求数据包的方式 这意味着我想运行自己的服务器来回复传入的 icmp 回显请求或其他 数据包 但为了使其正常工作 我想我需要禁用 Linux 的默认 ping icmp 数据包
  • C语言中如何通过内存地址映射函数名和行号?

    如何用 GCC 中的内存地址映射回函数名称和行号 即假设一个 C 语言原型 void func Get the address of caller maybe this could be avoided MemoryAddress get
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute

随机推荐

  • jq中的css样式如何写,jq怎么写css样式

    方法如下 一般要在页面初始化的时候就要加载样式 所以使用ready 方法 语法格式为 document ready function 当DOM已经加载 并且页面 包括图像 已经完全呈现时 会发生ready事件 本教程操作环境 windows
  • centos7 安装frp内网穿透

    一 安装服务端 找一台云服务器 下载frp wget https github com fatedier frp releases download v0 35 1 frp 0 35 1 linux amd64 tar gz 解压 tar
  • 医学图像识别:基于cnn的病变细胞识别 完整代码数据 视频讲解

    项目代码讲解请看视频 医学图像识别 基于cnn的病变细胞识别 哔哩哔哩 bilibili 结果 from keras preprocessing image import ImageDataGenerator load img img to
  • RBAC简介(*)

    一 RBAC是什么 1 RBAC模型概述 RBAC是Role Based Access Control的英文缩写 意思是 基于角色的访问控制 RBAC实际上就是针对产品去挖掘需求时所用到的Who 角色 What 拥有什么资源 How 有哪些
  • PYQT制作动态时钟

    所有代码 import sys from PyQt5 QtCore import Qt QTimer QRect from PyQt5 QtGui import QPixmap QTransform QPainter QImage from
  • android沉浸式状态栏以及状态栏颜色更改

    版本要求 沉浸式状态栏效果是在android 4 4的时候出现的 所以只有Android4 4及以后的版本才能使用沉浸式效果 实现方式 大体上可以分为两种思路 1 修改状态栏的颜色使之与标题栏的背景色保持一致 以达到沉浸式效果 2 修改状态
  • MongoDB 数据库创建删除、表(集合)创建删除、数据增删改查

    数据库使用 开启 mongodb 服务 要管理数据库 必须先开启服务 开启服务使用 mongod dbpath D mongodb 管理 mongodb 数据库 mongo 一定要在新的 cmd 中输入 清屏 cls 查看所有数据库列表 s
  • Java—面向对象——作用域

    一 基本使用 1 在java编程中 主要的变量就是属性 成员变量 和局部变量 2 局部变量一般是指在成员方法中定义的变量 3 java中作用域的分类 全局变量 也就是属性 作用域为整个类体 局部变量 也就是除了属性之外的其他变量 作用域为定
  • ES 搜索21 (function_score查询 关键字 functions 和 weight 滤集提升权重分)

    过滤集提升权重 回到 忽略 TF IDF 里处理过的问题 我们希望根据每个度假屋的特性数量来评分 当时我们希望能用缓存的过滤器来影响评分 现在 function score 查询正好可以完成这件事情 到目前为止 我们展现的都是为所有文档应用
  • kubesphere多集群管理,实现kubernetes多集群同时应用部署

    文章目录 一 kubesphere集群部署 1 准备环境 2 下载kubesphere安装工具KubeKey 3 准备集群部署配置文件 4 安装集群 5 验证安装 二 配置多集群 1 打开集群tower服务的nodeport端口 2 修改主
  • Jenkins:(看起来挺好看的)邮件模板样式

    Jenkins 邮件模板样式目录导航 邮件模板样式一 根据样式三改编 背景图自定义 邮件模板样式二 邮件模板样式三 邮件模板样式四 邮件模板样式一 根据样式三改编 背景图自定义
  • Linux上安装和使用Wireshark

    CentOS下安装Wireshark相当简单 两条命令就够了 这里 主要是记录写使用方面的东西 安装 1 yum install wireshark 注意这样并无法使用wireshark命令和图形界面 但提供了抓包基本功能 2 yum in
  • Dlib库中实现正脸人脸关键点(landmark)检测的测试代码

    Dlib库中提供了正脸人脸关键点检测的接口 这里参考dlib examples face landmark detection ex cpp中的代码 通过调用Dlib中的接口 实现正脸人脸关键点检测的测试代码 测试代码如下 referenc
  • 2014年1月14日星期二(DEMO7-2,加载3D线框立方体物体模型)

    上个DEMO 是渲染列表 这个DEMO 进行了加载PLG模型 仍然是一步步地进行 PLG模型首行包含了物体名称 顶点数和多边形数3部分组成 加载模型时可以每次读取一行 并对其中的数字进行分析 现在开始进行代码 先设置摄像机坐标和位置 朝向
  • 利用cin和cout完成信息的输入输出(TOZJ练习5681)

    项目场景 问题描述 在dev c 上运行正确 在TZOJ出现Presentation Error 答案和标准结果非常接近 在输出结果中 多了或少了不必要的空格或者回车或者其他 的代码 include
  • Java集合排序

    一 概述 1 集合排序概述 数组排序 int arr 1 2 3 Arrays sort arr 集合排序 使用Collections类中 sort 方法对List集合进行排序 sort List list 根据元素的自然顺序对指定列表按升
  • 基于内容的图像检索(CBIR) ——以图搜图

    文章目录 一 实现原理 二 基于内容的图像检索的特征提取 三 代码实现 打赏 在CBIR中 图像通过其视觉内容 例如颜色 纹理 形状 来索引 一 实现原理 首先从图像数据库中提取特征并存储它 然后我们计算与查询图像相关的特征 最后 我们检索
  • use MinGW compile googletest on windows

    table of contents enviornments brief description of software installation MinGW installation cmake installation googlete
  • word文档墨迹工具的笔不能用_CourseMaker微课制作教程43:手写设备在Word、PPT、PDF里的使用方法大全...

    首先我们要有个概念 手写设备 数位板 纸笔手写板 数位屏 在各个软件里能否书写 跟这些设备硬件本身并没有什么关系 不是说这个牌子的手写板在A软件里能用 那个牌子的手写板在A软件里不能用 能否在软件里手写 主要还是看软件里的手写功能组件是否完
  • linux驱动12:主设备号和次设备号

    dev目录下执行ls l 设备文件项的最后修改日期前的用逗号分割的两个数 对设备文件来说就是相应的主设备号和次设备号 第一个字符c表示字符设备 b表示块设备 主设备号标识设备对应的驱动程序 次设备号由内核使用 用于正确确定设备文件所指的设备