c. 中断
象所有其他Unix类型的操作系统一样,Linux内核能长时间地屏蔽中断。当然,正是这一点使Linux成为非实时操作系统。解决这个问题有两种途径:一是重新设计内核使之可抢先。但是Linux内核又大又复杂,不便于经常修改。而且当初设计Linux时根本就没打算把它做成一个实时系统。因此,把实时性强加到已存在的代码上是不可行的。于是NMT RT-Linux设计者用另一种途径来使Linux可抢先。他们将中断分为两组:由Linux控制的为一组,另一组由NMT RT-Linux控制。RT-Linux中断象RT-Linux任务一样受到约束,它们不能进行Linux调用。所以它们可以安全地中断Linux内核。另一方面,Linux中断不允许中断内核。因此NMT RT-Linux形成了一个虚拟中断机制,使Linux本身永远不能屏蔽中断。Linux用“cli”和“sti”宏指令来屏蔽和使能中断。在标准Linux里,这些宏只是简单地执行相应的x86/PC处理器指令。NMT RT-Linux修改了这些宏,执行cli时不是屏蔽中断,而是重定向到某些RT-Linux代码。如果这是一个RT-Linux中断,允许它继续;如果是一个Linux中断,则只是设置一个标准位。然后当执行了sti开中断后,那些挂起的Linux中断才继续执行。这样,Linux仍然不能中断它自己,但是NMT RT-Linux可以。RT-Linux很简单,只提供了实现一个实时系统所需的不能再少的功能。但是系统设计者正是得益于这种简单性。大部分应用应该在Linux进程中实现,因为Linux本身稳定可靠,并且为广大用户所熟悉,即使有了麻烦也能找到帮助。实时任务只包括必要的功能来实现实时I/O,以及从Linux进程接收或发送数据。
在中断处理中,NMT RT Linux对Linux内核有如下三处修改:
l cli(Clear Interrupt)被简单地修改成对一个控制“软中断使能”(SIE)的全局变量的清0
l sti(Set Interrupt)被修改成为所有等待中断产生中断模拟
l 低级wrapper指令(保存和恢复中断状态)被修改为使用软返回,而不是使用原来的硬件机制
当一个中断发生时,控制转移到实时处理程序,处理程序首先进行一些必要的处理,然后将中断传给Linux。如果“软中断使能”标志为1,则将控制转移到Linux的处理程序。
同时,需要说明的是,Linux非常容易修改,因为在标准的x86 Linux下,cli()和sti()事实上是一段汇编宏指令(产生x86下的指令cli和sti)。总的说,需要大约2000行新代码,而且需要修改大约几百行Linux的代码。如下为三个宏:
S_IRET保存最少的必要状态,保证内核数据地址可访问。
/*These are macros*/
S_CLI: mov $0, SF1F
S_IRET: push %ds
pushl %eax
pushl %edx
movl $KERNEL_DS, %edx
mov %dx, %ds
cli
movl SFREQ, %edx
andl SFMASK, %edx
bsrl %edx, %eax
jz not_found
movl $0, SF1F
sti
jmp SFIDT (, %eax, 4)
not_found: movl $1, SFIF
sti
popl %edx
popl %eax
pop %ds
iret
S_STI: pushfl
pushl $KERNEL_CS
1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.

