XIVN1987 发表于 2018-7-19 14:11:14

在RTOS实现中,使用SVC调用系统函数是不是更安全?


对于Cortex-M单片机,用户程序调用RTOS系统函数有两种思路:

假设创建任务的RTOS函数是xxx_task_create()

第一类:FreeRTOS、RT-Thread中采用的方法,和调用普通的用户函数一样,xxx_task_create()调用直接执行任务创建代码
第二类:RTX、zephyr中采用的方法,xxx_task_create()中并没有任务创建代码,xxx_task_create()调用会执行SVC指令,触发SVC中断,在SVC_Handler()中根据参数调用相应的RTOS函数从而创建任务,,这种方法更类似于Windows、Linux等大型OS中系统调用采用的方法

那么第二种方法会比第一种方法更安全吗?

另外,除了上面提到的RTX、zephyr,,还有哪些RTOS采用SVC的方法实现系统调用?

xivisi 发表于 2018-7-19 14:15:22

本帖最后由 xivisi 于 2018-7-19 14:20 编辑

理论上 用svc 更安全。前提是,需要做足够的安全检查

PS:并且做好安全隔离。比用限制用户线程,不能直接访问系统权限区域,必须通过特定函数(内部调用svc),特定函数又必须做足够的安全检查。也要防止非法的 svc指令

security 发表于 2018-7-19 14:16:29

是的,更安全。
但对于小型的项目而言,一般也没必要分用户权限和系统权限,不然的话,所有的操作系统,应该都长一个样了。

XIVN1987 发表于 2018-7-19 14:19:42

security 发表于 2018-7-19 14:16
是的,更安全。
但对于小型的项目而言,一般也没必要分用户权限和系统权限,不然的话,所有的操作系统,应 ...


赞同,小型项目没必要太在意这个,而且用SVC的方法可能更不方便调试

大型项目还是应该用SVC的,,

myxiaonia 发表于 2018-7-19 14:29:00

XIVN1987 发表于 2018-7-19 14:19
赞同,小型项目没必要太在意这个,而且用SVC的方法可能更不方便调试

大型项目还是应该用SVC的,, ...

用svc方法,有助于区分用户代码和os代码,一般os代码调试好以后,你不太需要和这个打交道

调试的时候好像不太方便,调试的时候一不小心一个svc,然后你就不知道跟踪到哪里去了

但是你如果不想去管os内部的逻辑,专心于你自己的代码,何尝不是个好事呢

用svc的os,还有个优点就是更容易做动态加载,正如你说的,这更像是Windows或者linux的做法

myxiaonia 发表于 2018-7-19 14:32:04

本帖最后由 myxiaonia 于 2018-7-19 14:33 编辑

像FreeRTOS、RT-Thread这些rtos,可能为了方便移植,也会放弃svc这种做法,毕竟门槛低一些的mcu并没有这种中断,虽然你也可以用其他中断模拟

而rtx这种就属于专门为某类mcu定制的,它一定会用上一些高级特征来提升性能

XIVN1987 发表于 2018-7-19 14:34:27

myxiaonia 发表于 2018-7-19 14:32
像FreeRTOS、RT-Thread这些rtos,可能为了方便移植,也会放弃svc这种做法,毕竟门槛低一些的mcu并没有这种 ...

是的,svc方法对mcu有限制。rtx只支持arm,zephyr只支持32位处理器

gwnpeter 发表于 2018-7-20 02:25:06

本帖最后由 gwnpeter 于 2018-7-20 02:31 编辑

其实用svc会更加安全,不只是用户权限的问题。
即使在小型系统中,如果建立线程的过程中,发生中断,又有一些系统调用,会很容易造成系统崩溃。
因此没有svc模式的系统会增加很多状态检测,保证安全。
没用svc模式方便移植,但是效率还是低一点,所以rtx之类的arm原生专用系统的效率更高

效率问题,可以参考这个链接:
http://forum.armfly.com/forum.php?mod=viewthread&tid=1531

cloudboy 发表于 2018-7-20 09:37:25

如果是调用安全上来讲,没有内存空间隔离的话,进到SVC里面我觉得也没更加实质性的安全

XIVN1987 发表于 2018-7-20 09:44:35

cloudboy 发表于 2018-7-20 09:37
如果是调用安全上来讲,没有内存空间隔离的话,进到SVC里面我觉得也没更加实质性的安全 ...


嗯,可能要配合使用MPU才能实现安全目的!!

redroof 发表于 2018-7-20 11:11:03

cloudboy 发表于 2018-7-20 09:37
如果是调用安全上来讲,没有内存空间隔离的话,进到SVC里面我觉得也没更加实质性的安全 ...

有,用svc调用系统api,就隐含保证了所有的系统api都不会重入,也不会互相打断!这是非常重要的保护!
页: [1]
查看完整版本: 在RTOS实现中,使用SVC调用系统函数是不是更安全?