基于r-Kernel的LiteOS操作系统

来源:互联网 发布:淘宝上口碑好的家具店 编辑:程序博客网 时间:2024/06/06 08:57

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

2 0