1. SWI软中断

以ARMV7 A/R架构为例, SWI软中断和中断一样,内核空间处理始于异常向量表。Linux向量表默认地址0XFFFF0000,SWI向量偏移8字节为0xFFFF0008:

具体代码,位于 \linux-3.4.x\arch\arm\kernel\entry-armv.S:

__vectors_start:

ARM( swi SYS_ERROR0 )

THUMB( svc #0)

THUMB( nop )

W(b) vector_und+stubs_offset

W(ldr) pc, .LCvswi+stubs_offset

W(b) vector_pabt+stubs_offset

W(b) vector_dabt+stubs_offset

W(b) vector_addrexcptn+stubs_offset

W(b) vector_irq+stubs_offset

W(b) vector_fiq+stubs_offset

.globl __vectors_end

__vectors_end:

.LCvswi:

.word vector_swi

vector_swi的具体实现,位于 linux_plat\base\linux\linux-3.4.x\arch\arm\kernel\entry-common.S:

1 ENTRY(vector_swi)2 sub sp, sp, #S_FRAME_SIZE3 stmia sp, {r0 - r12} @ Calling r0 -r124 ARM( add r8, sp, #S_PC )5 ARM( stmdb r8, {sp, lr}^) @ Calling sp, lr6 THUMB( mov r8, sp )7 THUMB( store_user_sp_lr r8, r10, S_SP ) @ calling sp, lr8 mrs r8, spsr @ called from non-FIQ mode, so ok.9 str lr, [sp, #S_PC] @ Save calling PC10 str r8, [sp, #S_PSR] @ Save CPSR11 str r0, [sp, #S_OLD_R0] @ Save OLD_R012 zero_fp13

14 /*

15 * Get the system call number.16 */

17

18 #if defined(CONFIG_OABI_COMPAT)

19

20 /*

21 * If we have CONFIG_OABI_COMPAT then we need to look at the swi22 * value to determine if it is an EABI or an old ABI call.23 */

24 #ifdef CONFIG_ARM_THUMB25 tst r8, #PSR_T_BIT26 movne r10, #0@ no thumb OABI emulation27 ldreq r10, [lr, #-4] @ getSWI instruction28 #else

29 ldr r10, [lr, #-4] @ getSWI instruction30 A710( and ip, r10, #0x0f000000 @ check forSWI )31 A710( teq ip, #0x0f000000)32 A710( bne .Larm710bug )33 #endif

34 #ifdef CONFIG_CPU_ENDIAN_BE835 rev r10, r10 @ little endian instruction36 #endif

37

38 #elif defined(CONFIG_AEABI)

39

40 /*

41 * Pure EABI user space always put syscall number into scno (r7).42 */

43 A710( ldr ip, [lr, #-4] @ getSWI instruction )44 A710( and ip, ip, #0x0f000000 @ check forSWI )45 A710( teq ip, #0x0f000000)46 A710( bne .Larm710bug )47

48 #elif defined(CONFIG_ARM_THUMB)

49

50 /*Legacy ABI only, possibly thumb mode.*/

51 tst r8, #PSR_T_BIT @ this is SPSR fromsave_user_regs52 addne scno, r7, #__NR_SYSCALL_BASE @ put OS number in

53 ldreq scno, [lr, #-4]54

55 #else

56

57 /*Legacy ABI only.*/

58 ldr scno, [lr, #-4] @ getSWI instruction59 A710( and ip, scno, #0x0f000000 @ check forSWI )60 A710( teq ip, #0x0f000000)61 A710( bne .Larm710bug )62

63 #endif

64

65 #ifdef CONFIG_ALIGNMENT_TRAP66 ldr ip, __cr_alignment67 ldr ip, [ip]68 mcr p15, 0, ip, c1, c0 @ update control register69 #endif

70 enable_irq71

72 get_thread_info tsk73 adr tbl, sys_call_table @ load syscall table pointer74

75 #if defined(CONFIG_OABI_COMPAT)

76 /*

77 * If the swi argument is zero, this is an EABI call and we do nothing.78 *79 * If this is an old ABI call, get the syscall number into scno and80 * get the old ABI syscall table address.81 */

82 bics r10, r10, #0xff000000

83 eorne scno, r10, #__NR_OABI_SYSCALL_BASE84 ldrne tbl, =sys_oabi_call_table85 #elif !defined(CONFIG_AEABI)

86 bic scno, scno, #0xff000000 @ mask off SWI op-code87 eor scno, scno, #__NR_SYSCALL_BASE @ check OS number88 #endif

89

90 ldr r10, [tsk, #TI_FLAGS] @ check forsyscall tracing91 stmdb sp!, {r4, r5} @ push fifth and sixth args92

93 #ifdef CONFIG_SECCOMP94 tst r10, #_TIF_SECCOMP95 beq 1f96 mov r0, scno97 bl __secure_computing98 add r0, sp, #S_R0 +S_OFF @ pointer to regs99 ldmia r0, {r0 - r3} @ have to reload r0 -r3100 1:101 #endif

102

103 tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls?

104 bne __sys_trace105

106 cmp scno, #NR_syscalls @ check upper syscall limit107 adr lr, BSYM(ret_fast_syscall) @ returnaddress108 ldrcc pc, [tbl, scno, lsl #2] @ call sys_*routine109

110 add r1, sp, #S_OFF111 2: mov why, #0@ no longer a real syscall112 cmp scno, #(__ARM_NR_BASE -__NR_SYSCALL_BASE)113 eor r0, scno, #__NR_SYSCALL_BASE @ put OS number back114 bcs arm_syscall115 b sys_ni_syscall @ not privatefunc116 ENDPROC(vector_swi)

这个vector_swi函数完成的工作:

1. 保护异常前的现场

保存现场大小为S_FRAME_SIZE,大小是一个完整的寄存器栈帧:

DEFINE(S_FRAME_SIZE, sizeof(structpt_regs));structpt_regs {long uregs[18];

};

#define ARM_cpsr uregs[16]

#define ARM_pc  uregs[15]

#define ARM_lr  uregs[14]

#define ARM_sp  uregs[13]

#define ARM_ip  uregs[12]

#define ARM_fp  uregs[11]

#define ARM_r10  uregs[10]

#define ARM_r9  uregs[9]

#define ARM_r8  uregs[8]

#define ARM_r7  uregs[7]

#define ARM_r6  uregs[6]

#define ARM_r5  uregs[5]

#define ARM_r4  uregs[4]

#define ARM_r3  uregs[3]

#define ARM_r2  uregs[2]

#define ARM_r1  uregs[1]

#define ARM_r0  uregs[0]

#define ARM_ORIG_r0 uregs[17]

从现场可以看出,每次用户空间向内核空间切换时,线程内核栈会保留一份完整的寄存器现场,保存地址在内核栈的(最高地址-8):

线程内核栈基地址:0xc288a000

线程内核栈最高地址:0xc288a000+8k = 0xc288c000

保存形式:

=============================低地址

R0        R1           R2          R3

R4        R5           R6          R7

R8        R9           R10        R11

R12       SP           LR         PC

CPSR   R0_OLD    X          X

========================== kernel stack start(最高地址)

#define THREAD_SIZE 8192

#define THREAD_START_SP (THREAD_SIZE - 8)

原文:https://www.cnblogs.com/DF11G/p/10172520.html

保护linux系统调用,Linux软中断与系统调用相关推荐

  1. linux wenj 立即生效_Linux系统调用(转载)

    目录: 1. Linux系统调用原理 2. 系统调用的实现 3. Linux系统调用分类及列表 4.系统调用.用户编程接口(API).系统命令和内核函数的关系 5. Linux系统调用实例 6. Li ...

  2. Linux系统的中断、系统调用和调度概述【转】

    转自:http://blog.csdn.net/yanlinwang/article/details/8169725 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近学习Linux操作系统, ...

  3. Linux内核设计与实现---系统调用

    系统调用 1 API.POSIX和C库 2 系统调用 系统调用号 3 系统调用处理程序 指定恰当的系统调用 参数传递 4 系统调用的实现 参数验证 5 系统调用上下文 绑定一个系统调用的最后步骤 从用 ...

  4. linux内核编译系统调用,linux编译内核及添加系统调用

    我们都知道系统功能调用是Unix/Linux操作系统向用户程序提供支持的接口,通过这些接口应用程序向操作系统请求服务,控制转向操作系统,而操作系统在完成服务后,将控制和结果返回给用户程序. 系统调用的 ...

  5. linux 进程 系统调用,linux进程与系统调用

    进程管理 linux系统的实现非常特别:他对线程和进程并不特别区分.对linux而言,线程只不过是一种特殊的进程罢了. 现代操作系统中,进程提供两种虚拟机制:虚拟处理器和虚拟内存.虽然实际上可能是许多 ...

  6. 【Linux】Linux系统调用

    Linux系统调用 前言 操作系统--管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务. 操作系统内核--操作系统的内核,负责管理系统的进程.内存.设备驱动程序. ...

  7. Linux系统调用号列表、系统调用的三种方式

    文章目录 Linux系统调用号 什么是Linux系统调用号 系统调用的三种方式 参考 Linux系统调用号 什么是Linux系统调用号 在Linux中,每个系统调用被赋予一个系统调用号.这样,**通过 ...

  8. linux内核syscall_define6,Syscall系统调用Linux内核跟踪

    在Linux的用户空间,我们经常会调用系统调用,下面我们跟踪一下read系统调用,使用的Linux内核版本为Linux2.6.37.不同的Linux版本其中的实现略有不同. 在一些应用中我们可以看到下 ...

  9. 向linux内核增加新的系统调用,为linux内核添加新的系统调用

    为linux内核添加新的系统调用 作者:李志勇 更多精彩: 更多精彩: 开发平台:x86 ubuntu 目标平台:S3C6410 linux3.4.4 一.    打开内核源码目录下arch/arm/ ...

  10. Linux内存管理 brk(),mmap()系统调用源码分析2:brk()的内存释放流程

    Linux brk(),mmap()系统调用源码分析 brk()的内存释放流程 荣涛 2021年4月30日 内核版本:linux-5.10.13 注释版代码:https://github.com/Rt ...

最新文章

  1. 算法(掘金上经典的文档)
  2. [翻译] ObjectAL for iPhone and Mac(持续更新)
  3. python的import与from...import的不同之处
  4. Qt 原理-MOC(1)Meta Object Compiler
  5. 第 19 课时:调度器的调度流程和算法介绍(木苏)
  6. pcb地线应该不应该做成环路_PCB制板的基础知识,你都学会了吗?(中)
  7. mysql group_concat
  8. 前端学习(847):H5自定义属性
  9. 到底什么才是用户体验度
  10. 天玑800处理器支持鸿蒙系统吗,为何Redmi Note 9选择天玑800U处理器?和骁龙750G差距多大...
  11. !/usr/bin/env python和!/usr/bin/python的区别
  12. QQ去除未读状态的动画
  13. apache和php结合、apache的默认虚拟主机
  14. 计算机网络断开后怎么连接,电脑网络断开怎样重新连接
  15. Autodesk Inventor参数化建模简明教程
  16. 使用vue扫描扫描仪图像
  17. 计算机可以计算出十的一百次方吗,世界上最大的数字单位 古戈尔(1古戈尔等于10的100次方)...
  18. IOS开发音频与视频
  19. 总结:IOTA反驳DCI实验室提出的漏洞荒谬至极
  20. 网站如何防止DDOS攻击?

热门文章

  1. CentOS 7 安装 PostgreSQL 教程
  2. linux 安装 apache+mysql+php
  3. 网络爬虫-python-爬取天涯求职贴
  4. SQL Server中count(*), count(col), count(1)的对比
  5. mac 从终端打开应用程序
  6. scanf函数详解与缓冲区
  7. fzu 1686(DLX 重复点覆盖)
  8. jQuery:收集一些基于jQuery框架开发的控件/jquery插件2
  9. 唐骏管理学之感动员工
  10. mac Hbuilder 无法打开的解决方案