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