2 ARTs-OS的核外中断
所有的操作系统都实现了核内驱动,并且核内驱动对中断管理的要求相对简单。ARTs-OS的中断管理在这一部分只简单地提供一些函数调用。下面重点介绍核外驱动。
ARTs-OS中断管理只需提供核外硬中断机制便可实现对核外驱动的支持,即提供如下的功能:当硬件产生中断时,系统核心保存现场,然后跳转到核外驱动程序ISR并执行;执行完后,恢复现场重新回到核内。整个过程如同核外驱动程序的ISR在核内运行。
要实现这个过程需要明确以下几点:
(1)系统如何从核心跳转到核外的驱动程序ISR。若该ISR的代码段在核内,由于处于同一个保护层次中,则可以直接调用。但若驱动在核外,一般系统的保护机制是不允许这样调用的。
(2)驱动程序ISR执行完毕后,跳转到何处。比较好的方法是:返回到系统内核ISR调用驱动程序ISR的地方,但实现起来比较困难。因为一般的过程调用是通过CALL和RETURN指令以及返回地址的堆栈保存这种“过程调用/返回”协议自动地返回到调用点(的下一条指令)。然而,当驱动程序在核外时,它们使用的根本就不是同一个堆栈,核内ISR使用0层堆栈,核外驱动ISR使用被中断应用程序的地址空间中的3层堆栈。如何实现这种切换返回需要仔细考虑。
(3)如何处理驱动程序ISR对驱动程序中全局变量(例如:驱动程序缓冲区)的访问。一般函数中不存在这样的问题,但在驱动程序ISR中,这将成为一个很重要的问题。一般的函数是由该函数所在地址空间的其他函数所调用,当执行到该指令时,CPU的进程/线程调度机制已经将该进程的地址空间恢复,普通函数根本就不知道进程的地址空间在CPU上被不断切换这一事实。但对于中断响应函数ISR就不是这样。驱动ISR是由操作系统内核(具体为:内核的中断ISR)调用,而内核中断ISR被调用的时机与操作系统自身的运行是异步的,也就是说,在任何时候都有可能发生硬件中断。因此,有可能在另外一个应用程序运行时发生硬件中断,从而调用驱动程序ISR。如果不进行特别的处理,驱动程序ISR访问的全局变量将是另外一个应用程序空间中的地址。
为了解决以上问题,ARTs-OS使用了一种与UNIX系统实现信号[1]类似的方法。采用这种方法的一个前提条件是核外驱动程序必须常驻内存。道理很简单:中断随时可能发生,如果核外驱动程序不在内存而是在硬盘中,要执行驱动程序的中断服务例程就必须将驱动程序加载到内存中,这非常耗时;同时因为中断服务例程执行时系统的特殊状态,这个加载过程是难于实现的。所以ARTs-OS假定所有的核外驱动程序都常驻内存。作为一个嵌入式实时系统,ARTs-OS本来就要求程序能够常驻内存,所以这样的假设是成立的。
ARTs-OS采用的算法和一般的程序调用方法类似。而要实现在核内核外之间的跳转,系统必须保存和恢复必要的信息。这些信息包括:内核的当前上下文环境、核外驱动程序的上下文环境。
执行核外中断程序的算法如下:
输入:中断号iid,线程号tid
输出:无
步骤:
(1)根据iid和tid得到中断程序的地址。
(2)在内核中保存信息以便中断程序执行完毕后返回。
(3)在tid对应的线程堆栈中写入返回到核内的代码。
(4)跳到线程的中断函数执行。
(5)使用刚才写入的代码跳回内核。
(6)使用在内核中保存的信息,恢复内核的上下文环境。
2 ARTs-OS的核外中断
所有的操作系统都实现了核内驱动,并且核内驱动对中断管理的要求相对简单。ARTs-OS的中断管理在这一部分只简单地提供一些函数调用。下面重点介绍核外驱动。
ARTs-OS中断管理只需提供核外硬中断机制便可实现对核外驱动的支持,即提供如下的功能:当硬件产生中断时,系统核心保存现场,然后跳转到核外驱动程序ISR并执行;执行完后,恢复现场重新回到核内。整个过程如同核外驱动程序的ISR在核内运行。
要实现这个过程需要明确以下几点:
(1)系统如何从核心跳转到核外的驱动程序ISR。若该ISR的代码段在核内,由于处于同一个保护层次中,则可以直接调用。但若驱动在核外,一般系统的保护机制是不允许这样调用的。
(2)驱动程序ISR执行完毕后,跳转到何处。比较好的方法是:返回到系统内核ISR调用驱动程序ISR的地方,但实现起来比较困难。因为一般的过程调用是通过CALL和RETURN指令以及返回地址的堆栈保存这种“过程调用/返回”协议自动地返回到调用点(的下一条指令)。然而,当驱动程序在核外时,它们使用的根本就不是同一个堆栈,核内ISR使用0层堆栈,核外驱动ISR使用被中断应用程序的地址空间中的3层堆栈。如何实现这种切换返回需要仔细考虑。
(3)如何处理驱动程序ISR对驱动程序中全局变量(例如:驱动程序缓冲区)的访问。一般函数中不存在这样的问题,但在驱动程序ISR中,这将成为一个很重要的问题。一般的函数是由该函数所在地址空间的其他函数所调用,当执行到该指令时,CPU的进程/线程调度机制已经将该进程的地址空间恢复,普通函数根本就不知道进程的地址空间在CPU上被不断切换这一事实。但对于中断响应函数ISR就不是这样。驱动ISR是由操作系统内核(具体为:内核的中断ISR)调用,而内核中断ISR被调用的时机与操作系统自身的运行是异步的,也就是说,在任何时候都有可能发生硬件中断。因此,有可能在另外一个应用程序运行时发生硬件中断,从而调用驱动程序ISR。如果不进行特别的处理,驱动程序ISR访问的全局变量将是另外一个应用程序空间中的地址。
为了解决以上问题,ARTs-OS使用了一种与UNIX系统实现信号[1]类似的方法。采用这种方法的一个前提条件是核外驱动程序必须常驻内存。道理很简单:中断随时可能发生,如果核外驱动程序不在内存而是在硬盘中,要执行驱动程序的中断服务例程就必须将驱动程序加载到内存中,这非常耗时;同时因为中断服务例程执行时系统的特殊状态,这个加载过程是难于实现的。所以ARTs-OS假定所有的核外驱动程序都常驻内存。作为一个嵌入式实时系统,ARTs-OS本来就要求程序能够常驻内存,所以这样的假设是成立的。
ARTs-OS采用的算法和一般的程序调用方法类似。而要实现在核内核外之间的跳转,系统必须保存和恢复必要的信息。这些信息包括:内核的当前上下文环境、核外驱动程序的上下文环境。
执行核外中断程序的算法如下:
输入:中断号iid,线程号tid
输出:无
步骤:
(1)根据iid和tid得到中断程序的地址。
(2)在内核中保存信息以便中断程序执行完毕后返回。
(3)在tid对应的线程堆栈中写入返回到核内的代码。
(4)跳到线程的中断函数执行。
(5)使用刚才写入的代码跳回内核。
(6)使用在内核中保存的信息,恢复内核的上下文环境。
举报