笔者在暑假参加了腾讯犀牛鸟开源人才培养计划,做的其中一个RTOS项目,是给Tencent Tiny OS 添加内核态和用户态 以及 添加用户态的TLIB库 ,可以使用内核API(Tencent LIB)
2 个赞
写了之后的感受 :
- 项目的需求目的是比较好的 , 想要既要和内核API 保持一致 内核开发人员无感替换 也想要安全
- 不至于跑飞了影响内核的代码和数据
BUT
- 和内核API保持一致,就需要将所有的内核数据结构交给用户管理, 所有的PCB 所有的信号量等等
-
一旦暴露了真实内存给开发人员,就已经不能做到安全了
- 用户可以在用户态改一下PCB , 来影响整个内核的调度
- MPU单元不像MMU那么完全绝对防护,不同用户之间也可以访问相互的数据结构
- 最容易犯错的还是stack_overflow 带来的问题 由stack_overflow 很有可能会导致以上一系列的问题, 因为内核数据都在用户态, 我们并不知道stack_overflow之后的那段数据是属于哪个数据结构 或者又是另一个线程的栈
- 我曾经设想过,使用MPU来控制栈溢出,就是一个栈下面接一段空属性的一小段,用户不能访问,一旦栈溢出就触发Mem_Handler异常,但是MPU可以控制的段数量[max : 16] 就限制了线程开辟的数量
- 也其实可以在软件上解决问题,在PCB中添加一个栈阈值,每次CPU重新捡起线程的时候去检测阈值是否超越,如果是就直接杀掉进程 , 但是这个应该是大部分RTOS会做这个检验的 (TOS好像没有 = - =)
- 综上,要解决安全问题,同时还要让TLIB完全和内核API映射 ,应该是鱼与熊掌的关系了(
TOS本身
- TOS 好多文档和代码都存在些许问题 , 我是写TLIB的过程中一直在补TOS的文档
- CPU临界区用的比较乱,在任务动态创建这里的临界区我提了一个PR 但是预计可能其他地方也有类似的
- 在开发的过程中MMHEAP动态内存分配模块中的FREE函数应该是有BUG的,我在使用的过程中遇到了一些不可描述的内存问题 , 现在还没查出来,主要是由于内存管理这块特别杂,所以后面用静态全局变量 ,就避开了这块错误。
然后对于项目本身
- 项目有点类似开源之夏,对高校学生十分友好,推荐报名!!!
- 【既可以积累项目经验,又可以给开源社区提PR 结业还可以领取结业奖金,推荐指数:十分 】
-
申请项目流程
- 百度搜索腾讯犀牛鸟开源人才培养社区
- 注册登录,可以查看腾讯推出的各个项目
- 开始时间是每年6月初
- 开源实战开始时间是7月初
- 实战结束是9月底
- 其中审核是9月初
- 详细了解的话还是要看官网
- 官网 : 腾讯开源 | Tencent Open Source
错误的,之前说保持API一致但是又没有办法完全做内核用户隔离的想法是冲突的, 是我的思想固化了, 可以在用户层维护一块数据区域用来存内核一些结构体比如PCB的备份, 给用户一个假的感觉,每次返回用户态的时候再做check 如果不同步 说明用户态有人无意,蓄意改了这块数据结构, 就直接终结进程