浅析linux中open系统调用

2023-10-26

从2.6.19的linux内核开始,内核的系统调用使用函数syscall,其函数原型为:int syscall(int number, ...)其中number是系统调用号,number后面应顺序接上该系统调用的所有参数。以x86平台为例,系统调用号在内核源码中的路径是/arch/x86/include/asm/unistd_32.h头文件中定义。其中大部分以__NR_开头,比如open的系统调用号是5。

本文以字符设备的驱动为例,分析系统调用的执行过程,内核版本为2.6.35.

1、用户空间到内核的转换

系统调用需要一个从用户空间到内核空间的转换,不同平台转换的指令不同,这种特定的指令称作操作系统的陷入(operating system trap)。X86结构中使用软中断x080来实现。即汇编指令 int $0x80.通过软中断0x80 ,系统就会跳到一个预设的内核空间地址。它指向系统调用处理程序system_call,在arch/x86/kernel/entry_32.S 中以汇编语言编写,该过程主要有2个步骤。

(1)系统启动时,对INT 0x80进行一定的初始化。

使用汇编子程序setup_idt(linux/arch/i386/kernel/head.S)初始化idt表(中断描述符表),这时所有的入口函数偏移地址都被设为ignore_int ,如下图所示。

(2)设置中断描述符表

start_kernel函数中(init/main.c)调用trap_init()(arch/x86/kernel/trap.c)函数,设置中断描述符表。在trap_init()该函数里,实际上是通过调用函数set_system_trap_gate(SYSCALL_VECTOR, &system_call);来完成该项的设置的。其中的SYSCALL_VECTOR就是0x80,而system_call则是一个汇编子函数,它即是中断0x80的处理函数,主要完成两项工作:寄存器上下文的保存、跳转到系统调用处理函数。

2、系统调用函数的入口

syscall_call函数到系统调用服务例程:在上面执行软终端0x80时,系统调用号会被放入eax寄存器,system_call()函数读取eax寄存器获取当前系统调用的调用号。然后将其乘以4生成偏移地址,然后再以sys_call_table为基址。基址+偏移地址=>系统调用服务例程的地址。其中sys_call_table基址在文件arch/x86/kernel/syscall_table_32.S中定义。同时table表中每一项例程的地址占用4个字节,所以上面乘以4。

到这儿system_call()就到服务例程的地址了。然后另一个问题-参数传递需要解决。由于系统调用例程在定义时时用 asmlinkage 标记了的,所以编译器仅从堆栈中获取该函数的参数。在进入system_call函数前,用户应用会把参数存放到寄存器中,system_call函数执行时会首先把这些寄存器压入堆栈。这样对系统调用服务例程可以直接从堆栈照片能够获取参数。

3、系统调用函数的执行

open会最终执行sys_open函数:

里面调用do_sys_open()函数:

在上图的L884行中,获取未被使用的文件描述符,在do_filp_open()函数中打开文件。其函数调用过程如下:

sys_open -> do_sys_open -> do_filp_open ->do_last-> nameidata_to_filp -> __dentry_open

4、驱动代码file_operations的调用

在 __dentry_open函数中:

L685中 open = f->f_op->open;即调用chrdev_open。

在file: fs/char_dev.c中static int chrdev_open(struct inode *inode, struct file *filp)调用ret = filp->f_op->open(inode,filp);即为真正的file_operations中的open函数。

当然,在VFS层中对open函数的操作远不止上文描述的这么简单,会进行权限和打开方式的判断等。普通的驱动开发者很少涉及对这部分代码的修改,主要还是学习和欣赏Linux内核。

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

浅析linux中open系统调用 的相关文章

  • Hibernate自动建表(使用DDL语句)

    Gd上次和大家谈到使用DDL语句实现自动建表失败的问题 过了几天再回头看果然思路就变得清晰许多 原来是xxx hbm xml文件的配置上出了问题 因为上次没有用Junit进行测试 所以没有看明白问题的描述 这里不得不说一句 Junit真是个
  • vue cli3 打包后访问不到页面 Failed to load resource: the server responded with a status of 404 (Not Found)

    在根目录下新建文件vue config js 配置打包资源路径 默认是 如果没有特殊需求就不要修改 代码如下 const path require path function resolve dir return path join dir
  • 于g2o新版本编译出错的原因及解决办法

    在githubg2o的github地址上面down了最新的版本进行安装 编译十四讲第六讲的代码出错 报错信息 home hri SLAM slambook ch6 g2o curve fitting main cpp In function
  • Linux查看与设置CPU频率

    Gnome下查看 1 在Gnome菜单栏的底部面板上点右键 gt 添加到面板 gt CPU频率范围监视器 然后gnome面板上就会出现此小工具 并显示当前的频率 点左键可出现可调节的频率 命令行下查看 1 安装cpufrequtils 此软
  • AD数据采集卡的输入悬空电压

    现象 用AD数据采集卡进行模拟电压信号采集时 在输入端悬空时 其采集到的信号与有信号输入的端口采集到的信号是类似的 而不是随机噪声 如图1所示 首通道是接入信号的 某通道悬空 图1 实际信号采集结果 这里说一下我所了解到的一种原因 大多数A
  • 详解二:CentOS下编译安装PHP开发环境,配置LAMP

    下载以上软件后 如果用户用的是CentOS最简版 也就是minimal版 需要安装支持软件 yum y install libxml2 yum y install libxml2 devel yum y install zlib yum y
  • 以太坊通证标准包括(ERC20、ERC721、ERC223、ERC621、ERC827、RFC、EIP)

    最著名的两个以太坊通证标准是代币标准ERC20和数字资产标准ERC721 在本文中 除了介绍这两个流行的ERC以太坊标准 还将介绍其他一些针对特定应用场景的ERC20改进标准 ERC223 ERC621和ERC827 什么是ERC ERC代
  • Zotero入门教程

    文章目录 一 生成Bibliography 二 Zotero文献自动导入 1 为什么要使用SCI HUB 2 如何自定义PDF解析器 三 在Zotero中添加Extension 四 文件存储位置的修改 五 markdown笔记功能 一 生成
  • Node.JS是什么

    1 Node JS是什么 Node js 不是一种独立的语言 Node js 也不是JavaScript 框架 Node js 是一个让 JavaScript 运行在服务端的开发平台 Node js 是一个让 JavaScript 运行在浏
  • CTFSHOW WEB 红包题第二弹

    1 题目 2 解题 2 1 查看源码 按F12发现提示 cmd 2 2 尝试传参 通过url传参数cmd aaa http 2799b166 4390 45e9 a3f4 711d2a5e64c5 challenge ctf show 80
  • 20-TCP 协议(滑动窗口——基础)

    相信大家都遇到过这样的场景 同学 Luffy 给你打电话 让你记下一串手机号码 可是你记忆力不太好 你跟 Luffy 约定 一次只最多只能报 4 个数字 Luffy 念一遍 如果你听到了就把他说的话重复一遍 接下来 你 你一次最多报 4 个
  • vue3中的工具函数 isRef() 和 unref()

    1 isRef 检查某个值是否为 ref 主要用于检测类型 function isRef
  • Python中的shuffle()函数的使用

    解释说明 shuffle 函数是打乱序列里面的元素 并随机排列的 使用说明 import random random shuffle alist 注意下 alist可以使是一个列表 也可以是个序列 shuffle 是不能直接访问的 需要导入
  • 枚举操作大全

    定义 using System using System Collections Generic using System Linq using System Text using System Threading Tasks namesp
  • 0基础学习VR全景平台篇 第99篇:百度地图如何上传全景图

    蛙色平台现已打通VR全景入驻百度地图全流程 百度全景分为免费版和付费版两种 其中付费支持配置作品音乐 场景漫游热点 联系电话 描述信息 百度地图上传案例 免费版 付费版 一 百度地图上传流程 1 进入蛙色VR账号后台 1 选择 第三方平台
  • Python中的三目运算符

    一般支持三目运算符的语言 如C语言 的语法格式一般是这样的 判断条件 返回布尔值 为真时的结果 为假时的结果 比如 x x 2 1 x 1 x python并不支持 这种符号所表达的先判断再选择的含义 但仍然有相应的语法支持 1 Pytho
  • 分分钟在自己电脑上建一个视频网站,收费电影随便看,还没广告!

    声明 iker干货 本文仅作为技术文章 不鼓励不诱导用户观看盗版视频 第一步 分分钟在自己电脑上建一个视频网站 收费电影随便看 还没广告 第二步 安装好软件后先切换环境 推荐使用 PHP 7 0 12 Apache 今天用的这个网站程序不需
  • JavaScript forEach 如何跳出循环?

    1 forEach用法 遍历时更加简洁 效率和for循环相同 不用处理集合下标的问题 减少了出错的概率 const items item1 item2 item3 const arr for for let i 0 i
  • tampermonkey使用直接获取百度云盘下载地址

    1 http tampermonkey net 直接下载相应插件 2 打开这个插件 到管理界面 点击获取脚本 3 打开的获取脚本的页面上有很多网站链接 随意进去一个 搜索baidu 找到百度下载助手的一个点进去 并且安装 我选择的是 Gre

随机推荐

  • python GUI 简易计算器

    见代码 coding utf 8 time 2020 12 9 21 01 Author Vab File 计算器 py Software PyCharm from tkinter import class Calc def init se
  • OLED透明屏交互技术:开创未来科技的新篇章

    OLED透明屏交互技术作为一项前沿的科技创新 正在以其高透明度 触摸和手势交互等特点 引领着未来科技的发展 不仅在智能手机 可穿戴设备和汽车行业有着广泛应用 还在广告和展示领域展现出巨大的潜力 那么 尼伽在这篇文章中将深入探讨OLED透明屏
  • 干货

    导读 目标检测 Object Detection 是计算机视觉领域的基本任务之一 学术界已有将近二十年的研究历史 近些年随着深度学习技术的火热发展 目标检测算法也从基于手工特征的传统算法转向了基于深度神经网络的检测技术 从最初 2013 年
  • meterpreter常用命令

    meterpreter常用命令 1 meterpreter简介 1 1 什么是meterpreter 1 2 meterpreter常用命令 2 文件系统命令 3 用户设备命令 4 开启远程桌面 5 收集信息 5 针对未安装补丁攻击 5 注
  • ESP8266 阿里云 MQTT物联网测试

    前面写了篇恢复ESP8266 发布APRS的文章 ESP8266 APRS 板子修改为提交数据到T2服务器的方法 五块钱的方便面的博客 CSDN博客一年多前 我折腾好了基于ESP8266 BMP280 锂电池 方案做了个nodeMCU固件的
  • Uni-App从入门到实战-黑马程序员【uniapp基础知识讲义笔记】

    想要课程资料的同学可以留言 留下你的邮箱哦 uni app的基本使用 课程介绍 基础部分 环境搭建 页面外观配置 数据绑定 uni app的生命周期 组件的使用 uni app中样式学习 在uni app中使用字体图标和开启scss 条件注
  • Android开发:Handler简单实现验证码功能

    最近开始学习handler 觉得这个小demo对handler的理解挺有帮助的 先看布局页面 布局文件就不多说 差不多个意思就行 需求分析 一个EditText输入验证码 一个发送验证码的按钮Button 当点击这个按钮之后 该按钮就不能再
  • NVIDIA Tensor Core / DLA 资料汇总

    1 Tensor Core 介绍 Tensor Core有多牛 javastart的博客 CSDN博客 tensorcore 2 Tensor Core Sample Code Programming Tensor Cores in CUD
  • Kettle 数据库密码加密解密

    导语 如果你在Java里调用创建好的ktr文件 在开发时还是可以用的 但是上了生产测试和生产就没办法使用了 数据连接换了 这时候你可能会想到 我在创建一个转换不就好了 但是这个是有风险的 Kettle还是很友好的 为我提供了加密解密的工具
  • 25道题检测你对支持向量机算法的掌握程度

    介绍 在我们学习机器算法的时候 可以将机器学习算法视为包含刀枪剑戟斧钺钩叉的一个军械库 你可以使用各种各样的兵器 但你要明白这些兵器是需要在合适的时间合理的地点使用它们 作为类比 你可以将 回归算法 想象成能够有效切割数据的剑 但无法处理高
  • 富文本:mavon-editor

    一 安装与配置 1 在终端输入命令 npm install mavon editor save 2 配置 在main js 中输入以下代码 import Vue from vue import mavonEditor from mavon
  • 怎样在表格中选出同一类_怎样将一个excel表格里头的多个同一个名称下面的多个数据筛选出来...

    把这些掌握就差不多了 一 建立分类下拉列表填充项 我们常常要将企业的名称输入到表格中 为了保持名称的一致性 利用 数据有效性 功能建了一个分类下拉列表填充项 1 在Sheet2中 将企业名称按类别 如 工业企业 商业企业 个体企业 等 分别
  • yolov3运行及保存检测视频(包括摄像头)

    新代码 可用 如果不想在老代码上折腾更改 可以直接根据下面的新地址拉取代码 注意看Readme 更新20180703 由于以前上传的项目有点点小问题 完整更新项目及说明如下链接 https github com RongSong1993 Y
  • Python3中的变量及对象

    1 变量的定义 Python是一种动态类型语言 类型是在运行时自动决定的 而不是通过代码声明的 所以在Python中运行赋值语句 a 100 不需要给a声明类型 一个变量 也就是变量名 在第一次给它赋值的时候就创建了它 并且它指向了被赋值的
  • 【MFC开发(15)】进度条控件Progress Control

    1 进度条控件的常用方法 首先给控件添加一个变量 在dlg初始化函数钟进行方法的实现 进度条显示区域 设置进度条的范围 m progress SetRange 0 100 设置进度条当前的位置 m progress SetPos 75 获取
  • PowerBi:多表合并操作

    1 原始表格 表一 表二 2 需求 将表二的榜单和人数列合并到表一中去 操作过程 对表二中列存在的空格进行填充 将查询合并为新查询 合并表格操作 选择要合并的表格 选择链接的列 选择合并方式 合并后选择表二要显示的列 为榜单和人数 合并完成
  • windows挂载linux系统的文件夹(虚拟机或内网环境)

    1 方式 采用samba服务 windows挂载linux系统的文件夹 2 安装samba服务 root lvrnlw 67 145 yum install samba 修改配置文件 etc samba smb conf See smb c
  • (七)概念设计模型(CDM)中的3种实体关系说起

    CDM是大多数开发者使用PD时最先创建的模型 也是整个数据库设计最高层的抽象 CDM是建立在传统的ER图模型理论之上的 ER图中有三大主要元素 实体型 属性和联系 其中实体型对应到CDM中的Entity 属性对应到CDM中每个Entity的
  • 购物网站制作——头部header(index.html)

    1 头部header 1 1 logo图片定位 css代码写在common css里面 调用了 w类 版心 w width 1200px margin 0 auto header position relative height 90px
  • 浅析linux中open系统调用

    从2 6 19的linux内核开始 内核的系统调用使用函数syscall 其函数原型为 int syscall int number 其中number是系统调用号 number后面应顺序接上该系统调用的所有参数 以x86平台为例 系统调用号