系统调用介绍 英飞凌的AURIX 2G芯片有8类trap(Class0-7),一般而言是出现错误了会触发相应的trap。但是Class6-System Call(系统调用)这个类型的trap比较特殊,它并不是在系统出现错误时触发的,而是软件中使用SYSCALL指令触发的。
Trap类型(上)
trap类型(下)使用系统调用的目的是进入supervisor mode以获得更高等级的权限,如下图所示。
进入trap时芯片的状态系统调用的服务函数可以拥有输入参数和返回值,而其他类型trap的服务函数不能有输入参数和返回值。
Tasking编译器中对于系统调用的描述使用Tasking编译器时,需要使用修饰符__syscallfunc(TIN)来声明系统调用的服务函数,TIN可以使用的范围是0~255。Tasking手册中给出的示例如下图。
系统调用服务函数示例系统调用在MICROSAR软件中的应用Application的特权等级在DaVinci工具中可以配置每个Application运行在supervisor mode还是user mode,如下图所示。
配置项:ApplicationIsPrivileged如下图所示,ApplicationIsPrivileged配置为true的Applicaiton拥有的所有task的上下文配置中ProgramStatus内的模式配置都为supervisor;ApplicationIsPrivileged配置为false的Applicaiton拥有的所有task的上下文配置中ProgramStatus内的模式配置都为user。
配置项ApplicationIsPrivileged对应的C代码如下图所示,运行在user mode的task权限比较低,当需要访问一些受保护的内存或外设时需要使用系统调用来临时获得特权。
不同的特权等级系统调用接口MICROSAR中定义的系统调用接口为Os_Hal_Trap,其定义如下图所示。代码中调用Os_Hal_Trap后会立即跳转到当前核trap向量表中系统调用对应的向量。使用的TIN固定为31,其它TIN都是无效的,会导致软件进入死循环。
Os_Hal_Trap的定义如下图所示,核0的中断向量表中SysCall对应的向量为Os_Hal_SysCallTrapEntry,
核0的中断向量表
系统调用的入口进入系统调用的中断向量后会调用Os_Hal_SysCall,而后调用Os_TrapHandler。
Os_TrapHandler函数Os_TrapHandler中会根据TrapId调用对应的接口。MICROSAR软件中支持的TrapId有117个,包括获取COREID、开关中断、激活task等操作。
Os_TrapHandler代码节选
Os_TrapIdType定义节选
|