Arm linux 系统调用分析

发布者:山宝宝最新更新时间:2016-06-15 来源: eefocus关键字:Arm  linux  系统调用 手机看文章 扫描二维码
随时随地手机看文章
Arm linux 系统调用分析
概述

操作系统为在用户态运行的进程与硬件设备进行交互,提供操作系统的系统服务,提供了一组接口。在应用程序和硬件之间,内核提供的系统服务设置一个额外层具有很多优点。

首先,这使得编程更加容易,把用户从学习硬件设备的低级编程特性中解放出来。

其次,这极大地提高了系统的安全性,因为内核在试图满足某个请求之前在接口级就可以检查这种请求的正确性。

最后, 更重要的是这些接口使得程序具有可移植性,因为只要内核所提供的一组接口相同,那么在任一内核之上就可以正确地编译和执行程序。

 

Arm linux 系统调用分析
 

ARM Linux系统利用SWI指令来从用户空间进入内核空间,还是先让我们了解下这个SWI指令吧。SWI指令用于产生软件中断,从而实现从用户模式到管理模 式的变换,CPSR保存到管理模式的SPSR,执行转移到SWI向量。在其他模式下也可使用SWI指令,处理器同样地切换到管理模式。指令格式如下:

SWI{cond} immed_24

其中:

immed_24  24位立即数,值为从0——16777215之间的整数。

使用SWI指令时,通常使用以下两种方法进行参数传递,SWI异常处理程序可以提供相关的服务,这两种方法均是用户软件协定。

1) 指令中24位的立即数指定了用户请求的服务类型,参数通过通用寄存器传递。SWI异常处理程序要通过读取引起软件中断的SWI指令,以取得24为立即数。如:

MOV R0,#34

SWI 12

2) 指令中的24位立即数被忽略,用户请求的服务类型由寄存器R0的值决定,参数通过其他的通用寄存器传递。如:

MOV R0, #12

MOV R1, #34

SWI 0

Arm Linux内核处理系统调用

 

 

 

  1. 在分析arm中断处理过程中我们提到过arm架构中的异常处理向量表,其中有一个地址就是处理swi软件中断的入口。
  2.  
  3. .globl __vectors_start
  4.  
  5. __vectors_start:
  6.  
  7. swi SYS_ERROR0:
  8.  
  9. b vector_und + stubs_offset
  10.  
  11. ldr pc, .LCvswi + stubs_offset
  12.  
  13. b vector_pabt + stubs_offset
  14.  
  15. b vector_dabt + stubs_offset
  16.  
  17. b vector_addrexcptn + stubs_offset
  18.  
  19. b vector_irq + stubs_offset
  20.  
  21. b vector_fiq + stubs_offset
  22.  
  23. .globl __vectors_end:
  24.  
  25. __vectors_end:
  26.  
  27. Cpu执行上面红色指令之后跳转到entry-common.s执行vector_swi处的指令,该函数就是内核中处理系统调用的入口。

  1. 在用户态调用swi指令,cpu从user状态切换到svc状态。首先需要执行的就是保存cpu现场,这样才能在陷入内核态执行了相应的系统调用处理过程之后,恢复cpu用户态的状态,重新执行用户态进程。
  2.  
  3. ENTRY(vector_swi)
  4.  
  5. sub sp, sp, #S_FRAME_SIZE
  6.  
  7. stmia sp, {r0 - r12} @ Calling r0 - r12
  8.  
  9. add r8, sp, #S_PC
  10.  
  11. stmdb r8, {sp, lr}^ @ Calling sp, lr
  12.  
  13. mrs r8, spsr @ called from non-FIQ mode, so ok.
  14.  
  15. str lr, [sp, #S_PC] @ Save calling PC
  16.  
  17. str r8, [sp, #S_PSR] @ Save CPSR
  18.  
  19. str r0, [sp, #S_OLD_R0] @ Save OLD_R0
  20.  
  21. zero_fp
  22.  
  23. BLANK();
  24.  
  25. DEFINE(S_R0, offsetof(struct pt_regs, ARM_r0));
  26.  
  27. DEFINE(S_R1, offsetof(struct pt_regs, ARM_r1));
  28.  
  29. DEFINE(S_R2, offsetof(struct pt_regs, ARM_r2));
  30.  
  31. DEFINE(S_R3, offsetof(struct pt_regs, ARM_r3));
  32.  
  33. DEFINE(S_R4, offsetof(struct pt_regs, ARM_r4));
  34.  
  35. DEFINE(S_R5, offsetof(struct pt_regs, ARM_r5));
  36.  
  37. DEFINE(S_R6, offsetof(struct pt_regs, ARM_r6));
  38.  
  39. DEFINE(S_R7, offsetof(struct pt_regs, ARM_r7));
  40.  
  41. DEFINE(S_R8, offsetof(struct pt_regs, ARM_r8));
  42.  
  43. DEFINE(S_R9, offsetof(struct pt_regs, ARM_r9));
  44.  
  45. DEFINE(S_R10, offsetof(struct pt_regs, ARM_r10));
  46.  
  47. DEFINE(S_FP, offsetof(struct pt_regs, ARM_fp));
  48.  
  49. DEFINE(S_IP, offsetof(struct pt_regs, ARM_ip));
  50.  
  51. DEFINE(S_SP, offsetof(struct pt_regs, ARM_sp));
  52.  
  53. DEFINE(S_LR, offsetof(struct pt_regs, ARM_lr));
  54.  
  55. DEFINE(S_PC, offsetof(struct pt_regs, ARM_pc));
  56.  
  57. DEFINE(S_PSR, offsetof(struct pt_regs, ARM_cpsr));
  58.  
  59. DEFINE(S_OLD_R0, offsetof(struct pt_regs, ARM_ORIG_r0));
  60.  
  61. DEFINE(S_FRAME_SIZE, sizeof(struct pt_regs));
  62.  
  63. BLANK();

  1. ldr r10, [lr, #-4] @ get SWI instruction
  2.  
  3. 之后,将swi指令保存在r10寄存器中
  4.  
  5. enable_irq
  6.  
  7. get_thread_info tsk
  8.  
  9. adr tbl, sys_call_table @ load syscall table pointer
  10.  
  11. ldr ip, [tsk, #TI_FLAGS] @ check for syscall tracing
  12.  
  13. 开启中断,将thread info结构的指针保存在tsk,将sys_call_table的地址保存在tbl中,将thread info结构中的flag保存ip中。
  14.  
  15. scno .req r7 @ syscall number
  16.  
  17. tbl .req r8 @ syscall table pointer
  18.  
  19. why .req r8 @ Linux syscall (!= 0)
  20.  
  21. tsk .req r9 @ current thread_info

  1. bics r10, r10, #0xff000000
  2.  
  3. eorne scno, r10, #__NR_OABI_SYSCALL_BASE
  4.  
  5. ldrne tbl, =sys_oabi_call_table
  6.  
  7. #elif !defined(CONFIG_AEABI)
  8.  
  9. bic scno, scno, #0xff000000 @ mask off SWI op-code
  10.  
  11. eor scno, scno, #__NR_SYSCALL_BASE @ check OS number
  12.  
  13. #endif
  14.  
  15. 检查swi命令中带的中断号是不是为0,如果不等于零说明是是old ABI方式调用的系统调用,这时将sys_oabi_call_table的地址载入到tbl中,同时得到系统调用的中断号,保存在scno中。如果swi指令中带点中断号为0,说明系统调用是利用scno寄存器传递中断号的。利用异或指令,将__NR_SYSCALL_BASE清除掉,得到实际的系统请求号(系统调用号定义为__NR_SYSCALL_BASE+x)。

  1. stmdb sp!, {r4, r5} @ push fifth and sixth args
  2.  
  3. tst ip, #_TIF_SYSCALL_TRACE @ are we tracing syscalls?
  4.  
  5. bne __sys_trace
  6.  
  7. 如果进程带有syscall trace标志就调用sys_trace,这处应该是作为调试用的。
  8.  
  9. cmp scno, #NR_syscalls @ check upper syscall limit
  10.  
  11. adr lr, ret_fast_syscall @ return address
  12.  
  13. ldrcc pc, [tbl, scno, lsl #2] @ call sys_* routine
  14.  
  15. 如果系统调用号,不大于NR_syscalls,就跳转到系统调用函数去执行ldrcc pc, [tbl, scno, lsl #2]

 

总结

Arm系统调用的简单概述。首先是用户态执行swi指令,swi指令使得cpu陷入svc状态,并跳转到固定地址去执行系统调用处理过程。用户态通过两种方法传递给内核执行系统调用的系统调用号。内核执行系统调用处理过程,首先保存cpu现场,之后会获取到系统调用号,以系统调用地址表的基地址,加系统调用号做偏移,跳转到相应的系统调用例程做相应的处理。

关键字:Arm  linux  系统调用 引用地址:Arm linux 系统调用分析

上一篇:arm linux 系统调用实现
下一篇:Arm Linux系统调用流程详细解析

推荐阅读最新更新时间:2024-03-16 14:57

适用于工业和物联网边缘的更安全更高效的i.MX处理器
在嵌入式世界大会2021上,恩智浦(NXP)发布了先进的i.MX 9应用处理器,该处理器在工业和物联网边缘的安全性,能效和可扩展性方面具有改进的性能。对其产品组合的更新通过集成EdgeLock安全区域来增强边缘处理器的安全性,EdgeLock安全区域是一个独立的,自我管理的芯片上的安全子系统,可简化尖端安全技术的部署。 在与EEWeb的采访中,恩智浦边缘处理业务和技术战略负责人Gowri Chindalore,恩智浦产品管理总监Amanda McGregor和边缘处理高级架构师Mohit Arora强调了EdgeVerse产品组合的扩展及其跨界应用,并通过Energy Flex架构最大化效率。 Chindalore表示:“
[嵌入式]
适用于工业和物联网边缘的更安全更高效的i.MX处理器
飞思卡尔首次展示业界最高能效的微控制器
2012年 6月19日,圣安东尼奥(飞思卡尔技术论坛)讯 - 飞思卡尔半导体公司(NYSE:FSL)现在提供业内首款基于ARM Cortex-M0+ 处理器的微控制器(MCU)-Kinetis L series系列的试用样品。Kinetis L series系列器件将于本周在飞思卡尔美国技术论坛(FTF)上亮相,并在活动的开幕主题演讲中进行展示。 随着机器对机器通信的扩展以及网络连接变得无处不在,当今许多独立的、入门级应用将会需要更多智能和功能。飞思卡尔Kinetis L系列的推出,为拥有8位和16位传统架构的用户向32位平台迁移提供了良机,并为日常设备带来额外的智能,但不会增加功耗、成本或体积。小家电、游戏配​​件、便携式医疗
[单片机]
基于ARM9TDMI的简易直流电子负载设计
0 引言 现实生活中负载的形式较为复杂,多为一些动态负载,如:负载消耗的功率是时间的函数;或者负载工作在恒定电流、恒定电阻;负载为瞬时短路负载;以及在仪表测试时,如果想对其输出特性进行可靠、全面且比较简单、快捷的测试等。传统负载不能模拟这些复杂的负载形式,关键在于不能完成自动测试,因此,要实现这些功能离不开电子负载。 目前的电子直流负载由于电路设计和电器元件选择的不完善,导致其不能在较大电流和较高电压下稳定、快速、精确的完成测量任务。本系统采用32位的ARM9TDMI为主控芯片,同时借助外部16位A/D转换芯片ADSlll5的辅助电路,能够保存更多的采样数据,从而减小了采样信号的失真度,实现了稳定快速的实时测量。对硬件电路的设计,
[单片机]
基于<font color='red'>ARM</font>9TDMI的简易直流电子负载设计
用GNU工具开发基于ARM的嵌入式系统
摘要:介绍如何利用GNU的工具开发基于ARM的嵌入式系统,以及使用编译器、连接器和调试工具的具体方法,为广大嵌入式系统开发人员提供一种低成本的开发手段。 关键词:ARM GNU MC928MX1 gcc gdb gdbserver 当前,ARM公司的32位RISC处理器,以其内核耗电少、成本低、功能强、特有16/32位双指令集,已成为移动通信、手持计算、多媒体数字消费等嵌入式解决方案的RISC标准,市场占有率超过了75 %。多家公司都推出了自己的基于ARM内核的处理器产品,越来越多的开发人员开始了针对ARM平台的开发。通常开发人员需要购买芯片厂商或第三方提供的开发板,还需要购买开发软件,如C编译器或者集成了实时操作系统的开
[嵌入式]
基于ARM7的智能拆焊、回流焊台控制系统电路模块设计
  本文采用ARM7作为主控芯片,设计了一种智能拆焊、回流焊台控制系统,可以通过键盘操作控制,通过液晶显示屏显示其所处的状态及实时温度曲线,能对多种集成芯片进行拆和焊,适用于集成电路板的维修和加工。   硬件电路   主要由变压器、整流二极管、滤波电容、集成稳压器等构成,为电路提供5V、3.3V和1.8V的稳定电压。   信号检测电路模块   主要由热电偶、运算放大器27L2、DS18B20及ARM7内部AD等组成。将温度转换成处理器可识别的数字信号。      图2 温度采集电路   本设计的温度采集电路如图2所示,在P6口的1、3引脚接热电偶传感器的正端,2、4引脚接热电偶传感器的负端。热电偶采集到信号后经C00、
[单片机]
基于<font color='red'>ARM</font>7的智能拆焊、回流焊台控制<font color='red'>系统</font>电路模块设计
ARM学习笔记---串口
串口中断 接收标志RI 发送标志TI 4 种串口方式- 配置波特率 控制器之间发送数据:设置好波特率 1.起始位 2.数据位 3.校验位 4.停止位 bit 位 波特率: 4800bit/s、9600bit/s、115200bit/s ...... 字节 = 4800/10 (8数据位+起始位+停止位=10) 通信方式: UART(串口)、IIC、485、SPI ..... 分类:串行和并行,再细分 同步和异步 单片机串口: 是串行异步通信 公头母头 镜像画, ULCON: 线路控制寄存器 :数据位长度、STOP、panty UCON:控制 UTRSTAT: 发送接收状态寄存器 UTXH、URX
[单片机]
<font color='red'>ARM</font>学习笔记---串口
基于ARM7系列芯片嵌入式平台上实现的设计方案解析
系统防掉电设计的目的是:采用一种机制,使得系统在意外失去供电的情况下,可以保证系统运行状态的确定性以及记录数据的完整性;当系统供电恢复后,现场数据可以及时恢复,避免应用系统产生混乱。我们知道,在嵌入式系统设计与开发中越来越多地应用嵌入式操作系统。由于操作系统的引入,数据的读写往往是通过文件的方式完成,而不是直接对存储单元地址操作。用文件读写方式操作数据,在程序的运行过程中往往将数据暂存在易失性的存储空间,如SDRAM,一旦系统意外失电,这些数据往往被丢失。因此,当系统意外失电时必须采取一定的措施进行系统的掉电保护,以避免系统产生混乱。总的说来,防掉电程序的主要思路就是:产生掉电信号,捕捉掉电信号,处理掉电信号和数据以及现场状态
[单片机]
基于<font color='red'>ARM</font>7系列芯片嵌入式平台上实现的设计方案解析
倪光南:商务部可或否了英伟达收购Arm
据新浪财经报道,中国工程院院士倪光南今(27)日出席“第四届信息安全产业发展论坛”并发表了以《在双循环新发展格局下网络安全为新基建保驾护航》为主题的演讲。 倪光南指出,今后在信息领域中国能不能赶超美国,其实关键还在于人才,所以这是我们的优势,也是应该充分发挥的地方。另外,他表示,我国在网信领域的研发投入最集中,创新应用最广泛,辐射带动最大。 倪光南认为华为在信息通讯行业发展的很好,一方面华为的业务包含了思科的全部业务,比思科强,包含了英特尔的很多方面业务,另外还包含了苹果移动通信方面的一些业务;另一方面华为去年的研发人员多达8万人,创新人才世界第一。 此外,倪光南还谈到了英伟达收购Arm的问题,他表示,“Arm原来是英国公司,
[手机便携]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved