arm64 - 系统调用

起因

群里做网络的小伙伴问了一个问题,他在wifi驱动的某个函数里加了dump stack,然后插入驱动,发现调用栈是这样的,为什么呢?
在这里插入图片描述

代码追溯

insmod这个app,是在busybox中的,所以找到busybox的代码:
入口就是这个insmod_main
在这里插入图片描述
调用了bb_init_module,它的尾部有这样的调用
在这里插入图片描述
init_module即为核心的初始化模块的函数。这里会涉及到系统调用:
在这里插入图片描述
系统调用号是__NR_finit_module或者__NR_init_module。

这里syscall的实现,没有找到确切的,估计是做了一层wrapper,可能是在glibc或者uclibc这种库里。
这里看着是触发了el0_sync
由于是在用户态触发的,所以是el0,但为什么是sync异常呢?

这里我继续追溯了一下,到uclibc-ng的库中,找到了:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里把syscall_name存到了x8中,然后调用了svc 0
在ARM64(aarch64)体系结构中,svc 0是一条软中断指令,用于触发一个异常。svc是Supervisor Call的缩写,通常用于向操作系统发出请求或者系统调用。当执行svc 0指令时,处理器会进入异常处理流程,并跳转到异常向量表中相应的处理程序,即操作系统的内核代码。在处理器进入异常模式后,操作系统可以识别并处理此次异常,执行相应的操作,例如执行用户空间进程的系统调用,处理中断请求等。因此,svc 0通常用于触发用户空间程序与操作系统内核之间的通信,进行系统调用。

所以这得看kernel对el0的异常向量表的实现了。我们知道,aarch64架构,异常向量表比较复杂,每个EL等级都有一份,EL等级越高,要实现的异常向量表就越多。EL2要实现EL0,EL1,EL2的。EL1要实现EL0,EL1的。
这里是从EL0触发异常,所以只需要实现EL0的向量表。
在这里插入图片描述
我们找到linux内核如何实现EL0的异常向量表的:

(linux/arch/arm64/kernel/entry.S)/** Exception vectors.*/.pushsection ".entry.text", "ax".align	11
SYM_CODE_START(vectors)kernel_ventry	1, sync_invalid			// Synchronous EL1tkernel_ventry	1, irq_invalid			// IRQ EL1tkernel_ventry	1, fiq_invalid			// FIQ EL1tkernel_ventry	1, error_invalid		// Error EL1tkernel_ventry	1, sync				// Synchronous EL1hkernel_ventry	1, irq				// IRQ EL1hkernel_ventry	1, fiq				// FIQ EL1hkernel_ventry	1, error			// Error EL1hkernel_ventry	0, sync				// Synchronous 64-bit EL0kernel_ventry	0, irq				// IRQ 64-bit EL0kernel_ventry	0, fiq				// FIQ 64-bit EL0kernel_ventry	0, error			// Error 64-bit EL0#ifdef CONFIG_COMPATkernel_ventry	0, sync_compat, 32		// Synchronous 32-bit EL0kernel_ventry	0, irq_compat, 32		// IRQ 32-bit EL0kernel_ventry	0, fiq_compat, 32		// FIQ 32-bit EL0kernel_ventry	0, error_compat, 32		// Error 32-bit EL0
#elsekernel_ventry	0, sync_invalid, 32		// Synchronous 32-bit EL0kernel_ventry	0, irq_invalid, 32		// IRQ 32-bit EL0kernel_ventry	0, fiq_invalid, 32		// FIQ 32-bit EL0kernel_ventry	0, error_invalid, 32		// Error 32-bit EL0
#endif
SYM_CODE_END(vectors)

我们忽略invalid结尾的entry,第一个可用的就是sync异常。

找到el0_sync异常的handle:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里invoke_syscall就是通过系统调用,查表sys_call_table来执行对应的处理接口。

sys_call_table会在arch spec的这个文件中定义。这里是arm64的。

在这里插入图片描述
在这里插入图片描述
这里包含了asm/unistd.h,这是内核公有代码。
在这里插入图片描述
127号系统调用就是init module。他在定义时是怎么定义的?
在这里插入图片描述
load_module就是内核在做模块加载的动作了。

最后做个总结:
在这里插入图片描述

结尾

调用栈init_module函数向下的内容,就是__INIT_MODULE这类的宏的实现了,一般和链接机制有关。TODO:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/601301.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring-cloud微服务负载均衡器ribbon

注意:2020年前SpringCloud是采用Ribbon作为负载均衡实现,但是在2020后采用了LoadBalancer替代,所以要查看springboot,springcloud,sprincloudalibaba的版本链接对应,Ribbon负载均衡都是在springboot版本2.4…

静态中间继电器 HJZ-J908 AC380V 导轨安装 JOSEF约瑟

系列型号: HJZ-J902静态中间继电器;HJZ-J905静态中间继电器; HJZ-J907静态中间继电器;HJZ-J907L静态中间继电器; HJZ-J908静态中间继电器;HJZ-J909静态中间继电器; HJZ-J910静态中间继电器&…

FireProx:一款功能强大的AWS API网关管理与IP地址轮换代理工具

关于FireProx FireProx是一款功能强大的AWS API网关安全管理工具,该工具可以帮助广大研究人员创建实现唯一IP地址轮换的实时HTTP转发代理。 在发送网络请求或进行网络交互时,实现源IP地址轮换是一个非常复杂的过程,虽然社区中也有相关的工具…

自定义复选款与单选框,input

注&#xff1a;字体文字取自bootstrap字体库https://icons.bootcss.com/icons <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.checkbox-com,.radio-com {position: relative;display: inlin…

数据结构---绪论

一、绪论&#xff1a; 1.什么是数据&#xff1f; 数据是信息的载体&#xff0c;是描述客观事物属性的数&#xff0c;字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。 数据元素--描述一个个体 数据元素&#xff0c;数据项&am…

从用友U9到钉钉通过接口配置打通数据

从用友U9到钉钉通过接口配置打通数据 接通系统&#xff1a;用友U9 用友U9cloud深耕制造领域十三载&#xff0c;U9cloud在机械、电子、汽配、家具、整车、军工等细分行业有着深厚的积累&#xff0c;尤其是机械、电子和汽配行业&#xff0c;不但打造了多个成熟的产品模式和应用场…

双系统安装05--在已有中科方德系统基础上安装Windows10

原文链接&#xff1a;双系统安装05–在已有中科方德系统基础上安装Windows10 Hello&#xff0c;大家好啊&#xff01;继我们之前关于双系统安装的讨论&#xff0c;今天我为大家带来双系统安装系列的第五篇文章——在已有的中科方德桌面操作系统上安装Windows 10。中科方德作为一…

事务隔离:为什么你改了我还看不见?

事务隔离&#xff1a;为什么你改了我还看不见&#xff1f; 提到事务&#xff0c;你肯定不陌生&#xff0c;和数据库打交道的时候&#xff0c;我们总是会用到事务。最经典的例子就是转账&#xff0c;你要给朋友小王转 100 块钱&#xff0c;而此时你的银行卡只有 100 块钱。 转账…

JMeter 使用

初衷 网上有很多JMeter的教程都很优秀&#xff0c;但是我想按照我对JMeter的理解出一篇教程&#xff0c;以便于我以后作为开发人员可以自己对自己写的代码进行性能测试。 1、首先JMeter它的主要作用是性能测试 &#xff08;1&#xff09;负载测试&#xff1a;同时发生的用户…

Linux设备树解析:桥接硬件与操作系统的关键架构

在探索Linux的庞大和复杂世界时&#x1f30c;&#xff0c;我们经常会遇到许多关键概念和工具&#x1f6e0;️&#xff0c;它们使得Linux成为了一个强大和灵活的操作系统&#x1f4aa;。其中&#xff0c;“设备树”&#xff08;Device Tree&#xff09;是一个不可或缺的部分&…

Java常用API_System——常用方法及代码演示

1.System.exit(int status) 方法的形参int status为状态码&#xff0c;如果是0&#xff0c;说明虚拟机正常停止&#xff0c;如果非0&#xff0c;说明虚拟机非正常停止。需要将程序结束时可以调用这个方法 代码演示&#xff1a; public class Test {public static void main(S…

Windows远程执行

Windows远程执行 前言 1、在办公环境中&#xff0c;利用系统本身的远程服务进行远程代码执行甚至内网穿透横向移动的安全事件是非常可怕的&#xff0c;因此系统本身的一些远程服务在没有必要的情况下建议关闭&#xff0c;防止意外发生&#xff1b; 2、作为安全人员&#xff0…