资料介绍
ARTs-OS是一个基于微内核的嵌入式实时操作系统。ARTs-OS中的中断管理应该提供的基本功能包括:管理中断处理设备、中断服务例程的管理、中断嵌套的管理、中断栈的维护、线程/进程切换时的现场保护和恢复等。但是ARTs-OS作为嵌入式实时操作系统,上述基本功能不能满足所有的要求,它还必须拥有更多体现嵌入和实时特性的功能。ARTs-OS在实现中必须采取一些措施将中断分配时间(IDT)和中断服务时间(IST)减到最小,并使用户能够很容易地在ARTs-OS上开发、调试驱动程序。
1 ARTs-OS的I/O特点
ARTs-OS的I/O体系结构的主要特点有:(1)基于微内核构架。(2)支持动态加载。(3)核内/核外驱动。(4)进程/线程模型。(5)中断硬连接。
中断管理对I/O的支持由I/O的设计方式决定,集中体现在核内中断管理和核外中断管理。本文集中讨论核外中断管理。
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)使用在内核中保存的信息,恢复内核的上下文环境。
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。
1 ARTs-OS的I/O特点
ARTs-OS的I/O体系结构的主要特点有:(1)基于微内核构架。(2)支持动态加载。(3)核内/核外驱动。(4)进程/线程模型。(5)中断硬连接。
中断管理对I/O的支持由I/O的设计方式决定,集中体现在核内中断管理和核外中断管理。本文集中讨论核外中断管理。
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)使用在内核中保存的信息,恢复内核的上下文环境。
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。
下载该资料的人也在下载
下载该资料的人还在阅读
更多 >
- STM32学习笔记(4)——NVIC中断优先级管理和外部中断EXTI
- linux内核-时钟中断
- 嵌入式外中断c语言代码
- 微内核与宏内核的比较与分析 11次下载
- 【HarmonyOS】智能硬件开发3-HarmonyOS内核设计 11次下载
- Kinetis的中断机制详细资料说明 7次下载
- 51单片机内核的中断及中断向量的详细资料说明
- TI的RTOS内核用户手册免费下载 23次下载
- 如何进行Linux内核的中断和异常分析资料说明
- TB3017中文手册之dsPIC30F CAN中断管理
- TI-RTOS 2.00 用户指南 24次下载
- Linux 2.4.x内核软中断机制 0次下载
- 基于8051内核IP核的应用 1次下载
- STM32上RTOS的中断管理 0次下载
- ARM内核的中断技术
- 不会RTOS,是因为你没搞懂NVIC 686次阅读
- Zephyr RTOS简介及代码下载编译运行 4595次阅读
- RTOS内核源码,非必要不建议阅读 569次阅读
- CKS32F4xx系列产品NVIC中断优先级管理单元讲解 947次阅读
- 使用MM32F3270基于Azure RTOS定时器组的应用 1476次阅读
- 使用MM32F3270基于Azure RTOS动态内存管理的应用 790次阅读
- 使用MM32F3270基于Azure RTOS信号量的应用 862次阅读
- 在高度时间敏感的低功耗蓝牙应用中使用 RTOS 1372次阅读
- Cortex-M0处理器内核异常中断简介 4465次阅读
- 鸿蒙内核源码的中断环境下的任务切换 2169次阅读
- 鸿蒙内核分析:线程中断环境下的任务切换 2497次阅读
- 微内核的差异性及开发工作 1787次阅读
- 什么是微内核_微内核的发展历史 1.1w次阅读
- 浅谈51内核单片机中断源 4964次阅读
- stm32定时器中断配置 3974次阅读
下载排行
本周
- 1TC358743XBG评估板参考手册
- 1.36 MB | 330次下载 | 免费
- 2开关电源基础知识
- 5.73 MB | 6次下载 | 免费
- 3100W短波放大电路图
- 0.05 MB | 4次下载 | 3 积分
- 4嵌入式linux-聊天程序设计
- 0.60 MB | 3次下载 | 免费
- 5基于FPGA的光纤通信系统的设计与实现
- 0.61 MB | 2次下载 | 免费
- 6基于FPGA的C8051F单片机开发板设计
- 0.70 MB | 2次下载 | 免费
- 751单片机窗帘控制器仿真程序
- 1.93 MB | 2次下载 | 免费
- 8基于51单片机的RGB调色灯程序仿真
- 0.86 MB | 2次下载 | 免费
本月
- 1OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 2555集成电路应用800例(新编版)
- 0.00 MB | 33564次下载 | 免费
- 3接口电路图大全
- 未知 | 30323次下载 | 免费
- 4开关电源设计实例指南
- 未知 | 21548次下载 | 免费
- 5电气工程师手册免费下载(新编第二版pdf电子书)
- 0.00 MB | 15349次下载 | 免费
- 6数字电路基础pdf(下载)
- 未知 | 13750次下载 | 免费
- 7电子制作实例集锦 下载
- 未知 | 8113次下载 | 免费
- 8《LED驱动电路设计》 温德尔著
- 0.00 MB | 6653次下载 | 免费
总榜
- 1matlab软件下载入口
- 未知 | 935054次下载 | 免费
- 2protel99se软件下载(可英文版转中文版)
- 78.1 MB | 537796次下载 | 免费
- 3MATLAB 7.1 下载 (含软件介绍)
- 未知 | 420026次下载 | 免费
- 4OrCAD10.5下载OrCAD10.5中文版软件
- 0.00 MB | 234315次下载 | 免费
- 5Altium DXP2002下载入口
- 未知 | 233046次下载 | 免费
- 6电路仿真软件multisim 10.0免费下载
- 340992 | 191185次下载 | 免费
- 7十天学会AVR单片机与C语言视频教程 下载
- 158M | 183278次下载 | 免费
- 8proe5.0野火版下载(中文版免费下载)
- 未知 | 138040次下载 | 免费
评论
查看更多