基于arm的linux系统调用分析

1系统调用的作用

linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用,最简单的如read,write,open等等。用户可以通过系统调用命令在自己的应用程序上调用他们,从某种角度来看,系统调用和普通函数调用非常相似。区别在于系统调用由操作系统核心提供,运行在内核态,而普通函数调用由函数库或用户自己提供,运行于用户态。实际上,很多已经被我们习以为常的C语言标准函数,在linux平台上的实现都是靠系统调用来完成的,所以如果想对系统底层原理作深入的了解,就得掌握各种系统调用时初步的要求。


2 系统调用是如何工作的

我们知道一般进程是不能访问内核的,系统调用时用户空间访问内核空间唯一合法的途径。早期linux采用OABI方式传递系统调用的number。现在linux采用新的EABI(Embedded)方式传递系统调用的number。我们主要了解EABI的方式,关于OABI的方式这里就不说了。现在的android编译器arm-linux-androideabi-gcc使用的就是EABI方式。这种新的系统调用方式流程如下:
1.将syscall number 存储到r7寄存器中。
2. 执行swi指令跳转到软中断处执行,并从r7中获取syscall number。
注意这里提到的软中断是 supervisor call exception(svc),由于原来名字是software interrupt(swi)一直沿用软中断的叫法。
如果应用程序中有read函数,系统调用里也有read函数,如何从应用程序中找到内核空间中的read函数呢,需要使用swi指令,内核中有很多系统调用函数,read,write,open等等,内核如何知道调用的是哪个函数呢,这里需要用到一个寄存器r7,这个寄存器我们之后还会谈到。
在内核源码中,arch\arm\kernel中有一个文件entry-common.S汇编代码,这段代码是应用程序访问内核的接口,下面给出部分代码。

ENTRY(vector_swi)
    sub sp, sp, #S_FRAME_SIZE
    stmia   sp, {
  r0 - r12}          @ Calling r0 - r12
 ARM(   add r8, sp, #S_PC       )
 ARM(   stmdb   r8, {sp, lr}^       )   @ Calling sp, lr
 THUMB( mov r8, sp          )
 THUMB(
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值