浅析Arm Linux操作系统调用流程详细解析 .

发布者:等放假的zr0最新更新时间:2016-06-20 来源: eefocus关键字:Arm  Linux  操作系统  调用流程 手机看文章 扫描二维码
随时随地手机看文章
   系统调用是os操作系统提供的服务,用户程序通过各种系统调用,来引用内核提供的各种服务,系统调用的执行让用户程序陷入内核,该陷入动作由swi软中断完成.

At91rm9200处理器对应的linux2.4.19内核系统调用对应的软中断定义如下:

#if defined(__thumb__)         //thumb模式
#define __syscall(name)/
    "push    {r7}/n/t" /
    "mov    r7, #" __sys1(__NR_##name) "/n/t"  /
    "swi    0/n/t" /
    "pop    {r7}"
#else                        //arm模式
#define __syscall(name) "swi/t" __sys1(__NR_##name) "/n/t"
#endif

#define __sys2(x) #x
#define __sys1(x) __sys2(x)
#define __NR_SYSCALL_BASE    0x900000                        //此为OS_NUMBER << 20运算值
#define __NR_open            (__NR_SYSCALL_BASE+ 5)    //0x900005

举一个例子来说:open系统调用,库函数最终会调用__syscall (open),宏展开之后为swi #__NR_open,即,swi #0x900005触发中断,中断号0x900005存放在[lr,#-4]地址中,处理器跳转到arch/arm/kernel/entry- common.S中vector_swi读取[lr,#-4]地址中的中断号,之后查询arch/arm/kernel/entry-common.S中的sys_call_table系统调用表,该表内容在arch/arm/kernel/calls.S中定义,__NR_open在表中对应的顺序号为

__syscall_start:

...
.long    SYMBOL_NAME(sys_open)                                               //第5个
...
将sys_call_table[5]中内容传给pc,系统进入sys_open函数,处理实质的open动作

注:用到的一些函数数据所在文件,如下所示
arch/arm/kernel/calls.S声明了系统调用函数
include/asm-arm/unistd.h定义了系统调用的调用号规则

vector_swi定义在arch/arm/kernel/entry-common.S
vector_IRQ定义在arch/arm/kernel/entry-armv.S
vector_FIQ定义在arch/arm/kernel/entry-armv.S

arch/arm/kernel/entry-common.S中对sys_call_table进行了定义:
    .type    sys_call_table, #object
ENTRY(sys_call_table)
#include "calls.S"                                                                                //将calls.S中的内容顺序链接到这里

源程序:

ENTRY(vector_swi)
    save_user_regs
    zero_fp
    get_scno                                        //将[lr,#-4]中的中断号转储到scno(r7)
    arm710_bug_check scno, ip
#ifdef CONFIG_ALIGNMENT_TRAP
    ldr    ip, __cr_alignment
    ldr    ip, [ip]
    mcr    p15, 0, ip, c1, c0                       @ update control register
#endif
    enable_irq ip

    str    r4, [sp, #-S_OFF]!                       @ push fifth arg

    get_current_task tsk
    ldr    ip, [tsk, #TSK_PTRACE]                   @ check for syscall tracing
    bic    scno, scno, #0xff000000                  @ mask off SWI op-code
//#define OS_NUMBER    9[entry-header.S]
//所以对于上面示例中open系统调用号scno=0x900005
//eor scno,scno,#0x900000
//之后scno=0x05
    eor    scno, scno, #OS_NUMBER << 20             @ check OS number
//sys_call_table项为calls.S的内容
    adr    tbl, sys_call_table                      @ load syscall table pointer
    tst    ip, #PT_TRACESYS                         @ are we tracing syscalls?
    bne    __sys_trace

    adrsvc    al, lr, ret_fast_syscall              @ return address
    cmp    scno, #NR_syscalls                       @ check upper syscall limit
//执行sys_open函数
    ldrcc    pc, [tbl, scno, lsl #2]                @ call sys_* routine
    add    r1, sp, #S_OFF
2:  mov    why, #0                                  @ no longer a real syscall
    cmp    scno, #ARMSWI_OFFSET
    eor    r0, scno, #OS_NUMBER << 20               @ put OS number back
    bcs    SYMBOL_NAME(arm_syscall)    
    b    SYMBOL_NAME(sys_ni_syscall)                @ not private func
    /*
     * This is the really slow path. We're going to be doing
     * context switches, and waiting for our parent to respond.
     */
__sys_trace:
    add    r1, sp, #S_OFF
    mov    r0, #0                                   @ trace entry [IP = 0]
    bl    SYMBOL_NAME(syscall_trace)
/*
//2007-07-01 gliethttp [entry-header.S]
//Like adr, but force SVC mode (if required)
  .macro adrsvc, cond, reg, label
     adr/cond /reg, /label
  .endm
//对应反汇编:
//add lr, pc, #16 ; lr = __sys_trace_return
*/
    adrsvc    al, lr, __sys_trace_return            @ return address
    add    r1, sp, #S_R0 + S_OFF                    @ pointer to regs
    cmp    scno, #NR_syscalls                       @ check upper syscall limit
    ldmccia    r1, {r0 - r3}                        @ have to reload r0 - r3
    ldrcc    pc, [tbl, scno, lsl #2]                @ call sys_* routine
    b    2b

__sys_trace_return:
    str    r0, [sp, #S_R0 + S_OFF]!                 @ save returned r0
    mov    r1, sp
    mov    r0, #1                                   @ trace exit [IP = 1]
    bl    SYMBOL_NAME(syscall_trace)
    b    ret_disable_irq

    .align    5
#ifdef CONFIG_ALIGNMENT_TRAP
    .type    __cr_alignment, #object
__cr_alignment:
    .word    SYMBOL_NAME(cr_alignment)
#endif

    .type    sys_call_table, #object
ENTRY(sys_call_table)
#include "calls.S"
关键字:Arm  Linux  操作系统  调用流程 引用地址:浅析Arm Linux操作系统调用流程详细解析 .

上一篇:ARM Linux中断向量表搬移设计过程
下一篇:Ubuntu9.10在ARM上建立NFS服务

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

ARM编程:ARM初始化,堆栈地址是怎样计算的
USR_STACK_LEGTH EQU 64 SVC_STACK_LEGTH EQU 0 FIQ_STACK_LEGTH EQU 16 IRQ_STACK_LEGTH EQU 64 ABT_STACK_LEGTH EQU 0 UND_STACK_LEGTH EQU 0 ; 名称:InitStack ; 功能:堆栈初始化,即初始化各模式下的堆栈指针。 ; 入口参数:无 ; 出口参数:无 ; 说明:在特权模式下调用此子程序,比如复位后的管理模式 InitStack
[单片机]
加深对ARM汇编中对stmfd和ldmfd的理解
AREA STMFD,CODE,READONLY ENTRY CODE32 START sub sp,sp,#4 ;经过此条语句过后,sp的值由原来的0变为了0xfffffffc mov r0,#0x1d ;将0x1d赋值给r0寄存器 mov r1,#0x1c ;将0x1c赋值给r1寄存器 stmfd sp!,{r0} ;将r0中的值压入堆栈,压入过程是,由于r0中的值为32位的,首先将sp减去4,将r0中的低八位放入sp这个位置(即fffffff8处放的是0x1d) 第九位到第十六位放入sp+1的地址即(fffffff9处放的是0x00),将第十七位到第二十四位放入sp+2的位置(
[单片机]
揭秘iMac Pro上那颗神秘芯片:可真不简单
   iMac  Pro来了,经过试用,人们给了它各种各样的评价,但总结起来其实也就是四个字 —— 性能怪兽。这点其实没有疑问,毕竟 iMac  Pro这一上来就是冲着这一点去的。跑分成绩,中端级的 iMac  Pro比高端的Mac Pro还要快45%,可以想见它有多可怕。下面就随嵌入式小编一起来了解一下相关内容吧。   不过老实说,iMac Pro除了那可怕的硬件性能外,真正值得我们去津津乐道的倒反不多。说来说去,配置规格就是高嘛,用来完成专业任务就是更快更顺手嘛。毕竟,iMac Pro可是带着“Pro”的,要多挖出点什么具体的感想,那还得专精某个方向才行。   所以我们倒不如先来聊一聊iMac Pro的那颗T2芯片。我们最早
[嵌入式]
传Google新Chrome OS系统将支持ARM芯片
此前,Google 曾非常明确表示,Chrome OS不会局限于上网本,另外,如果有可能也会支持各种设备,包括基于ARM的智能本和平板机。 我们可以从 Chromium OS 系统项目中看到,Chrome OS将会和以ARM芯片为核心处理器的设备完美匹配。其中最快的ARM 芯片之一“三星 Exynos 5250 ”将会出现在一款代号为“Daisy”的新硬件设备中。只是到现在为止,我们还找不到这款神秘新设备的更多信息,但可以确信的是,google现在正紧锣密鼓地忙于研发基于ARM芯片的新设备。 Chrome OS基于Linux内核,在Chrome OS源代码的主分支中,ARM十分活跃,三星S5PC110和S5PV2
[手机便携]
嵌入式操作系统VxWorks中TFFS文件系统的构建
摘要:目前的嵌入式系统多使用FLASH作为主存,因此,如何有效管理FLASH上的数据非常重要。文章以MX29LV160BT芯片为例,讨论了在VxWorks操作系统下Nor Flash上建立TFFS文件系统的一般步骤,从而为FLASH上的数据管理提供了理想的选择方式,同时也为开发者和用户升级程序提供了方便。 关键词:VxWorks Flash MTD TFFS 文件系统 嵌入式系统正随着Internet的发展而在各个领域得到广泛的应用,作为一个优秀的操作系统,VxWorks实现了比其他实时操作系统更好的有效性、商用性、可裁减性以及互操作性,广泛应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事
[嵌入式]
ARM架构下GCC中progma编译指示字
ARM架构下GCC中progma编译指示字 主要说#pragma pack() 1.为什么要内存对齐 2.裸机代码验证ARM9(S3C2440)的默认对齐字节数 (还不能证实) 3.验证奇数地址访问的可行性 (经实现可以看出,没有对奇数地址有特别要求) 4.struct大小
[单片机]
<font color='red'>ARM</font>架构下GCC中progma编译指示字
英特尔CEO:ARM版Win8平板不足为惧
    英特尔CEO欧德宁在最近的投资者年度会议上表示:“我们的首款手机获得了极好的评价。我们有野心,随着时间的推移,你会看到更多新品出炉,手机上会有更多更酷的功能。” 许多投资者都在期待新手机在消费者中成功,之后才能证明英特尔在移动市场成了重量级玩家。最近几个月,人们越来越期待英特尔在市场上获得更多份额。 在PC市场,英特尔正在力推超级本,它与苹果的MacBook Air相似,并提供一些iPad及其它平板拥有的新技术。   一些投资者担心超级本组件价格太高,比如固态硬盘,从而使得售价超出消费者的承受力。投资者担心英特尔会牺牲处理器利润率,让超级本价格变得更适宜。   欧德宁表示,销售正进入正轨,会在2012年下半年增长
[手机便携]
基于ARM和蓝牙的无线信号采集系统的设计与实现
1 引 言     无线测试技术在工业领域有广泛的应用前景。在连线复杂并需要反复拆装被测设备和测试设备之间连线的场合,使用无线可以降低工作的复杂程度,节约大量的时间,提高测试环节的工作效率,尤其在有时间限制时其优越性更加明显。此外在不适宜连线的场合,如港口、码头、江河湖坝、野外勘测、石油勘探中油井深处环境参数的测量,使用无线测量具有有线测量无法比拟的优越性。   对于近距离的无线传输,蓝牙由于采用快速跳频技术,确保了链路的稳定,同时使干扰可能造成的影响变得很小,适合用于存在大量噪声干扰的工业测试环境中,由于无线传输的是数字量,因此在通常情况下没有传输误差,不会影响到系统的准确度,并且可以单芯片实现,体积功耗都能达到很小的水平。
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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