您现在的位置: 主页 > 嵌入式处理器 > ARM > armlinux平台调用说明四、系统调用的实现
本文所属标签:
为本文创立个标签吧:

armlinux平台调用说明四、系统调用的实现

来源: 网络用户发布,如有版权联系网管删除 2016-07-01 

armlinux平台调用说明四、系统调用的实现 系统调用利用了ARM体系结构中的软件中断,软件中断和我们常说的中断(硬件中断)不同之处在于———它是通过软件指令触发而并非外设,也就是说由编程人员发出的一种异常;具体地讲就是调用SWI汇编指令(x86上int $0x80),这条汇编指令将产生向量为128的编程异常,ARM从用户模式切入管理模式、并强制R15-PC(程序计数器)为0x0000 0008,Linux从用户态进入内核态。见:《ARM与Linux些许问题》第一章:ARM工作模式
之所以系统调用需要借助异常实现;是因为当用户态的进程调用一个系统调用时,CPU便被切换到内核态执行内核函数。我们前边分析ARM体系结构部分已经讲过进入内核态——ARM高特权模式,必须经过系统的门机制——异常(SWI汇编指令(x86上int $0x80等);其他异常用户空间无法利用,都是由内核使用的。)。
1.SWI汇编指令(x86上int $0x80)指令的目的是产生一个编号为128的编程异常,这个编程异常对应中断描述符表IDT中的第128项——也就是对应的系统门描述符。门描述符中含有一个预设的内核空间地址,它指向了系统调用处理程序:vector_SWI()(x86上system_call())。注意:不是系统调用服务程序本身。
即:系统命令——>用户编程API——>系统调用(调用SWI汇编指令异常)——>系统调用处理函数(vector_SWI)——>具体的系统调用服务程序。其中蓝色部分是内核态函数。
2.所有的用户空间系统调用函数都是通过调用SWI汇编指令(x86上int $0x80)异常、进入内核态,此时、ARM默认从某一固定地址执行程序(vector_SWI()(x86上system_call())的地址)。vector_SWI()(x86上system_call())这个内核函数又怎样分发这些系统调用到各自的内核服务程序中呢?Linux为每个系统调用都进行了编号(0——_NR_syscall);同时在内核中保存一张系统调用表,该表中保存了系统调用编号和其对应的服务例程。因此,在系统调用通过门陷入内核前,需要把系统调用号一并传入内核。这个传递工作是通过把系统调用号装入相应寄存器实现的。
有了如上的分析:系统调用处理程序vector_SWI()(x86上system_call())一旦运行;就可以从相应寄存器中得到数据,然后再去系统调用表中寻找相应的服务例程了。
注意:除了系统调用号之外,有的系统调用还需要传递一些参数给内核;这是Linux在vector_SWI()(x86上system_call())调用时将参数等值传入其他寄存器。
内核系统服务例程结束时,system_call()从相应寄存器中获得系统调用返回值,并把这个返回值放在曾保存用户态相应寄存器栈单元的那个位置;然后跳转到ret_from_sys_call(),终止系统调用处理程序的执行。
====================================================================================================================================


              查看评论 回复



嵌入式交流网主页 > 嵌入式处理器 > ARM > armlinux平台调用说明四、系统调用的实现
 

"armlinux平台调用说明四、系统调用的实现"的相关文章

网站地图

围观()