LiteOS是应用于资源受限的传感网络的一种基于线程的类UNIX操作系统。也就是说它跑在存储空间和RAM有限的超低电压微控制器上,这也是吸引我关注它的原因(在超低电压下系统更易出错)。它采用r-kernel内核,r-kernel有三个特征:
1)为线程创建checkpoint,可以在出错时进行rollback。下面是用r-kernel给出的API写出的示例程序:
checkpointIndex = createCheckPoint(); printf("Point A,"); rollbackCheckpoint(checkpointIndex); printf("Point B,");
程序会一直输出Point A。它将断点存在了Flash中,这是因为RAM是嵌入式设备上最受限的资源。这个特征用来解决那些可以通过重新执行来消除的错误,如竞态条件和死锁。但对于确定的错误,要通过下面这个特征来解决。
2)让一些系统调用拥有影子。考虑下面的程序:
char *buffer = malloc(100); /*some more code here*/ buffer[100] = 1;
显然存在Dynamic memory overrun,一旦buffer[100]的内存地址分配给了另一个线程,就会出现错误。其实malloc是通过系统调用来与内核打交道的,如果我们能将这些系统调用的实现进行修改,如malloc是连续分配内存块,但我们将之修改为每两个内存块之间增添固定大小的空间,这样便在一定程度上解决上述问题(这要取决于增加空间的大小)。这就是所谓的影子(system call shadowing)。
3)watchdog是最后的防线。如内核陷入死锁,不能定期地进行喂狗,watchdog便会进行reboot。但为了防止一次又一次因为同一个bug重启的尴尬,一种叫past-run race reconstruction的方法用来判断是哪一个线程造成了重启,这样下一次它就被禁止执行。为此我们需要将重启前的状态记录下来(存在EEPROM或on-board Flash),之后内核会通过这些信息找出重启前最后一个在运行的用户线程,它一般就为错误线程,暂时丢弃它。
注:翻译来源 IEEE INFOCOM 2011论文
Qing Cao, Xiaorui Wang, Hairong Qi and Tian He, r-Kernel: An Operating System Foundation for Highly Reliable Networked Embedded Systems
基于r-Kernel的LiteOS操作系统,布布扣,bubuko.com
原文:http://blog.csdn.net/bluecloudmatrix/article/details/24260349