新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 一种支持I/O的核外中断执行算法

一种支持I/O的核外中断执行算法

作者:时间:2010-02-05来源:网络收藏
3 用户态挂接的实现
  实现核外实际上包含三个步骤:
  (1)跳到核外处理程序。在IA32平台下,由于CALL/JMP类指令有保护机制的约束,只能由外向内跳转,而RET和IRET指令恰好相反,只能由内向外跳。因此,一个很常用的技术的就是采用RET或IRET指令实现由内向外的“调用”。首先在堆栈上压入需要调用的核外驱动ISR代码的首地址CS:IP及相应堆栈的地址SS:ESP。在保护模式下,CS为用户代码的段选择子,SS为用户堆栈的段选择子。RET或IRET,硬件将从堆栈上弹出CS:IP和SS:ESP。CPU进行安全检查之后,就可以ISR。ARTs-OS使用IRET指令完成此功能。
  (2)从核外驱动返回内核。核外驱动ISR完后,要返回到内核ISR的调用处。因为IA32平台的限制不能采用常规的返回执行,所以应采用“堆栈执行”的技巧。即在堆栈上压入汇编代码,然后利用返回指令执行该代码,实现重返内核。具体步骤:①调用驱动ISR之前,应作一定准备工作;②保存内核的当前运行状态;③找到核外驱动程序ISR将使用的堆栈;④在堆栈中压入代码,该代码主要实现INT n的系统调用,重返内核,该堆栈中还包括用于平衡堆栈的代码;⑤将代码的首地址压入堆栈,作为返回地址;⑥建立好过程调用的“调用帧”的前半段后,用IRET指令进入该驱动程序ISR;⑦进入内核后,根据以前保存的信息恢复到内核以前的状态。
  当执行到驱动程序ISR的RET语句时(该RET编译后为一个段内近调用,因为编译器并不知道该函数会被系统“回调”,所以把它当作一个普通的函数进行编译),由于返回地址为堆栈上事先压入代码的首地址,所以执行该代码;在平衡堆栈后,用INT指令重返内核。
  (3)驱动程序地址空间的恢复。为了方便驱动程序ISR访问驱动程序空间中的全局变量,应当在进入核外驱动ISR之前恢复该驱动程序的地址空间。这类似于进程切换。首先将该驱动程序强制性切换到运行态,即恢复其寄存器上下文环境等,然后执行其中的ISR。
  在这个过程中要用到描述一个用户态中断的数据结构,用C语言表示为:
  typedef struct UserInterrupt_t{
  ThreadId id;//表示注册此中断的线程id
  unsigned long interruptId;//惟一表示一个中断
  InterruptFunction function;//中断的服务函数指针
  unsigned long parameter;//中断服务程序使用的参数
  struct UserInterrupt_t *next;//用来维护一个链表
  } UserInterrupt,*UserInterruptPtr;
  实现中断挂接的主要系统调用:
  SyscallError tmAttachInterrupt(unsigned char irqno,InterruptFunction function,unsigned
long parameter,unsigned long *intId);
  SyscallError tmDetachInterrupt(unsigned long intId);
  实际上,因为IA32平台的限制,用户态线程/进程不能直接操纵。为了更好地实现核外驱动,中断管理模块还提供了一个关闭这种限制的函数:
  SyscallError tmIOPL(unsigned char on);
4 核外中断的评价
  ARTs-OS的核外硬中断可以满足管理的要求,它具有下列优点:
  (1)实现简单。ARTs-OS的核外硬中断实现起来非常简单,内核只需额外提供几个系统调用。而这些系统调用的实现方法也很简单,且结构清晰、所需的代码少,完全能够满足ARTs-OS作为嵌入式系统的需要。
  (2)驱动程序编写简单。中断管理为核外驱动程序提供几个系统调用,如:挂接中断、删除中断等。驱动程序只需准备好相应的中断处理函数调用系统调用即可。驱动程序使用核外驱动和使用其他系统调用一样简单,无需特殊的操作。
  (3)调试方便。通常,驱动程序在核内运行,其中断服务程序也在核内运行。一般的调试工具不能调试核内的程序,ARTs-OS则不同。因为核外中断的中断服务程序是核外的函数,这些函数使用的数据、函数都在核外,所以核外中断的中断服务程序和运行在核外的其他函数没有本质的区别,便于使用GDB等调试工具。
  但是核外硬中断方法也有不足之处,例如运行效率较低。因为中断服务程序在核外运行,每当中断到达时,为了执行相应的中断服务程序必须到核外,执行完毕后又必须切换回核内。这样执行每个中断服务程序都必须来回进行上下文切换,从而导致运行速率下降。实际上,ARTs-OS针对这种来回切换的情况进行了一些优化,切换时只需保护和恢复必须的上下文,这样的速率延迟还是可以接受的。另外,核外中断方法还会对系统的安全性产生一定的影响,因为驱动程序能够使用核外的驱动方式,必然导致运行在核外的驱动程序拥有一些特权。但实际上这种安全性的保障应该是驱动程序编制者的任务,即驱动程序编制者应该自己保障其中断服务程序不破坏系统的安全性。
  综合考虑系统的扩展性、简洁性和功能,ARTs-OS的实现应该是可以接受的。

上一页 1 2 下一页

关键词: 算法 执行 中断 I/O 支持

评论


相关推荐

技术专区

关闭