Linux驱动-应用层如何访问驱动层-以应用层open函数对应驱动层open函数为例

Linux驱动-应用层如何访问驱动层- 以应用层open函数对应驱动层open函数为例

在Linux系统中,应用层的open函数与驱动层的open函数之间的关联,与驱动模块的加载和设备节点的创建密切相关。

一、驱动模块的加载

  1. 驱动模块概述
    驱动模块是一个动态可加载的内核模块,它包含了设备特定的操作函数,包括open、read、write等。驱动模块的加载是设备与操作系统交互的第一步。

  2. 模块加载过程
    加载驱动模块通常涉及以下步骤:
    编译驱动模块:驱动程序代码被编译成一个.ko文件。
    加载驱动模块:使用insmod或modprobe命令将模块加载到内核中。在这个过程中,内核会调用驱动模块的初始化函数。
    示例:加载驱动模块

insmod my_driver.ko
  1. 注册设备
    在驱动模块加载过程中,驱动会注册设备,关联设备号和操作函数。以字符设备为例,注册过程通常包括以下内容:
    分配或指定主设备号:主设备号用于标识设备驱动。
    注册设备:通过register_chrdev函数,将主设备号与一个file_operations结构关联。
    示例:设备注册
#define MAJOR_NUM 240

static int __init my_driver_init(void) {
    int ret;
    ret = register_chrdev(MAJOR_NUM, "my_device", &fops);
    if (ret < 0) {
        printk(KERN_ALERT "Device registration failed\n");
        return ret;
    }
    printk(KERN_INFO "Device registered with major number %d\n", MAJOR_NUM);
    return 0;
}

在这里,register_chrdev函数注册了一个主设备号240,并将其与名为"my_device"的设备及其操作函数集fops关联。

  1. file_operations结构
    file_operations结构体包含了设备的各种操作函数,包括open函数。
    例如:
static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = my_driver_open,
    // 其他操作函数如 read, write 等
};

当驱动模块注册时,这个结构体将被内核用于管理设备的各种操作。

二、创建设备节点

  1. 设备节点概述
    设备节点是位于/dev目录下的特殊文件,用户态程序通过它们访问设备。设备节点包含主设备号和次设备号,用于映射到内核中的设备驱动。

  2. 设备节点创建
    设备节点可以通过以下方式创建:
    手动创建:使用mknod命令创建设备节点。
    自动创建:通过udev等设备管理服务自动创建。
    示例:手动创建设备节点

mknod /dev/my_device c 240 0

这条命令创建了一个名为/dev/my_device的字符设备节点,其主设备号为240,次设备号为0。

  1. 设备节点的作用
    设备节点的主设备号和次设备号用于在内核中定位到对应的驱动程序。主设备号标识设备类型和对应的驱动程序,而次设备号用于区分同一类型的多个设备实例。

三、应用层的open调用

  1. 用户态调用open
    当应用程序调用open(“/dev/my_device”, O_RDWR)时,系统调用从用户态切换到内核态,具体流程如下:
    用户态的open调用进入标准C库(glibc)的open函数。
    标准库函数通过系统调用sys_open将请求传递到内核。
  2. 内核处理系统调用
    在内核中,sys_open函数负责处理open请求:路径解析:内核解析传入的文件路径(例如/dev/my_device)。
    查找设备节点:内核找到与该路径对应的设备节点,并读取其主设备号和次设备号。(之前通过mknod /dev/my_device c 240 0创建过设备节点,所以可以顺利读取到)
  3. 查找对应的驱动
    内核使用设备节点的主设备号找到对应的驱动程序:
    定位驱动程序:通过设备号查找在驱动加载时注册的设备和其file_operations结构。(在insmod加载驱动时,会调用__init初始化函数,这个函数里面包含了注册设备,将设备号与一个file_operations结构关联)
    调用驱动的open函数:找到驱动的file_operations结构后,内核调用其中的open函数。
  4. 驱动层的open函数
    驱动层的open函数在file_operations结构中定义。例如:
static int my_driver_open(struct inode *inode, struct file *file) {
    printk(KERN_INFO "My driver open function called\n");
    return 0; // 成功
}

static struct file_operations fops = {
    .owner = THIS_MODULE,
    .open = my_driver_open,
    // 其他操作函数
};

当内核调用驱动层的open函数时,它实际上调用了my_driver_open函数。

四、流程图

应用层:
  open("/dev/my_device") ----> 标准库 (glibc)

内核态:
  sys_open() ----> 路径解析 /dev/my_device
                  ----> 查找设备节点 (主设备号 240, 次设备号 0)
                  ----> 根据主设备号找到对应的驱动
                  ----> 调用驱动的 file_operations.open (my_driver_open)
驱动层:
  my_driver_open()

通过上述机制,Linux系统成功将用户态的open调用映射到驱动层的open函数,实现了设备的访问和操作。这一切依赖于驱动模块的正确加载和设备节点的准确创建。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows server 2016.2019 .NET Framework 3.5安装包、安装步骤

windows server2019 操作系统 安装 sqlserver2008时提示缺少 .NET Frameword 3.5&#xff0c; 在功能里选择 .NET Frameword 3.5安装报错&#xff0c; 下载安装包&#xff0c;下载地址 https://download.csdn.net/download/qq445829096/89450429这里指定备份源路径 安装包解…

多供应商食品零售商城系统的会员营销设计和实现

在多供应商食品零售商城系统中&#xff0c;会员营销是提升用户粘性和增加销售的重要手段。一个有效的会员营销系统能够帮助平台更好地了解用户需求&#xff0c;提供个性化服务&#xff0c;进而提高用户满意度和忠诚度。本文将详细探讨多供应商食品零售商城系统的会员营销设计与…

2毛钱不到的2A同步降压DCDC电压6V频率1.5MHz电感2.2uH封装SOT23-5芯片MT3520B

前言 2A&#xff0c;2.3V-6V输入&#xff0c;1.5MHz 同步降压转换器&#xff0c;批量价格约0.18元 MT3520B 封装SOT23-5 丝印AS20B5 特征 高效率&#xff1a;高达 96% 1.5MHz恒定频率操作 2A 输出电流 无需肖特基二极管 2.3V至6V输入电压范围 输出电压低至 0.6V PFM 模式可在…

MySQL进阶-索引-使用规则-索引失效情况一(索引列运算,字符串不加引号,头部模糊匹配)

文章目录 1、索引列运算1.1、查询表tb_user1.2、查看tb_user的索引1.3、查询 phone177999900151.4、执行计划 phone177999900151.5、查询 substring(phone,10,2) 151.6、执行计划 substring(phone,10,2) 15 2、字符串不加引号2.1、查询 phone177999900152.2、执行计划 phone177…

JAVA-矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 思路&#xff1a; 找到0的位置&#xff0c;把0出现的数组的其他值夜置为0 需要额外空间方法&#xff1a; 1、定义两个布尔数组标记二维数组中行和列…

axios之CancelToken取消请求

从 v0.22.0 开始&#xff0c;Axios 支持以 fetch API 方式—— AbortController 取消请求 此 API 从 v0.22.0 开始已被弃用&#xff0c;不应在新项目中使用 官网链接 1. 背景 最近项目中遇到一个场景&#xff0c;当连续触发一个请求时&#xff0c;如果是同一个接口&#xf…

【仿真建模-anylogic】开发规范

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-28 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 0. 说明 实际模型开发过程中&#xff0c;对遇到的问题进行总结归纳出以下开发规范&#xff0c;仅供参考&#xff01; 1. 强制性规范 1…

加密与安全_Java 加密体系 (JCA) 和 常用的开源密码库

文章目录 Java Cryptography Architecture (JCA)开源国密库国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; 在线生成公钥私钥对&#xff0c;RSA公私钥生成参考…

单目操作符

目录 ! --- 逻辑反操作 & --- 取地址操作符 * --- 间接访问操作符&#xff08;解引用操作符&#xff09; sizeof --- 操作数的类型长度&#xff08;单位为字节&#xff09; ~ --- 对一个数的补码二进制按位取反 前置和前置-- 后置和后置-- (类型) --- 强制类型转换…

《GPT模型揭秘:数据驱动AI的核心概念与GPT系列对比分析》

DS&#xff1a;《What Are the Data-Centric AI Concepts behind GPT Models?通过三个数据为中心的人工智能目标(训练数据开发、推理数据开发和数据维护)揭示GPT模型背后的数据为中心的人工智能概念》解读—GPT-1/GPT-2/GPT-3系列对比(语料大小参数量解码层数上下文长度隐藏层…

RabbitMQ中java实现队列和交换机的声明

java实现队列和交换机的声明 在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时&#xff0c;队列和交换机是程序员定义的&#xff0c;将来项目上线&#xff0c;又要交给运维去创建。那么程序员就需要把程序中运行的所有队列和交换机都写下来&#xff0c;…

重塑客户体验!VoLTE、VoNR引领新时代企业服务变革

试想一下&#xff0c;当你拨打客服咨询或售后电话时&#xff0c;没有漫长的等待&#xff0c;瞬时在手机中看到清晰的客服人员的脸&#xff0c;你说一句&#xff0c;ta说一句&#xff0c;你们流畅的沟通&#xff0c;仿佛线下面对面交流…… 这是VoLTE&#xff08;Voice over LT…

微服务部署上线过程总结

目录 一、找到适合自己的部署方式 二、开始部署&#xff0c;先安装需要的环境 2.1 梳理一下都需要安装什么软件 2.2 配置数据库环境 2.3 配置redis 2.4 配置nacos 2.5 配置rabbitmq 2.6 配置docker环境 三、环境配置好了&#xff0c;开始部署后端 3.1 梳理后端都…

Vue3学习笔记<->nginx部署vue项目(3)

安装nginx vue项目通常部署到nginx上&#xff0c;所以先安装一个nginx。为了方便安装的是windows版nginx&#xff0c;解压就能用。 项目参考上一篇文章《Vue3学习笔记&#xff1c;-&#xff1e;创建第一个vue项目》《Vue3学习笔记&#xff1c;-&#xff1e;创建第一个vue项目》…

微信视频号里面的视频怎么下载,分享4个视频号视频下载方法!可长期使用

如何在微信视频号里下载视频,虽然互联网上微信视频号视频下载方法千千万&#xff0c;奈何总有一些方法不起任何作用. 如何解决这一问题&#xff0c;今天就分享3个可以下载微信视频号的视频方法仅供参考。 1:提取器助手 手机搜索提取器助收/扫码获取视频号下载小助手二维码。该…

unity VR Interaction Framework 创建新手势

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、新建物体&#xff0c;并添加必要组件二、添加抓取点三、查看手势的可视化样式四、制作新的手势1.点击编辑2.根据需求调节手指关节3.保存手势4. 使用创建的手势5.运行 总结 前言…

LangGPT:高质量提示词框架

题目&#xff1a;LangGPT: Rethinking Structured Reusable Prompt Design Framework for LLMs from the Programming Language作者: Ming Wang; Yuanzhong Liu; Xiaoming Zhang; Songlian Li; Yijie Huang; Chi Zhang; Daling Wang; Shi Feng; Jigang LiDOI: 10.48550/arXiv.2…

阿里云 CosyVoice 语音合成大模型 API 实践

前言 最近大模型这么火&#xff0c;就想着玩一下&#xff0c;作为非 AI 从业者&#xff0c;最好的方式就是调用云服务的 API 来构建自己的 AI 应用。首选当然是国外的 ChatGPT API&#xff0c;但是说实话那个玩意有点贵&#xff0c;而且最近国内也被封禁不让调用了&#xff0c…

docker-本地部署-后端

前置条件 后端文件 这边是一个简单项目的后端文件目录 docker服务 镜像文件打包 #命令行 docker build -t author/chatgpt-ai-app:1.0 -f ./Dockerfile .红框是docker所在文件夹 author&#xff1a;docker用户名chatgpt-ai-app&#xff1a;打包的镜像文件名字:1.0 &#…

事务的特性-原子性(Atomicity)、一致性(Consistency)、隔离性(Asolation)、持久性(Durability)

一、引言 1、数据库管理系统DBMS为保证定义的事务是一个逻辑工作单元&#xff0c;达到引入事务的目的&#xff0c;实现的事务机制要保证事务具有原子性、一致性、隔离性和持久性&#xff0c;事务的这四个特性也统称为事务的ACID特性 2、当事务保持了ACID特性&#xff0c;才能…