从系统调用到设备驱动:详解open、syscall_open和drv_open

【信息科学与工程学】【产品体系】计算机科学与自动化——第一百八十九篇 操作系统内核(微内核/宏内核)函数与算法02 宏内核(Linux)更多典型内核函数/算法,从编号271开始,覆盖中断管理、热插拔、PCI、ACPI、固件、崩溃转储、kexec、休眠、watchdog、RTC、hwmon、LED、backlight、input子系统、remoteproc等更多领域。编号类型领域内核类型内核中的函数/算法/模块/模组模块的调用关系模块/函数/算法逐步推理思考的数学表达式及参数列表及参数数值设计模块的C/C++/其他代码关联知识271中断管理中断描述符宏内核 / (中断子系统核心)驱动申请中断 → → → 分配irq_ 阅读详情
open系统调用、syscall_open函数和drv_open函数之间的联系和区别
  1. open 系统调用:

    • 角色:用户空间的系统调用接口,用于打开文件或设备。

    • 作用:这是用户程序用来请求打开文件的接口。用户程序通过调用 open 系统调用(如 open("/dev/mydevice", O_RDWR))来打开文件或设备,获取一个文件描述符。

    • 实现:open 系统调用在用户空间的C标准库(如 glibc)中实现,会触发内核中的相应处理函数陷入内核空间,最终调用具体的文件或设备驱动程序的 open 实现。

    • 示例:

      int fd = open("/dev/my_device", O_RDWR);
      
  2. syscall_open 函数:

    • 角色:位于内核空间,是内核中的系统调用处理函数,是 open 系统调用在内核中的实现。

    • 作用:syscall_open 是内核处理 open 系统调用的入口点。它负责解析用户空间传入的参数(如文件路径、打开标志等),并调用与文件或设备关联的 file_operations 结构体中具体的驱动程序的 open 方法,即 drv_open来打开文件。

    • 实现:syscall_open 通常由内核开发者实现,是内核的一个内部函数。

    • 示例:

      // 内核中系统调用处理函数的简化示例
      long sys_open(const char __user *filename, int flags, umode_t mode) {
          // 查找文件路径,获取 inode 和 file 结构体
          struct file *filp = do_filp_open(AT_FDCWD, filename, flags);
          // 调用文件的 open 方法
          return finish_open(filp, NULL, O_RDWR);c
      }
  3. drv_open 函数:

    • 角色:drv_open 位于具体的设备驱动程序代码中,是设备驱动程序中的具体实现函数,是 file_operations 结构体中的一个函数指针。

    • 作用:drv_open 是具体设备驱动程序实现的 open 方法。它执行与设备打开相关的具体操作,如初始化设备、分配资源等。

    • 实现:drv_open 由设备驱动开发者实现,作为 file_operations 结构体中的 open 方法,主要功能是执行设备特定的操作,如初始化硬件、分配设备资源、设置设备状态等。

    • 示例:

      // 设备驱动程序中的 open 方法实现
      static int drv_open(struct inode *inode, struct file *filp) {
          // 设备特定的初始化操作
          printk(KERN_INFO "Device opened\n");
          return 0;
      }
      ​
      static const struct file_operations my_fops = {
          .owner = THIS_MODULE,
          .open = drv_open,
          // 其他操作函数
      };

之间的联系和流程

  1. 用户空间调用 open 系统调用:

    • 用户空间的应用程序通过调用 open 系统调用请求打开一个文件或设备。

  2. 进入内核空间,调用 syscall_open:

    • 系统调用机制将控制权转交给内核,进入 syscall_open 函数(具体名称和实现可能因内核版本不同而有所不同)。

  3. 内核找到对应的文件系统操作方法:

    • syscall_open 通过文件路径找到对应的 inode 结构体,从而找到与该文件或设备相关的 struct file_operations 结构体。

  4. 调用驱动程序的 open 方法(drv_open):

    • 内核通过 file_operations 结构体中的 open 方法指针,调用具体驱动程序实现的 drv_open 函数。

    • drv_open 执行设备特定的打开操作,如硬件初始化、资源分配等。

函数实现的伪代码

syscall_open函数实现的伪代码:

int syscall_open(const char *filename,int flag)
{
    dev_t devno;
    struct inode *pnode = NULL;
    struct cdev *pcdev = NULL;
    struct file *pfile = NULL;
    int fd = -1;
    
    /*根据filename在内核中查找该文件对应的struct inode对象地址
        找到则pnode指向该对象
        未找到则创建新的struct inode对象,pnode指向该对象,并从文件系统中读取文件的元信息到该对象*/
    if(/*未找到对应的struct inode对象*/)
    {/*根据文件种类决定如何进行下面的操作,如果是字符设备则执行如下操作*/
    
        /*从pnode指向对象中得到设备号*/
        devno = pnode->i_rdev;
    
        /*用devno在字符设备链表查找对应节点,并将该节点的地址赋值给pcdev*/
    
        /*pcdev赋值给pnode的i_cdev成员*/
        pnode->i_cdev = pcdev;
    }
    
    /*创建struct file对象,并将该对象的地址赋值给pfile*/
    
    pfile->f_op = pnode->i_cdev->ops;
    pfile->f_flags = flag;
    
    /*调用驱动程序的open函数*/
    pfile->f_op->open(pnode,pfile,flag);
    
    /*将struct file对象地址填入进程的描述符数组,得到对应位置的下标赋值给fd*/
    
    return fd;
}
【信息科学与工程学】计算机科学与自动化——第五十一篇 Linux内核函数算法与依赖关系 函数名称算法表达式/方程名称方程表达参数列表软件依赖硬件依赖应用场景时间复杂度空间复杂度​进程调度决策算法P:进程集合t:时间w_i:权重cpu:CPU1. 定时器中断2. 进程状态机3. 负载均衡4. 上下文切换协议1. 时间戳计数器2. 缓存层次3. 中断控制器4. TLB刷新进程调度O(log n)O(k)​进程创建算法clone_flags:克隆标志1. 命名空间时序2. 资源计费3. 信号处理4. 调度器激活。 阅读详情

相关推荐

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5480

npm ERR! code ENOENT npm ERR! syscall open 错误解决

启动myvue时,新手常犯错 E:\Web学习\idea\vue>npm run dev npm ERR! code ENOENT npm ERR! syscall open npm ERR! path E:\Web学习\idea\vue\package.json npm ERR! errno -4058 npm ERR! enoent ENOENT: no such file or directory, open 'E:\Web学习\idea\vue\package.json' npm ERR! e

Sticker的博客 14万+

TruckSim与Simulink联合仿真中的车轮转角精确控制策略

本文深入探讨了TruckSim与Simulink联合仿真中实现车轮转角精确控制的关键策略。针对多轴车辆路径跟踪时转角指令失灵的常见问题,核心在于正确配置TruckSim转向轴的外部输入模式(Advanced Settings),并确保仿真接口的稳定搭建。文章详细解析了从单轴到多轴协同转向的配置方法,并提供了提升MPC路径跟踪精度的实战技巧与调试经验。

weixin_29035147的博客 367

初学者 Vue 安装 学习

参考网上内容,边学习边把一些知识记录下来希望自己能够记忆深刻,有更加深刻的理解、 什么是Vuejs Vue.js 是一套构建用户界面的渐进式框架。Vue 只关注视图层, 采用自底向上增量开发的设计。 Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。 什么是nodejs 是一个前端框架,一个基于 Chrome V8 引擎的JavaScript运行环境,一个......

a12hhhe的博客 860

FreeRTOS-Plus-CLI使用笔记

FreeRTOS-Plus-CLI使用笔记 一、简介 详细介绍可参考FreeRTOS-Plus-CLI官网地址入口 FreeRTOS+CLI(Command Line Interface, 命令行接口)提供了一种简单、小型、可扩展且RAM高效的方法,使FreeRTOS应用程序能够处理命令行输入。添加一条指令的步骤如下: 提供一个实现命令功能的函数 将命令映射到该功能函数 注册命令 运行命令解释器 命令行调试接口对于排查分析出现的问题提供了很好的接口,可以通过查看传感器信息判断传感器是否正常,可以查看内置

ApexYuan 6964

深信服 SANGFOR 设备密码恢复和配置备份恢复

、恢复密码 当我们拿到一台设备要去配置管理的时候,首先是要确认设备的登录IP,其次就是确认设备控制台登录密码。不知情的情况下如何找到设备的登录IP,请参考文档: http://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=9484 下文中提到的关于“网关升级客户端”的一些功能,也请参考此文档。 那么恢复密码,大家都知道有2种方法:U盘恢复密码、交叉线恢复密码。 1、U盘恢复密码 注意:仅恢复admin密码,不影响配置。 U盘恢复密码的前

李先生在闯荡江湖 1万+

syscall open

/*******************************************************************************/ SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode) {     long ret;     if (force_o_

u011279649的专栏 2731

ESD放电模式以及电源箝位 (power clamp )电路

由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工由于ESD电压具有很快的上升速度(其ESD脉冲上升时间约在10ns左右),Vrc端的电压因为RC延迟效应无法跟得上VDD端的ESD电压上升速度,Vrc端的为低电位导致反相器工作将输出端Vout电压上拉到高电位。从而Vg端的高电位触发导通了NMOS元件(Mesd)的晶体管,因而ESD电流便经由Mesd而泄放掉。由于晶体管Mesd的栅极导通

DOG_BITE_DOG的博客 2万+

文件操作——系统调用函数open函数(含文件描述符介绍)

C/C++向文件写入,先调用接口函数 ——> 系统调用函数 ——>进入OS ——> 从磁盘中读取文件,这里主要介绍系统调用函数open函数

challenglistic的博客 6897

SIMetrix教程-001.SIMetrix软件简介与安装

  由于某些原因需要用到SIMetrix仿真软件,然而网上的资料并不是特别多,故在此记录一下这款仿真软件的学习过程,也给有需要的人提供一些参考,免走弯路。如果使用过Pspice或者LTspice软件,学习SIMetrix会很容易入门,仿真软件都是大同小异的,会一样后都可以快速入门其他软件。   SIMetrix是一款以SPICE模型为基础的仿真软件,集成了SIMetrix和SIMPLIS两款内核,为工程师提供了可靠的、易于使用的、并完美结合了速度与精度的电路仿真方式。官方的话不多说,和LTspice一样,优

gaoyong_wang的博客 2万+

Sigrity System SI SerialLink模式进行Pcie3协议仿真分析操作指导-pcie3_client_single_pre

Sigrity System SI SerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需要检查的项目,通过协议分析视为满足设计要求,下面介绍pcie3_client_single_pre仿真分析,具体操作如下。Random(Rj):随机抖动,该抖动用高斯概率分布来描述,通常是由热噪声和其它随机噪声引起的,默认为1.24%UI RMS(平均值),即和标准值的偏差为1.24%UI。

weixin_54787054的博客 598

系统调用-open(一)

以什么样的方式打开文件,为O_RDONLY​​​、O_WRONLY​​​、​​O_RDWR​三者之一,是互斥的、不能同时存在;所以内核钩子中可以用if((flags & O_ACCMODE) == O_RDONLY) //判断是否以只读的方式打开,其中#define O_ACCMODE 3、 #define O_RDONLY 0、 #define O_WRONLY 1、#define O_RDWR 2。S_IRUSER或S_IREAD(00400权限),代表该文件所有者具有可读的权限;

u013237642的博客 1185

基于深度学习的行人车辆检测与计数系统(UI界面+YOLOv8/v7/v6/v5代码+训练数据集)

从YOLOv1到最新的YOLOv8,其网络结构、训练策略和损失函数不断优化,性能持续提升。image_path, _ = QFileDialog.getOpenFileName(self, "选择图片文件", "", "Image Files (*.jpg *.png *.jpeg *.bmp)")video_path, _ = QFileDialog.getOpenFileName(self, "选择视频文件", "", "Video Files (*.mp4 *.avi *.mov *.mkv)")

YOLO 225

37.Linux驱动调试-根据oops的栈信息,确定函数调用过程 ---- Good

come from :https://www.cnblogs.com/lifexy/p/8011966.html 在上章里,我们分析了oops的PC值在哪个函数出错的 本章便通过栈信息来分析函数调用过程 1.上章的oops栈信息如下图所示: 9fe0:代表最初的栈顶SP寄存器位置 9e80:代表函数出错的SP寄存器位置 2.我们先来分析上图的栈信息,又是怎样的过程呢? ...

zmjames2000 Just record 340

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

PlayIntegrityFix 完整指南:Root 安卓设备快速恢复 Play Integrity 设备认证(附安装步骤与排障)

PlayIntegrityFix 是一个 Zygisk 模块,用于在已 Root 的安卓设备上把 Play Integrity(含 SafetyNet)的设备认证结果恢复到普通设备水平,官方支持 Android 8 至 15(当前版本 v19.1)。本文面向已解锁 bootloader、拿到 root、且银行/流媒体等强校验应用无法正常使用的进阶用户。 ## 对号入座:先判断你是否需要装 Pla

gitblog_00145的博客 975

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

OS67:从零开始构建类Unix玩具内核的完整指南

想要深入了解操作系统内核的工作原理吗?OS67作为一个基于x86架构的类Unix玩具内核项目,为你提供了一个绝佳的学习平台。这个开源项目完整实现了进程管理、文件系统、内存管理等核心功能,是学习操作系统开发的终极实践教程。 ## 什么是OS67?为什么值得学习? 🔍 OS67是一个完整的类Unix玩具内核,它不仅仅是一个演示项目,而是一个功能完备的操作系统内核实现。通过学习OS67,你可以深入

gitblog_00633的博客 428

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Linux 驱动研究 —— SPI (4)

在 Linux 内核开发中,理解数据如何在不同层级间“流动”是掌握驱动架构的关键。本文通过埋点追踪与源码剖析,系统梳理了从用户空间到硬件总线的完整数据链路,揭示了驱动开发中的“黑盒”逻辑。

kdxiaojie的博客 272

【信息科学与工程学】计算机科学与自动化——第一百三十四篇 编程语言篇 系列八 Erlang语言01

编号机制/用法编译器(底层实现·说明·缺陷·缺陷解决方案(含数学方程式描述与数学建模))引入版本国产化·信创·商用的CPU/GPU/ASIC/NP/DPU/其他硬件1轻量级进程模型底层实现:BEAM虚拟机使用预分配进程控制块(PCB),每个进程拥有独立堆栈和堆,通过减少指令计数器(reductions)实现协作式抢占调度。 说明:进程创建开销极小(约300字节省),支持百万级并发。 缺陷:大量进程间频繁上下文切换导致调度器缓存污染,降低局部性。 缺陷解决方案:采用多级反馈队列调度,将进程按

weixin_49199313的博客 875

note

CPU,此处CPU与BL芯片断开,没有连背光芯片。屏,此处屏与BL芯片断开,没有连背光芯片。虽然signal函数更简单些。行 3744: 07-22 23:56:01.139 <6>[ 5.577037][ T919] [2024:07:22 15:55:51](7)[919:modprobe][drm] [lcdkit /I]: type:66, name:[qcom,mdss-dsi-apl-bl-mode-off-command], length:16, pkt-count=1。

m0_73462935的博客 10万+

python读取指定行日志_python 截取某一天的日志,简单操作

1、解释大神之作,致敬“种心收默”(http://www.cnblogs.com/drgcaosheng/p/3747820.html)#!/usr/bin/python#-*- coding:utf-8 -*-import re,sysdef openfile(*args):print argstry:f=open(args[0],'r') #args[0]表示要打开的文件,第一个参数下标的...

weixin_39821718的博客 351

npm ERR! code ENOENT npm ERR! syscall open的解决方法

在创建多模块项目后,添加完测试语句进行npm start 但是在控制台处报错npm ERR! code ENOENT npm ERR! syscall open 解决方式有两个: 开始的时候我发现WebStorm中的控制台的目录是我项目目录的上一级,所以想到用cmd来打开项目,后来发现原来我打开的目录是项目的上一级文件夹,所以退出重新从项目根目录中进入,问题解决 ...

weixin_44051236的博客 5万+

【Linux系统】系统调用 open 的解析与使用

本文讲解系统调用的各个参数的使用与设置:flag的类型认识,flag位图的使用、默认权限mode的设置、权限掩码umask的设置,设计自己的touch命令

从不依靠,从不寻找,非常沉默,非常骄傲。 你必须非常努力,才能看起来毫不费力。 2013

Error: ENOENT: no such file or directory,errno: -4058, code: ‘ENOENT‘, syscall: ‘open‘

Node.js执行时会以终端所在的文件夹作为相对路径,去拼接代码中的路径使用,所以导致找不到目标文件。运行项目报错找不到路径。

weixin_56525912的博客 1048

系统调用open函数

【代码】系统调用open函数。

leimeili的博客 456

简介几种系统调用函数:write、read、open、close、ioctl

  在 Linux 中,一切(或几乎一切)都是文件,因此,文件操作在 Linux 中是十分重要的,为此,Linux 系统直接提供了一些函数用于对文件和设备进行访问和控制,这些函数被称为系统调用(syscall),它们也是通向操作系统本身的接口。 一、系统调用   系统调用就是 Linux 内核提供的一组用户进程与内核进行交互的接口。这些接口让应用程序受限的访问硬件设备,提供了创建新进程并与已有...

weixin_34346099的博客 1093

linux设备驱动模型一字符设备open系统调用流程

文章目录前言一、open概述二、字符设备的注册二、创建inode四、打开文件流程4.1 数据结构4.2 处理流程4.2.1 open系统调用 前言 要解决的问题: struct inode 和 struct file,cdev 和 inode的关系 open系统调用是如何通过设备号来找到 一、open概述 使用open函数打开设备文件,到底做了些什么工作?下图中列出了open函数执行的大致过程。 二、字符设备的注册   linux内核cdev_init系列函数。   内核中每个字符设备都对应一个

m0_46535940的博客 3513
上一篇: 详解字符设备驱动框架及操作函数的实现原理
下一篇: 字符设备驱动程序的读写操作详解
Raymond430
博客等级 码龄7年 91粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值