当前位置: 首页 > news >正文

学内核之二十一:系统调用栈结构分析

目录

一 构建分析环境

二 栈的位置

三 栈开头8字节

四 寄存器环境

五 R4和R5

六 如何确定系统调用的具体函数


一 构建分析环境

为了分析方便,做了如下测试环境:
内核实现一个简单的创建字符设备的驱动
应用层实现一个c程序,操作为打开内核创建的字符设备文件
内核在处理open设备文件的接口中,将指针设置为空,并在该空指针上赋值。这样,就触发内核的空指针异常,输出oops及相关堆栈。

为了说明方便,将内核的栈信息单独提取出来

<0>dee0: beceeccc c00cd8f4 00000041 c004897c cf050790 cf5ab990 ea7ef579 00000006
<0>df00: cd826015 c0718100 00000000 cf401c38 ce2c3bc8 00000101 00000004 0000003e
<0>df20: 00000000 00000000 00000000 ffffff9c cd826000 00000ff0 c0776c30 000105f0
<0>df40: 00000000 00000000 ffffff9c cd826000 00000005 00000003 ffffff9c cd826000-1      -2       -3         -4       -5       -6
<0>df60: 00000005 c00bec3c c0714080 c071f780 cd0e2480 00000000 c0000000 00000024-7       -8        -9       r4        r5      r6      r7       r8
<0>df80: 00000100 00000001 cd3cc000 0001056c 00000000 00010354 00000005 c000e6a8r9       lr        r4       r5    r0 0     r1 1    -18 2      3
<0>dfa0: cd3cc000 c000e4e0 0001056c 00000000 000105f0 00000000 00000001 000000004        5         6        7      8         9       10       11
<0>dfc0: 0001056c 00000000 00010354 00000005 00000000 00000000 b6f8b000 beceeccc12      13 sp    14 lr   15 pc   16 cpsr  17-old r0   rev     rev
<0>dfe0: 00000000 beceecb4 000104fc b6df902c 60080010 000105f0 00000000 00000000
<4>[<bf8f5074>] (second_open [debug_for_syscall_statck]) from [<c00c35fc>] (chrdev_open+0xd0/0x190)
<4>[<c00c35fc>] (chrdev_open) from [<c00bd790>] (do_dentry_open+0x1d8/0x2f0)
<4>[<c00bd790>] (do_dentry_open) from [<c00cbe44>] (do_last+0x6b0/0xc5c)
<4>[<c00cbe44>] (do_last) from [<c00cc4a8>] (path_openat+0xb8/0x640)
<4>[<c00cc4a8>] (path_openat) from [<c00cd8f4>] (do_filp_open+0x2c/0x88)
<4>[<c00cd8f4>] (do_filp_open) from [<c00bec3c>] (do_sys_open+0x104/0x1c8)
<4>[<c00bec3c>] (do_sys_open) from [<c000e4e0>] (ret_fast_syscall+0x0/0x38)

上面,已对栈的信息做了标注。下面看这些标注如何得来。

二 栈的位置

参考之前对oops异常的分析。主要是内核栈占用两个页面,共8KB,一头上threadinfo,一头是内核栈栈底。栈向下增长,从高地址到低地址。

三 栈开头8字节

内核栈预留了8个字节
这是内核设计保留的,具体原因参考内核的修改记录

https://git.kernel.org/pub/scm/linux/kernel/git/history/history.git/commit/?id=415395e19fd197ce4f248902dba54f4065af547c

  Always leave 8 bytes free at the top of the kernel stack.  Thisprevents the stack becoming completely empty when do_exit() iscalled from an exiting nfsd() thread, and causing the wrongpointer to be returned from current_thread_info()


代码中也是如此定义栈开始位置的。

./arch/arm/include/asm/thread_info.h:#define THREAD_START_SP            (THREAD_SIZE - 8)

上面标记为rev的两个位置

四 寄存器环境

接下来18个位置,为寄存器环境保存用。占用大小根据pg_regs定义来,72字节
具体入栈操作在entry-common.S中

  .align	5ENTRY(vector_swi)#ifdef CONFIG_CPU_V7Mv7m_exception_entry#elsesub	sp, sp, #S_FRAME_SIZEstmia	sp, {r0 - r12}			@ Calling r0 - r12ARM(	add	r8, sp, #S_PC		)ARM(	stmdb	r8, {sp, lr}^		)	@ Calling sp, lr。。。。。。

上述文件在kernel目录的如下位置:

./arch/arm/kernel/entry-common.S:ENTRY(vector_swi)

vector_swi定义了系统调用异常的入口。也就是上层c代码进入c库使用swi指令触发系统调用时,会触发异常,在异常向量表中,执行上述汇编代码
在上述汇编代码中,保存了栈的18个位置

其中的7保存了系统调用号

五 R4和R5

在调用系统调用接口之前,保存了两个寄存器

local_restart:ldr	r10, [tsk, #TI_FLAGS]		@ check for syscall tracingstmdb	sp!, {r4, r5}			@ push fifth and sixth argstst	r10, #_TIF_SYSCALL_WORK		@ are we tracing syscalls?bne	__sys_tracecmp	scno, #NR_syscalls		@ check upper syscall limitadr	lr, BSYM(ret_fast_syscall)	@ return addressldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine

r4 和 r5之后,使用r8保存系统调用表,使用7中的中断号,右移两位,每个调用占用4字节,修改pc寄存器,直接跳转到系统调用中

跳转之前,将返回地址写入lr寄存器中

六 如何确定系统调用的具体函数

sys_call_table确定开始位置

call.S确定具体函数名

/* 0 */		CALL(sys_restart_syscall)CALL(sys_exit)CALL(sys_fork)CALL(sys_read)CALL(sys_write)/* 5 */		CALL(sys_open)./arch/arm/include/asm/unistd.h:#define __NR_syscalls  (388)

共有388个项目,所以sys_call_table开始位置保留 388×4大小的空间
这些空间在vmlinux.o目标中是填充的零。此文件反汇编后,虚拟地址的开始位置为0
需要查看vmlinux的反汇编。这个反汇编中,虚拟地址开始位置调整为c0000000了,且上述表的内容也有具体内容了。

  c000e6a8 <sys_call_table>:c000e6a8:	c002e0d8 	ldrdgt	lr, [r2], -r8c000e6ac:	c0024c64 	andgt	r4, r2, r4, ror #24c000e6b0:	c0021940 	andgt	r1, r2, r0, asr #18c000e6b4:	c00cf1b8 			; <UNDEFINED> instruction: 0xc00cf1b8c000e6b8:	c00cf254 	andgt	pc, ip, r4, asr r2	; <UNPREDICTABLE>c000e6bc:	c00cdf74 	andgt	sp, ip, r4, ror pcc000e6c0:	c00cccd4 	ldrdgt	ip, [ip], -r4c000e6c4:	c003aa08 	andgt	sl, r3, r8, lsl #20c000e6c8:	c00cdf90 	mulgt	ip, r0, pc	; <UNPREDICTABLE>

这里,5号调用,第六个位置,地址为c00cdf74
该地址的汇编代码为

  c00cdf74 <SyS_open>:c00cdf74:	e6ff3072 	uxth	r3, r2c00cdf78:	e1a02001 	mov	r2, r1c00cdf7c:	e1a01000 	mov	r1, r0c00cdf80:	e3e00063 	mvn	r0, #99	; 0x63c00cdf84:	eaffff88 	b	c00cddac <do_sys_open>

所以,系统调用最开始调用SyS_open,接着调用do_sys_open
这就跟上述栈的回溯对应上了

  c00cddac <do_sys_open>:c00cddac:	e3a0c040 	mov	ip, #64	; 0x40c00cddb0:	e7dfc81c 	bfi	ip, ip, #16, #16c00cddb4:	e012c00c 	ands	ip, r2, ipc00cddb8:	17eb3053 	ubfxne	r3, r3, #0, #12c00cddbc:	e92d43f0 	push	{r4, r5, r6, r7, r8, r9, lr}c00cddc0:	e24dd024 	sub	sp, sp, #36	; 0x24

这个函数里,入栈7个位置,并预留9个位置,这也跟上述栈标记及栈回溯对应上了
  
关于系统调用时如何通过代码里的宏定义等映射到SyS_open的,后续再看。
  
基于此,就可以进行栈分析了。
  
七 其他
关于汇编里的伪代码 标记 头文件引入 指令集选择  新旧ABI兼容处理 等等,就不记录了,可以结合最终汇编代码,确定一些条件编译的情况

相关文章:

学内核之二十一:系统调用栈结构分析

目录 一 构建分析环境 二 栈的位置 三 栈开头8字节 四 寄存器环境 五 R4和R5 六 如何确定系统调用的具体函数 一 构建分析环境 为了分析方便&#xff0c;做了如下测试环境&#xff1a; 内核实现一个简单的创建字符设备的驱动 应用层实现一个c程序&#xff0c;操作为打开内…...

互联网3.0 数字原生——数物虚实多维细粒度泛在融合

随着计算机、宽带网、通信技术的飞速发展&#xff0c;互联网技术和软硬件系统也不断演进&#xff0c;催生了一场前所未有的数字化革命。从Web1.0到Web3.0&#xff0c;以及虚拟现实、人工智能和数字孪生等领域的崛起&#xff0c;每一步都勾画出了一个崭新的数字未来&#xff0c;…...

实现AIGC更好的数据存力,这家科技巨头为我们指明了方向

存力即数据存储能力 蕴藏着巨大的发展机会 【全球存储观察 &#xff5c; 热点关注】 2023年&#xff0c;全球被ChatGPT的热潮席卷&#xff0c;拥抱AIGC的创新赛道成为众多企业的新选择。 全球存储观察分析指出&#xff0c;影响AIGC发展的三大因素也日益凸显&#xff0c;即算…...

企业如何在抖音上搞到TOB潜在精准客户流量?

我们都知道&#xff0c;现在互联网上流量都被集中了几个大的平台里。而抖音&#xff0c;一定是绕不开那个&#xff01;图片在公众号&#xff1a;白杨SEO上去看。 抖音&#xff0c;在很多人的传统印象里&#xff0c;还只是一个娱乐短视频APP&#xff0c;用来打发时间而已。事实…...

JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…...

与树上边权、连通块、二分块相关的问题(抓住各连通块之间的联系,考虑增量):CF444E

https://www.luogu.com.cn/problem/CF444E 首先肯定二分 然后是棵树&#xff0c;所以考虑按顺序枚举边权 然后肯定会有连通块和并查集 考虑现在场上有多个连通块&#xff0c;我们只保留大于 m i d mid mid 的边 则每个连通块都必须往外连边 一个很朴素的思路是判定每个连…...

解决VSCode下载速度很慢

这是VSCode的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 按照官网的下载链接&#xff0c;速度实在是感人&#xff01; 解决办法也很简单&#xff0c;把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为&#x1f449; vscode.cdn.azu…...

悬赏算命测算源码可以用二维码收款 可以直接拿来运营

首发悬赏算命测算源码可以用二维码收款 可以直接拿来运营吸金&#xff01;用户可以通过发布悬赏赏金算命&#xff0c;也可以通过升级发布测算任务来吸金 测试环境&#xff1a;php5.6apache2.4mysq5.6 安装教程&#xff1a; 测试环境&#xff1a;php5.6apache2.4mysq5.6 安装&…...

在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)

NginxPHP安装在公网IP为x.x.x.x的服务器上 需要下载安装的软件版本&#xff1a;nginx-1.20.1php-7.4.28 需要增加的PHP扩展如下&#xff1a; 在编译安装php-7.4.28时加上的pcntl&#xff1b; 单独下载安装的Wxwork_finance_sdk&#xff1b;&#xff08;在编译安装php-7.4.2…...

使用vue-cli搭建SPA项目

一.SPA项目的构建 前提 nodeJS环境已经搭建完毕 node -v npm -v 什么是SPA项目 SPA&#xff08;Single Page Application&#xff09;项目是一种使用单页面架构的Web应用项目。在SPA项目中&#xff0c;整个应用程序只有一个HTML页面&#xff0c;通过动态加载数据和更新DOM来实…...

PLC串口通讯和通讯接口知识汇总

在使用PLC的时候会接触到很多的通讯协议以及通讯接口&#xff0c;最基本的PLC串口通讯和基本的通讯接口你都了解吗&#xff1f; 一、什么是串口通讯&#xff1f; 串口是一种接口标准&#xff0c;是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准&#xff0c;没…...

Vue基础入门---详细简介

一&#xff0c;对Vue的概念 1.1 什么是Vue &#xff1f; 一种流行的JavaScript前端框架&#xff0c;用于构建交互式的Web应用程序。它以简洁、灵活和高效的特性而受到广泛欢迎。Vue采用了一种响应式的数据绑定机制&#xff0c;使得数据的变化能够自动更新相关的DOM元素&#x…...

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度&#xff0c;暂时停滞使用&#xff0c;重写了QTreeWidget的拖拽功能&#xff0c;和绘制功能&#xff0c;自定义了数据结构&#xff0c;增加复制&#xff0c;粘贴&#xff0c;删除&#xff0c;准备实现动态刷新数据支持千万数据动态刷新&a…...

【Spring Boot】拦截器学习笔记

一、普通拦截器 1&#xff0c;新建类MyWebConfig实现WebMvcConfigurer&#xff0c;实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…...

云可观测性:提升云环境中应用程序可靠性

随着云计算的兴起和广泛应用&#xff0c;越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中&#xff0c;确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案&#xff0c;针对这一需求提供了有效的方法和工具。本文将介绍…...

免杀对抗-java语言-shellcode免杀-源码修改+打包exe

JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令&#xff1a;msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包&#xff0c;成功上线 命令&#xff1…...

抖音、知乎、小红书的流量算法

目前我国网民规模已超过10亿&#xff0c;在这互联网时代&#xff0c;更是流量为王。各个平台里的每个视频、每张图片&#xff0c;背后都有着算法的身影&#xff0c;支配着所有人的流量。作为内容创作者及运营者来说&#xff0c;除了制作高质量的内容以外&#xff0c;也需要掌握…...

c++ 纯虚函数、抽象类

一、 纯虚函数 抽象类 只要有一个纯虚函数&#xff0c;这个类称为抽象类 抽象类的特点 1、无法实例化 2、抽象类的子类&#xff0c;必须要重写父类中的纯虚函数&#xff0c;否者也属于抽象类 例子一 #include <iostream> #include <string.h> using namespa…...

echarts另外存为图片

今天同事画了个Echarts,我看了下居然有下载功能&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;之前一直不知道&#xff09; 这是原图&#xff0c;右上角有个下载功能&#xff0c; 下载后是这样的 貌似是没有了y轴的参数和x轴的参数&#xff0c;估计是可以配置的…...

Mybatis返回自动递增主键值,通过实体

如果你在数据库中使用了自动递增的主键&#xff08;通常是整数类型&#xff09;&#xff0c;你可以使用 MyBatis 来返回插入记录后生成的自动递增的 ID。这里是一个示例&#xff1a; 首先&#xff0c;在你的 SQL 映射文件中&#xff0c;使用 <insert> 元素来执行插入操作…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题&#xff0c;导致车牌识别率低、逃费率高&#xff0c;传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法&#xff0c;正成为破局关键。该设备安装于车位侧方0.5-0.7米高度&#xff0c;直接规避树枝遮…...

云安全与网络安全:核心区别与协同作用解析

在数字化转型的浪潮中&#xff0c;云安全与网络安全作为信息安全的两大支柱&#xff0c;常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异&#xff0c;并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全&#xff1a;聚焦于保…...

快速排序算法改进:随机快排-荷兰国旗划分详解

随机快速排序-荷兰国旗划分算法详解 一、基础知识回顾1.1 快速排序简介1.2 荷兰国旗问题 二、随机快排 - 荷兰国旗划分原理2.1 随机化枢轴选择2.2 荷兰国旗划分过程2.3 结合随机快排与荷兰国旗划分 三、代码实现3.1 Python实现3.2 Java实现3.3 C实现 四、性能分析4.1 时间复杂度…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...