arm linux vector_swi分析

2023-11-30 12:58
文章标签 分析 linux vector arm swi

本文主要是介绍arm linux vector_swi分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

linux 4.9 aarch32

如下图中断、异常和系统调用的flow,中断一般是异步的硬件请求,异常通常是应用程序的错误触发,系统调用是应用程序对内核的功能请求

发生swi后进入系统中断向量然后执行vector_swi,源代码分析如下(CONFIG_AEABI):

/*=============================================================================* SWI handler*-----------------------------------------------------------------------------*/
/*只保留一部分代码*/.align	5
ENTRY(vector_swi)sub	sp, sp, #PT_REGS_SIZE   stmia	sp, {r0 - r12}			@ Calling r0 - r12 ARM(	add	r8, sp, #S_PC		) ARM(	stmdb	r8, {sp, lr}^		)	@ Calling sp, lrTHUMB(	mov	r8, sp			)THUMB(	store_user_sp_lr r8, r10, S_SP	)	@ calling sp, lrmrs	r8, spsr			@ called from non-FIQ mode, so ok.str	lr, [sp, #S_PC]			@ Save calling PCstr	r8, [sp, #S_PSR]		@ Save CPSRstr	r0, [sp, #S_OLD_R0]		@ Save OLD_R0zero_fpalignment_trap r10, ip, __cr_alignment  /*对齐检查*/enable_irq /*使能中断*/ct_user_exitget_thread_info tsk  /*进程的内核栈与thread_info放在相邻的两页*//** Get the system call number.*/uaccess_disable tbladr	tbl, sys_call_table		@ load syscall table pointerlocal_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 limitbadr	lr, ret_fast_syscall		@ return address /*手动设置sys_*返回到ret_fast_syscall */ldrcc	pc, [tbl, scno, lsl #2]		@ call sys_* routine
/*Pure EABI user space always put syscall number into scno (r7). table是4字节对齐所以要用lsl把scno左移两位作table偏移,跳到对应的syscall 对应表项*/ENDPROC(vector_swi)

执行sys_*函数后返回到ret_fast_syscall函数


/** This is the fast syscall return path.  We do as little as possible here,* such as avoiding writing r0 to the stack.  We only use this path if we* have tracing and context tracking disabled - the overheads from those* features make this path too inefficient.*/
ret_fast_syscall:UNWIND(.fnstart	)UNWIND(.cantunwind	)disable_irq_notrace			@ disable interruptsldr	r1, [tsk, #TI_FLAGS]		@ re-check for syscall tracingtst	r1, #_TIF_SYSCALL_WORK | _TIF_WORK_MASKbne	fast_work_pending /*检查是否有事情要做,比如signal处理 schedule处理等*//* perform architecture specific actions before user return */arch_ret_to_user r1, lr  /*arch 相关返回用户空间要做的事*/restore_user_regs fast = 1, offset = S_OFF /*恢复用户空间现场,执行MOVS pc, lr时,CPSR会被SPSR覆盖,这条命令就cpu就恢复了user模式*/UNWIND(.fnend		)
ENDPROC(ret_fast_syscall)/* Ok, we need to do extra processing, enter the slow path. */
fast_work_pending:str	r0, [sp, #S_R0+S_OFF]!		@ returned r0/* fall through to work_pending */tst	r1, #_TIF_SYSCALL_WORKbne	__sys_trace_return_nosave
slow_work_pending:mov	r0, sp				@ 'regs'mov	r2, why				@ 'syscall'bl	do_work_pendingcmp	r0, #0beq	no_work_pendingmovlt	scno, #(__NR_restart_syscall - __NR_SYSCALL_BASE)ldmia	sp, {r0 - r6}			@ have to reload r0 - r6b	local_restart			@ ... and off we go
ENDPROC(ret_fast_syscall)

system call 返回用户空间要做的事情_TIF_SYSCALL_WORK | _TIF_WORK_MASK 定义在thread_info.h中

/** thread information flags:*  TIF_USEDFPU		- FPU was used by this task this quantum (SMP)*  TIF_POLLING_NRFLAG	- true if poll_idle() is polling TIF_NEED_RESCHED*/
#define TIF_SIGPENDING		0	/* signal pending */
#define TIF_NEED_RESCHED	1	/* rescheduling necessary */
#define TIF_NOTIFY_RESUME	2	/* callback before returning to user */
#define TIF_UPROBE		3	/* breakpointed or singlestepping */
#define TIF_SYSCALL_TRACE	4	/* syscall trace active */
#define TIF_SYSCALL_AUDIT	5	/* syscall auditing active */
#define TIF_SYSCALL_TRACEPOINT	6	/* syscall tracepoint instrumentation */
#define TIF_SECCOMP		7	/* seccomp syscall filtering active */#define TIF_NOHZ		12	/* in adaptive nohz mode */
#define TIF_USING_IWMMXT	17
#define TIF_MEMDIE		18	/* is terminating due to OOM killer */
#define TIF_RESTORE_SIGMASK	20#define _TIF_SIGPENDING		(1 << TIF_SIGPENDING)
#define _TIF_NEED_RESCHED	(1 << TIF_NEED_RESCHED)
#define _TIF_NOTIFY_RESUME	(1 << TIF_NOTIFY_RESUME)
#define _TIF_UPROBE		(1 << TIF_UPROBE)
#define _TIF_SYSCALL_TRACE	(1 << TIF_SYSCALL_TRACE)
#define _TIF_SYSCALL_AUDIT	(1 << TIF_SYSCALL_AUDIT)
#define _TIF_SYSCALL_TRACEPOINT	(1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_SECCOMP		(1 << TIF_SECCOMP)
#define _TIF_USING_IWMMXT	(1 << TIF_USING_IWMMXT)/* Checks for any syscall work in entry-common.S */
#define _TIF_SYSCALL_WORK (_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \_TIF_SYSCALL_TRACEPOINT | _TIF_SECCOMP)/** Change these and you break ASM code in entry-common.S*/
#define _TIF_WORK_MASK		(_TIF_NEED_RESCHED | _TIF_SIGPENDING | \_TIF_NOTIFY_RESUME | _TIF_UPROBE)

以signal处理为例

do_work_pending(struct pt_regs *regs, unsigned int thread_flags, int syscall)
{/** The assembly code enters us with IRQs off, but it hasn't* informed the tracing code of that for efficiency reasons.* Update the trace code with the current status.*/trace_hardirqs_off();do {if (likely(thread_flags & _TIF_NEED_RESCHED)) {schedule(); /*schedule 当前进程出去*/} else {if (unlikely(!user_mode(regs)))return 0;local_irq_enable();if (thread_flags & _TIF_SIGPENDING) {int restart = do_signal(regs, syscall);/*处理当前进程挂起的信号*/if (unlikely(restart)) {/** Restart without handlers.* Deal with it without leaving* the kernel space.*/return restart;}syscall = 0;} else if (thread_flags & _TIF_UPROBE) {uprobe_notify_resume(regs);} else {clear_thread_flag(TIF_NOTIFY_RESUME);tracehook_notify_resume(regs);}}local_irq_disable();thread_flags = current_thread_info()->flags;} while (thread_flags & _TIF_WORK_MASK); /*事情做完才会继续返回用户空间*/return 0;
}

 

这篇关于arm linux vector_swi分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/437118

相关文章

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Linux换行符的使用方法详解

《Linux换行符的使用方法详解》本文介绍了Linux中常用的换行符LF及其在文件中的表示,展示了如何使用sed命令替换换行符,并列举了与换行符处理相关的Linux命令,通过代码讲解的非常详细,需要的... 目录简介检测文件中的换行符使用 cat -A 查看换行符使用 od -c 检查字符换行符格式转换将

Go标准库常见错误分析和解决办法

《Go标准库常见错误分析和解决办法》Go语言的标准库为开发者提供了丰富且高效的工具,涵盖了从网络编程到文件操作等各个方面,然而,标准库虽好,使用不当却可能适得其反,正所谓工欲善其事,必先利其器,本文将... 目录1. 使用了错误的time.Duration2. time.After导致的内存泄漏3. jsO

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1