Linux驱动中的open函数是如何从软件打通硬件呢?
一、前言
打开文件是Linux系统中最基本的操作之一,open函数可以实现打开文件的功能。下面我将为您介绍open函数打通上层到底层硬件的详细过程。
二、open函数打通软硬件介绍
open函数是系统调用中的一种,其原型定义在头文件unistd.h中:
#include <unistd.h>int open(const char *pathname, int flags, mode_t mode);
其中,pathname参数是要打开的文件名,flags参数是打开文件时的标志,mode参数是文件的访问权限。
当应用程序调用open函数时,该函数首先会在内存中创建一个file结构体,这个结构体表示应用程序和文件之间的连接,其中包含了文件的各种属性,例如文件类型、文件访问权限、文件长度等等。这个file结构体通常被称为文件句柄(file handle)或文件描述符(file descriptor),用一个整数来表示,该整数被赋予一个非负值。
接着,open函数会调用文件系统的VFS(Virtual File System)层,VFS层是Linux文件系统的核心部分,其作用是将文件系统的各种实现细节隐藏起来,为上层应用程序提供一个统一的接口。VFS层通过查找文件系统的超级块(super block)来确定文件的类型和位置,并找到相应的文件系统对象(inode)。
VFS层在找到文件系统对象后,会通过驱动程序中的文件操作函数(file operations)实现文件的打开操作,这些函数通常包括open、read、write、lseek、ioctl等等。驱动程序的文件操作函数被定义在一个结构体中,这个结构体通常被称为file_operations结构体,其中包含了驱动程序中实现的各种文件操作函数指针。

三、驱动中的open函数
在驱动程序中,实现文件打开操作的函数通常是open函数,该函数的原型定义在头文件linux/fs.h中:
int (*open) (struct inode *, struct file *);
open函数中的第一个参数是文件系统对象(inode),第二个参数是文件句柄(file)。
当驱动程序的open函数被调用时,它会根据文件句柄中保存的文件属性和访问标志(flags),确定文件打开的方式,例如只读、只写、读写等。接着,它会通过一系列的操作,将文件和硬件设备打通。
具体来说,打开文件时,驱动程序的open函数会调用底层设备驱动程序的probe函数,probe函数会根据设备的硬件类型和地址,初始化硬件设备并建立驱动程序和设备之间的联系。在这个过程中,驱动程序需要完成一系列的操作,例如打开设备的总线、寻找设备、初始化设备、注册设备等等。
在设备驱动程序和硬件设备之间建立联系后,驱动程序就可以通过访问设备寄存器、执行设备指令等方式,向硬件设备发送各种命令,从而实现对设备的控制和访问。
当应用程序通过调用read、write、ioctl等函数来读写文件时,这些函数实际上是通过调用驱动程序中的read、write、ioctl等操作函数来实现的。驱动程序中的这些操作函数会将数据从应用程序空间拷贝到内核空间,再将数据从内核空间拷贝到硬件设备的寄存器中,实现数据的传输和处理。
当应用程序调用close函数来关闭文件时,系统会调用驱动程序中的release函数来释放文件所占用的资源。release函数通常用来做一些清理工作,例如关闭设备、释放内存等等。
open函数是打通上层应用程序和底层硬件设备的关键,它通过调用文件系统、VFS层、设备驱动程序等一系列操作,将应用程序和硬件设备连接起来,实现对硬件设备的控制和访问。因此,对于Linux驱动开发工程师来说,深入理解open函数的实现原理和内部机制是非常重要的。
四、举个例子
下面我将以控制GPIO为例,介绍open函数在其中的作用。
GPIO(General Purpose Input/Output)是一种通用的输入输出引脚,可以通过编程控制来实现对外部设备的控制和交互。在Linux系统中,GPIO的控制通常是通过设备驱动程序来实现的,该驱动程序会提供open、read、write、ioctl等函数,用于与用户空间的应用程序进行交互。
在控制GPIO的程序中,通常需要先打开GPIO设备,然后才能进行后续的读写操作。当调用open函数打开GPIO设备时,系统会自动调用GPIO设备的设备驱动程序的open函数。在open函数中,设备驱动程序会根据传入的参数,确定GPIO设备的状态和属性,并将其初始化。
接着,设备驱动程序会调用内核中的GPIO子系统,通过GPIO子系统来访问硬件设备,例如读取GPIO的电平状态、设置GPIO的电平状态等等。GPIO子系统会负责将内核空间的数据转换为硬件所需的信号,实现对GPIO的控制。
当应用程序需要对GPIO进行读写操作时,会调用设备驱动程序中的read、write函数。在read函数中,设备驱动程序会通过GPIO子系统读取GPIO的电平状态,并将其返回给应用程序;在write函数中,设备驱动程序会通过GPIO子系统设置GPIO的电平状态,实现对GPIO的控制。
最后,当应用程序关闭GPIO设备时,会调用设备驱动程序中的release函数,该函数会负责释放GPIO设备所占用的资源,并将GPIO设备关闭。
综上所述,open函数在控制GPIO的程序中起到了连接应用程序和底层硬件设备的作用,它通过调用设备驱动程序的open函数和内核中的GPIO子系统,将应用程序和GPIO设备连接起来,实现对GPIO的控制和访问。
🔞🔞🔞另外从今天开始我将持续更新 Linux驱动开发100问 专题,感兴趣的大家可以持续关注。
相关文章:
Linux驱动中的open函数是如何从软件打通硬件呢?
一、前言 打开文件是Linux系统中最基本的操作之一,open函数可以实现打开文件的功能。下面我将为您介绍open函数打通上层到底层硬件的详细过程。 二、open函数打通软硬件介绍 open函数是系统调用中的一种,其原型定义在头文件unistd.h中: #…...
Java 基础语法
Java 是一门广泛使用的编程语言,由于其简单易学和可移植性,已成为开发 Web 应用程序、移动应用程序、桌面应用程序以及企业级应用程序的首选语言之一。在本文中,我们将探讨 Java 的基础语法,包括变量、数据类型、运算符、控制流等…...
python下如何安装并使用matplotlib(画图模块)
在搜索命令中输入cmd,以管理员身份运行。 输入以下命令,先对pip安装工具进行升级 pip install --upgrade pip 升级完成 之后使用pip安装matplotlib pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple 也可以使用pycharm来安装matp…...
系统分析师---计算机网络思维导图
TCP、IP协议簇(4星) 传输协议:TCP有连接、可靠、有回应机制、三次握手基于TCP的应用层协议:POP3:邮件收取,默认端口110SMTP:邮件发送,默认端口25FTP:文件传输协议&#…...
算法练习(七)数据分类处理
一、数据分类处理 1、题目描述: 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码、 QQ 用户、手机号码、银行帐号等信息及活动记录。采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出…...
nohup ./startWebLogic.sh >out.log 2>1 解析
在启动weblogic的时候我们经常看到如下的命令: nohup ./startWebLogic.sh >out.log 2>&1 & 从09年开始用weblogic到现在已经过去3年多了 ,今天终于将该命令理解清楚了。 其中 0、1、2分别代表如下含义: 0 – stdin (standa…...
OpenCV 坡度计算(基于DEM,C++版本)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 假设一个点位于曲面 z = f ( x , y ) z=f(x,y) z=...
IDEA上使用git,知道这几步操作就够了!
前言由于一年多没用git(种种原因不堪回首),所以在上班当天,整个人都不好了,从拉取代码到提交代码,整整花费了不少时间,而且有些操作都不知道啥作用,点也不是,不点也不是&…...
Shell的退出状态(if语句判断的是某个命令的退出状态)
以下内容源于C语言中文网的学习与整理,如有侵权,请告知删除。 一、退出状态 (1)不管是 Bash 内置命令,还是外部的 Linux 命令,还是自定义的 Shell 函数,当它运行结束或者退出时,都…...
Scala面向对象
与java的区别和联系 类的定义: class Person{ var name "scala" def sayHello(){ println("Hello,"name) } def getName name } 注意:如果在定义方法的时候指定了(),那么在调用的时候()可写可不写,如果在定…...
LLaMA-META发布单卡就能跑的大模型
2023年2月25日,Meta使用2048张A100 GPU,花费21天训练的Transformer大模型LLaMA开源了。 1.4T tokenstakes approximately 21 days 以下是觉得论文中重要的一些要点 1)相对较小的模型也可以获得不错的性能 研究者发现在给定计算能力限制的情…...
第一篇自我介绍(单片机)
小白的单片机之旅 🤔自我介绍🤔 😊学习目标😊 😜关于单片机😜 🌝目标公司🌝 🍀小结🍀 🎉博客主页:小智_x0___0x_ 🎉欢…...
Tik Tok品牌营销,如何做好内容打法
TikTok 上做好品牌营销,并不能只关注品牌所获得的视频浏览量和点赞量,根据潜在客户需求生成的内容策略同样至关重要。通过建立营销漏斗模型,可以将 TikTok 策略分为三种不同类型的内容,从具有广泛吸引力的内容转变为具有高度针对性…...
2023年5月软考软件设计师备考经验
一、考试目标: 通过本考试的合格人员能根据软件开发项目管理和软件工程的要求,按照系统总体设计规格说明书进行软件设计,编写程序设计规格说明书等相应的文档,组织和指导程序员编写、调试程序,并对软件进行优化和集成…...
SpringBoot 2.x ——使用 mail 实现邮件发送
文章目录前言环境、版本等pom依赖引入springboot项目配置文件获取邮箱授权码配置properties文件定义接口信息接收类编写邮件发送服务类编写接口swagger测试1、简单邮件发送2、html格式发送(支持附件)前言 最近再看xxl-job的源码,其中在邮件告警通知中使用到了告警信…...
项目结束先别着急庆祝,项目经理还有这些事要做
项目管理生命周期结束阶段的目的是确认项目可交付成果的完成,使项目发起人满意,并向所有参与者和利益相关者传达项目的最终处置和状态。 项目结束确保项目的所有参与者和利益相关者都清楚后续活动(如新项目、服务过渡、SLA等)&a…...
没想到的 IIFE
没想到的 IIFE 有时候我们想要立即执行一下所定义的函数,可以怎么做呢? function foo(num) {return num ?? 1; }foo();写完然后调用对吧,这是可以的,但你有没有觉得这其实有点脱裤子放屁了,完全可以直接调用就是了…...
「牛客网C」初学者入门训练BC156
🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️🔥专栏系列:线性代数,C初学者入门训练 🔥座右铭:“不要等到什么都没有了,才下定决心去做” 🚀🚀🚀大家觉不错…...
【Proteus仿真】【STM32单片机】粮仓温湿度控制系统设计
文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用声光报警模块、LCD1602显示模块、DHT11温湿度模块、继电器模块、加热加湿除湿风扇等。 主要功能: 系统运行后,LCD1602显示…...
九年时间,倾情投入,JumpServer开源堡垒机v3.0正式发布
2023年2月27日,JumpServer开源堡垒机正式发布v3.0版本。在JumpServer开源堡垒机v3.0版本的设计过程中,我们始终秉持着“内外兼修”的原则,旨在进一步提升用户的使用体验,真正用心做好一款开源堡垒机。 在JumpServer v3.0版本中&…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
微服务商城-商品微服务
数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
