lab4:以time/gettimeofday系统调用为例分析ARM64 Linux 5.4.34

news/2025/2/11 15:44:01/

一、ARM64 Linux系统调用过程

(1)svc指令触发系统调用。
(2)保存现场(el0_sync处的内核汇编代码保存异常发生时程序的执行现场),然后根据异常发生的原因(ESR_EL1寄存器)跳转到el0_svc,el0_svc处。
(3)执行系统调用内核处理函数sys_syz()。
(4)系统调用内核处理函数执行完成后,系统调用返回前,需要恢复异常发生时程序的执行现场(恢复现场),包括主动设置ELR_EL1和SPSR_EL1的值:是异常会发生嵌套,一旦发生异常嵌套ELR_EL1和SPSR_EL1的值就会随之发生改变,所以当系统调用返回时,需要恢复之前保存的ELR_EL1和SPSR_EL1的值。
(5)内核调用异常返回指令eret,CPU自动把ELR_EL1写回PC,把SPSR_EL1写回PSTATE,并返回到用户态程序里,继续运行程序。

二、用qemu搭建arm64实验环境

制作根文件系统、并打包–>配置内核,将架构调成arm64,并用arm64的交叉编译工具进行内核的编译–>用qemu启动内核

三、构造代码使用内嵌汇编触发 time/gettimeofday 系统调用

test.c如下

#include <stdio.h>
#include <time.h>
#include <sys/time.h>int main()
{time_t tt;struct timeval tv;struct tm *t;
#if 0gettimeofday(&tv,NULL); // 使用库函数的方式触发系统调用
#elseasm volatile( // 使用内嵌汇编的方式触发系统调用"add   x0, x29, 16\n\t"  //X0寄存器用于传递参数&tv"mov   x1, #0x0\n\t"     //X1寄存器用于传递参数NULL"mov   x8, #0xa9\n\t"   //使用X8传递系统调用号169"svc   #0x0\n\t"            //触发系统调用);
#endiftt = tv.tv_sec;                    //tv是保存获取时间结果的结构体t = localtime(&tt);                //将世纪秒转换成对应的年月日时分秒printf("time: %d/%d/%d %d:%d:%d\n",t->tm_year + 1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);return 0;
}

静态编译一下:

aarch64-linux-gnu-gcc -o test test.c -static

在test.c中打断点调试:
在这里插入图片描述

四、分析系统调用的执行过程

ARM64 架构的 CPU 中,Linux 系统调用(同步异常)和其他异常的处理过程大致相同。异常发生时:
CPU 首先把异常的原因放在 ESR_EL1 寄存器里;
1、把当前的处理器状态(PSTATE)放入 SPSR_EL1 寄存器里;
2、把当前程序指针寄存器 PC 的值存入 ELR_EL1 寄存器里(保存断点),然后 CPU 3、通过异常向量表(vectors)基地址和异常的类型计算出异常处理程序的入口地址,即 4、VBAR_EL1 寄存器加上偏移量取得异常处理的入口地址;
接着开始执行异常处理入口的第一行代码。这一过程是 CPU 硬件自动完成的,不需要程序干预。
5、随后保存异常发生时程序的执行现场(保存现场,即用户栈、通用寄存器等),然后根据异常发生的原因(ESR_EL1 寄存器中的内容)跳转到 el0_svc,el0_svc 调用 el0_svc_handler、el0_svc_common 函数,将 X8 寄存器(regs->regs[8])中存放的系统调用号传递给 invoke_syscall 函数。
6、系统调用内核处理函数执行完成后,会将系统调用的返回值存放在 X0 寄存器中。
7、系统调用返回前,需要恢复异常发生时程序的执行现场(恢复现场),其中就包括恢复 ELR_EL1 和 SPSR_EL1 的值。最后内核调用异常返回指令 eret,CPU 硬件把 ELR_EL1 写回 PC,把 SPSR_EL1 写回 PSTATE,返回用户态继续执行用户态程序。如下图所示,该部分操作由 ret_to_user 函数中的 kernel_exit 0 完成。
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述


http://www.ppmy.cn/news/74531.html

相关文章

LiangGaRy-学习笔记-Day14

1、进程相关的命令 1.1、lsof命令 作用&#xff1a;显示当前进程的状态&#xff0c;类似于windows的任务管理器 语法&#xff1a;lsof 选项 选项&#xff1a; -i&#xff1a;指定端口号&#xff1b;&#xff1a;8080-p&#xff1a;指定&#xff0c;指定端口&#xff1b;-…

自学网络安全,最应该先学的五大技能树是什么?(附学习路线图)

前言&#xff1a; 近几年网络安全事件频发&#xff0c;国家对于互联网信息安全和互联网舆情的重视程度不断提升有关&#xff0c;全球网络安全岗位缺口达500万&#xff0c;中国约100万&#xff0c;产业人才需求逐年增加&#xff0c;网络安全行业的相关岗位成为炙手可热的职业。…

基因序列变异信息VCF (Variant Call Format)

<~生~信~交~流~与~合~作~请~关~注~公~众~号生信探索> VCF是Variant Call Format的简称&#xff0c;是一种定义的专门用于存储基因序列突变信息的文本格式。在生物信息分析中会大量用到VCF格式。例如基因组中的单碱基突变,SNP&#xff0c; 插入/缺失INDEL, 拷贝数变异CNV&…

微软推出 Hierarchical Transformer 实现更高准确率的语音评测

对于语言学习者来说&#xff0c;练习发音并获得及时准确的反馈&#xff0c;是提高口语水平的重要环节。多年来&#xff0c;微软一直深耕基于 Azure 认知服务的语音功能&#xff0c;不断优化语音评测[1]功能的底层技术&#xff0c;从准确率、流畅度、完整性和语音语调等方面&…

iperf3常用

iperf使用方法详解 iperf3是一款带宽测试工具&#xff0c;它支持调节各种参数&#xff0c;比如通信协议&#xff0c;数据包个数&#xff0c;发送持续时间&#xff0c;测试完会报告网络带宽&#xff0c;丢包率和其他参数。 安装 sudo apt-get install iperf3iPerf3常用的参数&am…

DVB-S中卫星通信系统的基带仿真(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 ​数字视频广播(DVB)在卫星通信数字多媒体业务领域应用广泛,其一般采用MPEG-2编码、数字传输和纠错处理等通用技术,然而,当第三方…

Linux 设备驱动程序(三)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核&#xff08;一&#xff09; 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;一&#xff09; Linux 设备驱动程序&#xff08;二&#xff09; Linux 设备驱动程序&#xff08;三&#xf…

提高电商团队效率:必备的协作工具盘点

随着电商行业的快速发展&#xff0c;电商团队的规模和任务不断增加。然而&#xff0c;文件管理和文件协作方面的问题也随之出现。 电商行业可能存在的问题&#xff1a; 文件传输效率低下&#xff1a;电商团队需要频繁地共享和传输大量的文件&#xff0c;这会导致文件传输效率低…