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

相关文章

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

Linux基础命令@grep、wc、管道符的使用详解

《Linux基础命令@grep、wc、管道符的使用详解》:本文主要介绍Linux基础命令@grep、wc、管道符的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录grep概念语法作用演示一演示二演示三,带选项 -nwc概念语法作用wc,不带选项-c,统计字节数-

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

Linux CPU飙升排查五步法解读

《LinuxCPU飙升排查五步法解读》:本文主要介绍LinuxCPU飙升排查五步法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录排查思路-五步法1. top命令定位应用进程pid2.php top-Hp[pid]定位应用进程对应的线程tid3. printf"%

Linux下安装Anaconda3全过程

《Linux下安装Anaconda3全过程》:本文主要介绍Linux下安装Anaconda3全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录简介环境下载安装一、找到下载好的文件名为Anaconda3-2018.12-linux-x86_64的安装包二、或者通

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

Linux lvm实例之如何创建一个专用于MySQL数据存储的LVM卷组

《Linuxlvm实例之如何创建一个专用于MySQL数据存储的LVM卷组》:本文主要介绍使用Linux创建一个专用于MySQL数据存储的LVM卷组的实例,具有很好的参考价值,希望对大家有所帮助,... 目录在Centos 7上创建卷China编程组并配置mysql数据目录1. 检查现有磁盘2. 创建物理卷3. 创

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

Linux中的more 和 less区别对比分析

《Linux中的more和less区别对比分析》在Linux/Unix系统中,more和less都是用于分页查看文本文件的命令,但less是more的增强版,功能更强大,:本文主要介绍Linu... 目录1. 基础功能对比2. 常用操作对比less 的操作3. 实际使用示例4. 为什么推荐 less?5.