驱动-异常处理结构、中断处理结构
- 格式:pdf
- 大小:1.56 MB
- 文档页数:32
Cortex-M4的中断与异常处理11.4.3异常模式11.4.3.1异常状态不活跃.这种异常是不活跃,不等待。
等待.例外的是等待由处理器处理。
来⾃外设或软件的中断请求可以将相应的中断状态更改为挂起。
活跃。
这种异常是被服务处理器,但还没有完成。
异常处理程序可以中断另⼀个异常处理程序的执⾏。
在这种情况下,两个异常都处于活动状态。
活跃和等待。
该异常服务由处理器和存在来⾃相同源的现⾏异常。
11.4.3.2异常类型重置异常。
重置是⼀种复位调⽤上电或热复位。
这种异常模式将复位作为⼀种特殊形式。
当发⽣复位时,处理器运⾏停⽌,有可能在⼀个指令的任何点。
当复位置为⽆效,重新开始执⾏从向量表中复位⼊⼝的地址。
执⾏是特权执⾏的线程模式。
NMI异常。
⾮屏蔽中断(NMI)可以通过⼀个外设或由软件触发发出信号。
这是最⾼优先级的异常,⽐其他复位都⾼。
它是永久启⽤并拥有-2⼀个固定的优先级。
NMI不能被掩蔽或通过任何其它异常阻⽌激活,也不能被通过⽐复位之外的任何异常抢占。
硬故障的发⽣是由于异常处理期间有错误的异常,或者因为异常不能被任何异常机制管理。
硬故障拥有-1固定的优先级,这意味着他们有更⾼的优先级⽐配置优先级的任何异常。
内存管理故障。
内存管理故障的发⽣是由于内存保护相关的故障异常引起的。
该MPU或固定存储器保护限制决定了该故障指令和数据存储器事务。
该故障⽤来取消指令对不执⾏(XN)存储区域的操作,即使MPU被禁⽤。
总线故障。
总线故障的发⽣是因为⼀个指令或数据存储器事务的存储器相关的故障异常。
这可能是由⼀个总线上的存储器系统中检测到错误。
应⽤故障。
应⽤故障是因为涉及到指令执⾏的故障发⽣了异常,包括:未定义指令;⼀个⾮法的未对齐访问;⽆效状态的指令执⾏;异常返回⼀个错误。
SVCall异常。
系统调⽤(SVC)是由SVC指令触发了异常。
在OS环境,应⽤程序可以使⽤SVC指令来访问OS内核函数和器件驱动。
PendSV异常。
PendSV的是系统级的服务中断驱动的请求。
Linux中断处理流程1. 中断处理流程 当中断发⽣时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总⼊⼝函数),并且把中断号irq传进来。
根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有⼀个irq_desc结构的数组irq_desc_ptrs[NR_IRQS]),然后调⽤irq_desc中的handle_irq函数,即中断⼊⼝函数。
我们编写中断的驱动,即填充并注册irq_desc结构。
2. 中断处理数据结构:irq_desc Linux内核将所有的中断统⼀编号,使⽤⼀个irq_desc[NR_IRQS]的结构体数组来描述这些中断:每个数组项对应着⼀个中断源(也可能是⼀组中断源),记录中断⼊⼝函数、中断标记,并提供了中断的底层硬件访问函数(中断清除、屏蔽、使能)。
另外通过这个结构体数组项中的action,能够找到⽤户注册的中断处理函数。
struct irq_desc {unsigned int irq;irq_flow_handler_t handle_irq;struct irq_chip *chip;struct msi_desc *msi_desc;void *handler_data;void *chip_data;struct irqaction *action; /* IRQ action list */unsigned int status; /* IRQ status */unsigned int depth; /* nested irq disables */unsigned int wake_depth; /* nested wake enables */unsigned int irq_count; /* For detecting broken IRQs */unsigned long last_unhandled; /* Aging timer for unhandled count */unsigned int irqs_unhandled;spinlock_t lock;const char *name;} ____cacheline_internodealigned_in_smp;(1)handle_irq:中断的⼊⼝函数(2)chip:包含这个中断的清除、屏蔽、使能等底层函数struct irq_chip {const char *name;unsigned int (*startup)(unsigned int irq);void (*shutdown)(unsigned int irq);void (*enable)(unsigned int irq);void (*disable)(unsigned int irq);void (*ack)(unsigned int irq);void (*mask)(unsigned int irq);void (*mask_ack)(unsigned int irq);void (*unmask)(unsigned int irq);void (*eoi)(unsigned int irq);void (*end)(unsigned int irq);void (*set_affinity)(unsigned int irq,const struct cpumask *dest);int (*retrigger)(unsigned int irq);int (*set_type)(unsigned int irq, unsigned int flow_type);int (*set_wake)(unsigned int irq, unsigned int on);/* Currently used only by UML, might disappear one day.*/#ifdef CONFIG_IRQ_RELEASE_METHODvoid (*release)(unsigned int irq, void *dev_id);#endif/** For compatibility, ->typename is copied into ->name.* Will disappear.*/const char *typename;};(3)action:记录⽤户注册的中断处理函数、中断标志等内容struct irqaction {irq_handler_t handler;unsigned long flags;cpumask_t mask;const char *name;void *dev_id;struct irqaction *next;int irq;struct proc_dir_entry *dir;};3. 中断处理流程总结(1)发⽣中断后,CPU执⾏异常向量vector_irq的代码;(2)在vector_irq⾥⾯,最终会调⽤中断处理C程序总⼊⼝函数asm_do_IRQ();(3)asm_do_IRQ()根据中断号调⽤irq_des[NR_IRQS]数组中的对应数组项中的handle_irq();(4)handle_irq()会使⽤chip的成员函数来设置硬件,例如清除中断,禁⽌中断,重新开启中断等;(5)handle_irq逐个调⽤⽤户在action链表中注册的处理函数。
设备驱动程序开发与应用试卷(答案见尾页)一、选择题1. 设备驱动程序的主要功能是什么?A. 提供设备访问接口B. 管理硬件资源C. 实现操作系统与硬件设备之间的通信D. 控制设备硬件2. 在嵌入式系统中,设备驱动程序通常是以哪种形式存在的?A. 操作系统内核的一部分B. 系统调用的一部分C. 驱动程序库文件D. 可执行文件3. 下面哪个选项不是设备驱动程序开发过程中需要考虑的因素?A. 兼容性B. 性能优化C. 易用性D. 安全性4. 在设备驱动程序中,错误处理通常是如何进行的?A. 使用try-catch块B. 通过状态码判断C. 异常处理D. 错误代码返回5. 以下哪项不是设备驱动程序加载到内存后的初始化过程的一部分?A. 声明设备号B. 注册设备C. 设置I/O地址D. 初始化硬件6. 在设备驱动程序中,中断服务例程的主要作用是什么?A. 处理硬件异常B. 释放已分配的资源C. 接收来自上层设备的请求D. 控制硬件设备的工作模式7. 在Windows操作系统中,设备驱动程序通常以哪种形式提供?A. DLL(动态链接库)B. EXE(可执行文件)C. OCX(控件对象)D. SYS(系统文件)8. 在Linux操作系统中,设备驱动程序通常保存在哪个目录下?A. /libB. /usr/libC. /usr/local/libD. /opt/lib9. 在设备驱动程序开发中,为了确保兼容性,开发者通常会采取哪些措施?A. 使用标准的APIB. 尽量使用高级语言编写驱动程序C. 避免使用特定的硬件特性D. 所有选项10. 在设备驱动程序的测试过程中,哪种测试方法最适合用于功能验证?A. 单元测试B. 集成测试C. 系统测试D. 性能测试11. 在Windows操作系统中,设备驱动程序通常以什么形式存在?A. DLL文件B. EXE文件C. OCX文件D. SYS文件12. 下面哪个不是设备驱动程序开发需要考虑的问题?A. 兼容性B. 性能优化C. 可维护性D. 硬件逻辑13. 在设备驱动程序中,以下哪项不是必须的功能?A. 加载B. 卸载C. 初始化D. 重定向14. 在设备驱动程序的开发过程中,以下哪个阶段是用来验证驱动程序正确性的?A. 编码阶段B. 测试阶段C. 交叉编译D. 编译阶段15. 在设备驱动程序中,错误处理通常通过哪种机制实现?A. 异常处理B. 中断处理C. 定时器处理D. 事件处理16. 在编写设备驱动程序时,通常会使用哪种编程语言?A. CB. C++C. JavaD. Python17. 在设备驱动程序中,以下哪个是用于描述设备特性的参数?A. I/O端口地址B. 中断号C. I/O地址D. 打印屏幕18. 在设备驱动程序的开发中,以下哪个是用于测试驱动程序正确性的工具?A.调试器B.模拟器C. 反汇编器D. 驱动程序分析工具19. 在设备驱动程序中,哪种类型的代码负责处理来自操作系统的请求?A. 驱动程序核心代码B. 中断服务例程C. 驱动程序初始化代码D. 设备状态监控代码20. 对于Windows操作系统,设备驱动程序通常以什么形式提供?A. DLL文件B. EXE文件C. OCX文件D.SYS文件21. 在设备驱动程序开发中,为什么需要考虑到设备的物理特性?A. 确保设备兼容性B. 提高驱动程序稳定性C. 优化性能D. 减少资源占用22. 下面哪个函数通常用于在设备驱动程序中注册新的设备?A. OpenDevice()B. CloseDevice()C. AttachDevice()D. RegisterDevice()23. 在设备驱动程序中,中断服务例程的主要任务是什么?A. 处理来自操作系统的请求B. 监控设备状态C. 管理硬件资源D. 执行设备驱动程序的核心逻辑24. 在编写设备驱动程序时,为什么需要关注设备的数据传输速率?A. 确保数据完整性和准确性B. 提高驱动程序性能C. 优化内存使用D. 降低设备功耗25. 在Windows操作系统中,设备驱动程序的加载过程通常涉及哪些步骤?A. 加载驱动程序文件 -> 验证文件完整性 -> 初始化设备 -> 注册设备B. 初始化设备 -> 加载驱动程序文件 -> 验证文件完整性 -> 注册设备C. 验证文件完整性 -> 加载驱动程序文件 -> 初始化设备 -> 注册设备D. 加载驱动程序文件 -> 初始化设备 -> 验证文件完整性 -> 注册设备26. 在设备驱动程序中,如何处理设备故障?A. 使用错误码和异常处理机制B. 调用设备供应商提供的故障恢复程序C. 启动系统备用方案D. 重启设备27. 在设备驱动程序开发中,为什么需要考虑设备的安全性?A. 防止未授权访问B. 提高驱动程序稳定性C. 优化性能D. 降低设备功耗28. 在Windows操作系统中,设备驱动程序通常是以什么形式提供的?A. 文档B. 源代码C. 可执行文件D. 压缩包29. 下面关于设备驱动程序的描述,哪项是错误的?A. 设备驱动程序是操作系统的一部分B. 设备驱动程序需要与硬件紧密集成C. 设备驱动程序可以为多个设备提供服务D. 设备驱动程序可以通过网络进行更新30. 在设备驱动程序的开发过程中,下面哪个步骤不是必需的?A. 编写设备驱动程序的源代码B. 配置设备的硬件参数C. 测试驱动程序的兼容性D. 优化驱动程序的性能31. 在设备驱动程序中,通常会包含哪些类型的数据结构?A. 节点表B. 驱动程序状态字C. I/O请求包(IRP)D. 中断描述符表32. 在设备驱动程序的注册过程中,操作系统会执行哪些操作?A. 分配内存B. 初始化设备硬件C. 创建设备对象D. 注册设备驱动程序33. 在设备驱动程序的卸载过程中,操作系统会执行哪些操作?A. 释放设备硬件资源B. 断开设备连接C. 销毁设备对象D. 删除驱动程序模块34. 设备驱动程序与应用程序之间的交互通常是通过什么方式实现的?A. 竞争条件B. 中断服务例程C. 信号量D. 队列35. 在设备驱动程序的开发中,为什么需要考虑多线程安全?A. 避免数据竞争B. 提高系统性能C. 降低开发难度D. 增加驱动程序的复杂性36. 在嵌入式系统中,设备驱动程序通常位于什么层次?A. 应用层B. 系统层C. 物理层D. 数据链路层37. 驱动程序开发过程中,编译器需要识别哪些特定的关键字来确保代码的正确性?A. includeB. importC. staticD. void38. 下面哪个选项不是设备驱动程序加载到内存后的初始化过程的一部分?A. 设备号分配B. 设备特性读取C. 驱动程序同步D. 中断向量表设置39. 在Windows操作系统中,设备驱动程序通常以何种形式提供?A. DLL(动态链接库)B. SO(共享对象)C. DLL(动态链接库)或 SO(共享对象)D. EXE(可执行文件)40. 在Linux操作系统中,设备驱动程序的模块化设计主要通过哪种机制实现?A. 硬件抽象层(HAL)B. 虚拟文件系统(VFS)C. 内核模块(KModule)D. 设备树编译器(DTB)41. 以下哪个设备驱动程序开发工具不是用于编写和测试驱动程序的?A. 驱动程序模拟器B. 交叉编译器C. 设备树生成工具D. 性能分析工具42. 在设备驱动程序的调试过程中,哪种方法最适合排查硬件相关的问题?A. 使用打印语句B. 使用断点C. 使用逻辑分析仪D. 使用网络诊断工具43. 在设备驱动程序的更新和维护中,最重要的步骤是什么?A. 版本控制B. 安全更新C. 兼容性测试D. 回滚计划二、问答题1. 什么是设备驱动程序?它在操作系统中的作用是什么?2. 设备驱动程序通常是如何加载到内存中的?3. 设备驱动程序中的主要组成部分有哪些?4. 什么是I/O请求包(IRP)?它在设备驱动程序中如何使用?5. 设备驱动程序如何处理中断?6. 什么是同步和异步操作?它们在设备驱动程序中的应用有何不同?7. 设备驱动程序如何管理内存资源?8. 设备驱动程序如何进行错误处理和调试?参考答案选择题:1. C2. C3. D4. C5. D6. A7. A8. A9. A 10. A11. A 12. D 13. D 14. B 15. A 16. A 17. B 18. A 19. B 20. A21. A 22. D 23. B 24. A 25. A 26. A 27. A 28. C 29. A 30. D31. ABC 32. ACD 33. ABCD 34. B 35. A 36. B 37. A 38. C 39. C 40. C41. D 42. C 43. D问答题:1. 什么是设备驱动程序?它在操作系统中的作用是什么?设备驱动程序是一种特殊的软件,它允许操作系统与硬件设备进行通信。
8章8.保守8.1トラブルシューティング···································エラー! ブックマークが定義されていません。
8.2ワーニング,报警一覧·····································エラー! ブックマークが定義されていません。
1)ワーニング一覧·······································エラー! ブックマークが定義されていません。
2)报警一覧·············································エラー! ブックマークが定義されていません。
stm32开发课程设计一、课程目标知识目标:1. 理解STM32的基本结构、功能及其在嵌入式系统中的应用;2. 掌握STM32的编程环境搭建,包括开发工具和软件的使用;3. 学会STM32的基本编程方法,包括寄存器操作、中断处理和定时器编程;4. 了解STM32的外围设备通信原理,如I2C、SPI、UART等;5. 能够阅读并理解STM32相关的技术手册和参考资料。
技能目标:1. 能够独立搭建STM32的开发环境,并进行基本的程序编写和调试;2. 运用所学知识,设计并实现简单的嵌入式项目,如温度传感器数据采集、LED控制等;3. 学会分析并解决STM32编程过程中遇到的问题,提高故障排查和问题解决能力;4. 培养团队协作能力,通过项目实践,学会与同伴共同分析、设计和调试程序。
情感态度价值观目标:1. 培养学生对嵌入式系统开发的兴趣,激发学生的学习热情;2. 培养学生的创新意识,敢于尝试新方法,勇于解决实际问题;3. 培养学生的责任心和敬业精神,养成良好的编程习惯;4. 强调实践与理论相结合,使学生认识到学习知识的重要性,提高学生的自我修养。
本课程针对高年级学生,结合STM32的特性和实际应用,注重知识与实践的结合,旨在培养学生的实际编程能力和嵌入式系统设计能力。
课程目标具体、可衡量,便于教学设计和评估。
通过本课程的学习,学生将能够掌握STM32的基本知识和技能,为今后的学习和工作打下坚实基础。
二、教学内容1. STM32基础知识和开发环境搭建- 介绍STM32微控制器的基本架构和功能特点;- 搭建STM32开发环境,包括硬件连接、软件安装及调试方法;- 学习使用STM32CubeMX工具进行硬件配置和代码生成。
2. STM32编程基础- 学习STM32的寄存器操作,理解内存映射和位带操作;- 掌握中断和异常处理机制,学会编写中断服务程序;- 学习定时器编程,理解时钟系统,实现精确延时和定时控制。
操作系统的中断处理与异常处理机制在计算机系统中,操作系统是一个管理和协调系统资源的软件,中断处理和异常处理是操作系统的核心功能之一。
中断处理和异常处理机制使得操作系统能够及时响应硬件设备或软件程序的请求,并采取相应的措施进行处理,保证系统的稳定性和可靠性。
本文将详细介绍操作系统的中断处理与异常处理机制。
一、中断处理机制中断是指在计算机系统运行过程中,某个硬件设备或者软件程序发出的一种请求,通过打断正常的程序执行流程,通知操作系统去处理该请求。
中断可以分为硬件中断和软件中断两类。
1. 硬件中断硬件中断是由硬件设备发生的一种中断事件,比如外设设备的输入输出操作,时钟中断等。
当硬件设备发生中断事件后,会向处理器发送一个中断信号,处理器暂停当前的执行任务,保存当前的上下文信息,并转入中断处理程序来处理中断事件。
中断处理程序会根据中断类型来执行相应的操作,比如读取输入设备的数据,将数据写入输出设备等。
处理完中断事件后,处理器会恢复之前被中断的任务继续执行。
2. 软件中断软件中断是由软件程序主动触发的一种中断事件,也称为系统调用。
软件中断通常由用户态程序调用系统库函数来完成,通过系统调用指令将自己的执行权限转交给操作系统,由操作系统代为执行相应的操作。
常见的软件中断包括文件读写操作、进程创建与销毁等系统调用。
中断处理机制的优点在于能够及时响应外部设备和软件程序的请求,提高了系统的实时性和处理能力。
同时,使用中断处理机制可以实现很多复杂的功能,比如多任务处理、设备驱动程序等。
二、异常处理机制异常是指在程序执行过程中出现的一种非正常情况,例如非法指令、除数为零等。
异常处理机制能够捕捉这些异常事件并进行相应的处理。
异常处理机制主要分为硬件异常和软件异常两类。
1. 硬件异常硬件异常指的是由硬件设备产生的异常事件,如页错误、越界访问等。
当硬件设备检测到异常事件后,会向处理器发送一个异常信号,处理器会中断当前任务的执行,并把当前的上下文信息保存起来,然后转入异常处理程序去处理异常事件。
《嵌入式产品安装与调试》课程标准一、课程基本信息(一)课程信息(二)专业概况1、培养目标通过《嵌入式产品安装与调试》的理论及实验教学,使学生了解嵌入式系统体系结构,嵌入式处理器结构(ARM架构为主),异常处理,存储处理,系统控制过程,流水线作业及各种I/O接口;引导学生自主学习,使学生掌握嵌入式操作系统(uC/OS-ll),以及在嵌入式 OS支持下的开发应用方法,训练学生的系统整合能力、程序语言能力、市场应用导向能力,使学生具备理论联系实际、运用所学知识发现问题和解决问题的能力。
为今后学习Linux内核,外围驱动的开发奠定坚实的基础,为学生的职业素质和职业技能的形成服务,为IT企业输送合格的软硬件从业者。
2、岗位面向嵌入式产品安装与调试课程是计算机科学与应用学科下的一个重要课程,设有嵌入式系统设计与开发室、计算机组装与维护、Linux操作系统、计算机网络基础、单片机及应用、第1页共9页Linux C编程、OA外围设备原理与维修、嵌入式系统原理、£口庆、嵌入式系统应用、常用工具软件、Internet操作技术、可编程控制器、微机组成原理、电工仪表与测量、局域网的组建与安装、传感器及应用、网络设备配置与管理等课程。
主要面向嵌入式电子产品的设计开发、生产制作、安装调试、运行维护、故障分析等岗位。
3、专业核心能力(1)训练学生的系统整合能力;(2)具备理论联系实际、运用所学知识发现问题和解决问题的能力;(3)提高学生在电子电路设计方面的实践技能;(4)能够进一步自学相关知识。
二、教学大纲(一)总体目标与任务1、课程性质和任务《嵌入式产品安装与调试》课程是所属学科为电气与信息类下的一级学科计算机科学与技术,在计算机科学与技术专业培养方案中属专业基础系列课程之一。
2、课程定位《嵌入式产品安装与调试》课程是应用电子技术专业的学生必修的一门实践性很强的专业技能课。
3、课程目标(1)能力目标1)使学生能够全面了解嵌入式系统的状况,培养学生系统整合能力。
ARM嵌入式期末考试题库精心整理版本文是对ARM嵌入式期末考试题库进行精心整理,旨在帮助学生更好地备考和复习。
以下是各个知识点的题目和解析,供大家参考。
一、ARM处理器架构1. ARM处理器的特点及应用领域。
2. ARM处理器的工作模式及切换方法。
3. ARM处理器的寄存器架构及常用寄存器的功能介绍。
4. ARM指令集及其分类。
解析:ARM处理器具有低功耗、高性能和较小体积等特点,在智能手机、平板电脑、物联网设备等领域得到广泛应用。
ARM处理器的工作模式包括用户模式、系统模式、中断模式等,切换方法包括软件切换和硬件切换。
ARM处理器的寄存器架构包括通用寄存器、程序状态寄存器等,常用寄存器具有保存数据和控制程序运行的功能。
ARM指令集包括ARM指令集和Thumb指令集,用于实现不同的应用要求。
二、ARM汇编语言1. 简述ARM汇编语言的特点。
2. ARM汇编语言中的指令格式及分类。
3. ARM汇编语言中的数据处理指令和逻辑指令。
4. ARM汇编语言中的分支指令和访存指令。
解析:ARM汇编语言具有可移植性强、效率高、灵活性好等特点。
ARM汇编语言中的指令格式包括数据处理指令、分支指令、访存指令和其他指令等,每种指令都有其特定的操作码和操作数。
数据处理指令和逻辑指令用于处理数据和实现逻辑运算,分支指令用于实现程序控制转移,访存指令用于读写内存和外设等操作。
三、ARM体系结构1. ARM体系结构的层次结构及各层的功能。
2. 简述ARM微处理器的构成和工作原理。
3. ARM微处理器的中断和异常处理机制。
4. ARM微处理器的乘法和除法指令实现。
解析:ARM体系结构包括指令集体系结构、系统架构和微体系结构等几个层次,各层的功能分别是定义指令集和寻址方式、定义内存和总线系统、定义处理器的内部功能和互连方式。
ARM微处理器由处理器核、寄存器文件、存储单元、总线和外设等构成,工作原理是根据指令执行流程逐条执行指令。
1.2操作系统结构设计操作系统是一种大型、复杂的并发系统;为了研制操作系统;首先必须研究它的结构;力求设计出结构良好的程序..操作系统的结构设计有两层含义:一是研究操作系统的整体结构;由程序的构成成分组成操作系统程序的构造过程和方法;二是研究操作系统程序的局部结构;包括数据结构和控制结构..采用不同的构件和构造方法可组成不同结构的操作系统..本节将在讨论操作系统构件之后;全面介绍各种操作系统的构造方法..1.2.1操作系统的组件通常把组成操作系统程序的基本单位称作操作系统的构件..剖析现代操作系统;构成操作系统的基本单位除内核之外;主要还有进程、线程、类程和管程..1.内核现代操作系统中大都采用了进程的概念;为了解决系统的并发性、共享性和随机性;并使进程能协调地工作;单靠计算机硬件提供的功能是十分不够的..例如;进程调度工作目前就不能用硬件来实现;而进程自己调度自己也是困难的..所以;系统必须有一个软件部分能对硬件处理器及有关资源进行首次改造;以便给进程的执行提供良好运行环境;这个部分就是操作系统的内核..由于操作系统设计的目标和环境不同;内核的大小和功能有很大差别..有些设计希望把内核做得尽量小仅具有极少的必需功能;称为微内核microkernel;其他功能都在核外实现;通过微内核提供的消息传递机制完成其余功能模块间的联系;有些设计则希望内核具有较多的功能;虽然其内部也可划分成层次或模块;但运行时是一个大二进制映像;模块间的联系可通过函数或过程调用实现;称为单内核monolithickernel..操作系统的一个基本问题就是内核的功能设计..微内核结构是现代操作系统的特征之一;这种方法把内核和核外服务程序的开发分离;可为特定应用程序或运行环境要求定制服务程序;具有较好的可伸缩性;简化了实现;提供了灵活性;很适合分布式系统的构造..一般而言;内核必须提供以下3个方面的功能..1中断处理..中断处理是内核中最基本的功能;也是操作系统赖以活动的基础;为了缩短屏蔽中断的时间;增加系统内的并发性;通常它仅仅进行有限的、简短的处理;其余任务交给在内核之外的特殊用户态进程完成..当中断事件产生时;先由内核截获并转向中断处理例行程序进行原则处理;它分析中断事件的类型和性质;进行必要的状态修改;然后交给内核之外的进程去处理..例如;产生外围设备结束中断事件时;内核首先分析是否正常结束;如果是正常结束;那么;就应释放等待该外围传输的进程;否则启动相应设备管理进程进行出错或异常处理..又如当操作员请求从控制台输入命令时;内核将把这一任务转交给命令管理进程去处理;以接收和执行命令..2短程调度..主要职能是分配处理器..当系统中发生了一个事件之后;可能一个进程要让出处理器;而另一个进程又要获得处理器..短程调度按照一定的策略管理处理器的转让;以及完成保护和恢复现场的工作..由于它是协调进程竞争处理器资源的程序;所以它不是进程而是内核中的一个程序..3原语管理..原语是内核中实现某一功能的不可中断过程..为了协调进程完成通信、并发执行和共享资源;各种原语是必不可少的..通信原语为进程相互传递消息;同步原语能协调并发进程之间的种种制约关系..此外;还有其他原语;如启动外围设备工作的启动原语;若启动不成功则请求启动者应等待;显然;这个启动过程应该是完整的;否则在成为等待状态时;可能外围设备已经空闲..由于设备的操作与硬件密切相关;故通常设备驱动程序等功能都放在内核中完成..内核是操作系统对裸机的首次改造;内核和裸机组成了一台虚拟机;进程就在这台虚拟机上运行;它比裸机的功能更强大;具有以下特性:1虚拟机没有中断;因而;进程的设计者不再需要有硬件中断的概念;用户进程执行中无须处理中断;2虚拟机为每个进程提供了一台虚拟处理器;每个进程就好像在各自的私有处理器上顺序地推进;实现了多个进程的并发执行;3虚拟机为进程提供了功能较强的指令系统;即它们能够使用机器非特权指令、系统调用和原语所组成的新的指令系统..为了保证系统的有效性和灵活性;设计内核应遵循少而精的原则..如果内核功能过强;则一方面在修改系统时可能牵动内核;另一方面它占用的内存容量和执行时间都会增大;且屏蔽中断的时间过长也会影响系统效率..因而;设计内核时应注意:中断处理要简单;调度算法要有效;原语应灵活有力、数量适当..这样就可以做到下次修改系统时;尽量少改动内核;执行时中断屏蔽时间缩短..2.进程管理程序本身并不能做什么;只有在CPU执行它的指令时才能有所作为;因此;可以把进程看做是正在运行的程序..但是当我们进一步研究时;对进程的定义将更为普遍..例如:一个分时用户程序如编译器是一个进程;个人用户在PC上运行的字处理程序是一个进程;一个系统任务如输出到打印机也是一个进程;并可以提供允许进程创建与其并发执行的子进程的系统调用..进程需要特定的资源包括CPU时间、内存、文件和I/O设备来完成工作..这些资源或者在进程创建时分配给它;或者在其运行时分配..除了在进程创建时所获得的各种物理资源和逻辑资源以外;各种各样的初始化数据或输入也可能一同传送给进程..例如;考虑一个能够在终端的显示屏上显示一个文件状态的进程..这个进程将获得包含输入的文件名;将执行相应的指令和系统调用来获取所期望的信息并显示在终端上..着重强调程序本身不是进程;程序是静态实体passiveentity好像是存储在磁盘中的文件的内容;而进程是动态实体activeentity;它用一个程序计数器来指明要执行的下一条指令..进程必须要按顺序执行;CPU执行完进程的一条指令后再执行下一条;直到进程结束..进一步地讲;一次最多执行一条代表该进程的指令..这样;从来就不会出现两个独立运行的序列..但一个程序在运行时创建多个进程是非常普遍的..进程是并发程序设计的一个工具;并发程序设计支撑了多道程序设计;由于进程能确切、动态地刻画计算机系统内部的并发性;更好地解决系统资源的共享性;所以;在操作系统的发展史上;进程概念被较早地引入了系统..它在操作系统的理论研究和设计实现上均发挥了重要作用..采用进程概念使得操作系统结构变得清晰;主要表现如下..1一个进程到另一个进程的控制转移由进程调度机构统一管理;不能杂乱无章;随意进行..2进程之间的交互如信号发送、消息传递和同步互斥等活动由通信及同步机制完成;从而使进程无法有意或无意破坏其他进程的数据..因此;每个进程相对独立;相互隔离;提高了系统的安全性和可靠性..3进程结构较好地刻画了系统的并发性;动态地描述出系统的执行过程;因而具有进程结构的操作系统;结构清晰、整齐划一;可维护性好..3.主存储器管理主存储器是现代计算机系统运行的核心..主存储器是由字或字节组成的大型队列;每个字或字节都有它自己的地址..主存储器是CPU和I/O设备共享的大容量快速存储器..中央处理器在取指令周期中从主存储器中读取指令;而且在取数据周期中从主存储器中读/写数据..通过DMA动态内存存取;I/O操作也实现了对主存储器的数据读/写..通常主存储器是CPU唯一能够直接寻址和访问的大容量存储空间..例如;CPU要处理磁盘中的数据;那么CPU首先发出I/O调用将这些数据传送到主存储器中..同样;指令必须在存储器中才能够由CPU执行..必须要把程序映射到绝对地址并载入内存中才可以执行..在程序运行时;它通过产生绝对地址来从内存中访问程序指令和数据..最后;程序结束;释放所占的内存空间;方便下一个程序载入..为了提高CPU利用率和计算机响应速度;必须在内存中保留多个程序..有许多不同的内存管理策略;而且不同算法的效率取决于具体的环境..为具体的系统选择内存管理策略要考虑许多因素——尤其是系统的硬件设计..每种算法都需要自己的硬件支持..操作系统要负责下列与内存管理相关的工作:跟踪内存使用情况;明确哪一部分正在使用和为谁所用;在内存空间有效时决定将哪个进程载入内存;根据需要分配和释放内存空间..4.文件管理文件管理是操作系统中可视性最强的组件之一..计算机能够将数据存储在各种类型的物理介质上..磁带、磁盘和光盘是最常用的介质..每种介质都有自己的特性和物理结构..每个存储媒体由一个驱动器控制如磁盘驱动器或磁带驱动器;这种驱动器也有自己的独有特性..这些特性包括访问速度、容量、数据传输率和存取方式顺序的或随机的..为了便于使用计算机系统;操作系统提供了一个计算机系统的整体逻辑层面..操作系统把存储设备的物理属性抽象定义为一个逻辑存储单元——文件..文件被映像到物理媒介中;通过存储设备来访问这些文件..文件是由其创建者定义的相关信息的集合..一般的文件表现为程序源程序和目标代码和数据..数据文件可能是数字的、字母的或二者混合的..文件可能是形式自由的如文本文件;也可能有严格定义的格式如固定字段..由字、字节、行或记录组成的文件结构是其创建者定义的..文件概念具有相当广泛的含义..操作系统通过管理大容量存储体如由驱动器控制的磁盘和磁带实现了文件的抽象概念..另外;为了更简易地使用文件;通常将他们组织到目录中..最后;如果有多个用户访问文件;可能需要控制谁以什么样的方式访问例如:读、写、追加..操作系统要负责下列与文件管理相关的工作:创建和删除文件;创建和删除目录;将文件映像到辅助存储器中;将文件备份到永久非易失性存储体中..5.I/O系统管理操作系统的目的之一就是要向用户隐藏具体的硬件特性..例如;在UNIX中;通过I/O子系统向操作系统隐藏了I/O设备的特性..I/O子系统由以下几个方面组成:一个内存管理模块;这包括Buffering、Caching和SPOOLing;一个通用设备驱动程序接口;针对具体硬件设备的驱动程序..6.辅助存储器管理操作系统的主要目的是执行程序..这些程序在运行时以及它们要访问的数据都必须在主存储器中..因为主存储器的容量太小不能存储所有的程序和数据;而且掉电后会丢失所有的存储信息;所以计算机系统必须要提供辅助存储器作为主存储器的后备..大多数现代计算机系统使用磁盘作为存储程序和数据的主要联机存储体..大多数程序包括编译程序、汇编程序、排列程序、编辑程序和格式化程序在载入内存之前存储在磁盘上;并且在运行时利用磁盘存储它们所处理的源文件和目标文件..因此;合理的磁盘管理对一个计算机系统来说是至关重要的..操作系统要负责下列与辅助存储器管理相关的工作:空闲空间管理;空间分配;磁盘调度..因为频繁地使用辅助存储器;所以必须要能够高效运行..而且计算机的整体运行速度取决于磁盘子系统的速度和该子系统实现算法的效率..7.网络管理分布式系统是一个处理机的集合;这些处理机既不共享内存和外围设备;也不共享时钟..而是每个处理机拥有自己的本地内存和时钟;并且这些处理机可以通过各种通信线路如高速总线或网络进行通信..一个分布式系统中的处理机在规模和功能上有所不同;其中可能包括小型微处理器、工作站、小型机和大型通用计算机..在分布式系统中;处理机通过通信网络相连接;有多种不同的方法可以配置该网络..这种网络可以完全或部分地连接..通信网络的设计必须要考虑报文路由选择和连接策略;以及争用和安全的问题..分布式系统将物理上相互独立的可能不同种类的系统集合成为一个独立相连的系统;它具有向用户提供访问由系统维护的各种资源的能力..对共享资源的访问加快了计算速度、增强了系统功能、提高了数据的可用性并加强了可靠性..操作系统把网络细节包含在了网络接口设备驱动程序中;于是将网络访问泛化为一种文件访问的形式..因此;分布式系统所使用的协议在很大程度上影响到系统的效率和普及..8.系统保护如果一个计算机系统有多个用户并允许并行执行多个进程;那么必须要保护各个进程免受其他进程的侵扰..为此;需要提供一种机制来保证只有那些从操作系统获取了合适权限的进程能够操作文件、存储段、CPU和其他资源..例如;内存寻址硬件确保了一个进程只能在自己的地址空间内执行;计时器确保进程最终能够放弃对CPU的控制;用户不能够访问设备控制寄存器;这样;就保护了各种外围设备的完整性..保护是操作系统定义的控制程序;是进程或用户访问的机制..这个机制必须要提供一种方法来描述要施加的控制;以及强制执行的方法..通过检测子系统接口中潜伏的错误;保护能够增强系统的可靠性..对接口错误的早期检测常常能够阻止一个子系统故障波及到其他正常的子系统..一个未受保护的资源难以防止未授权或不适当的用户的使用或误用..一个面向保护的系统提供了一种区分授权的和未授权的使用方法..9.操作系统服务操作系统提供了程序运行的环境..它为程序和程序用户提供了特定的服务..当然;不同的操作系统提供的具体服务不同;但是我们能够找出其共同部分..提供的这些操作系统服务是为了便于程序员设计程序..具体如下..程序执行:系统必须能够将程序载入内存并运行它..程序必须能够正常地或异常地指示错误结束运行..I/O操作:一个正在运行的程序可能要请求I/O操作..这可能会涉及文件或I/O 设备..针对具体的设备;需要特定的功能如倒卷一个磁带驱动器或清空一个CRT屏幕显示..出于系统效率和保护的原因;用户通常不能够直接控制I/O设备..因此;操作系统必须要提供一种I/O运行机制..文件系统处理:文件系统相当有意思..显然;程序需要能够读写文件;也要能够创建和删除文件..通信:在很多情况下;一个进程需要与另外一个进程交换信息..通信有两种主要的方式..第一种方式是在运行在同一台计算机上的进程间通信;另外一种方式是运行在由一个计算机网络连接的不同的计算机系统上的进程间通信..可以通过共享存储器或报文传送这种方式中;操作系统在进程之间将信息打包移动的方式实现进程间的通信..错误检测:操作系统需要经常注意可能发生的错误..错误可能发生在CPU、内存如存储错误或电源故障、I/O设备如磁带奇偶检验错误、连结网络失败或打印机缺纸及用户程序如运算溢出、试图访问非法存储器地址或过多占用CPU时间中..对于每种类型的错误;操作系统应该能够采取针对性措施以确保计算的正确性和相容性..另外;操作系统还存在另外一些功能;它们不是为了帮助用户工作;而是为了确保系统本身的高效运行..如:资源分配:当多个用户登录到系统中或同时有多个作业运行时;必须要在它们之间分配资源..操作系统管理许多不同类型的资源..有些资源如CPU周期、主存储器和外存储器可能有专用的分配代码;而其他的如I/O设备可能有更通用的请求和释放代码..例如;在决定如何最好地使用CPU的问题上;操作系统的CPU调度程序要考虑CPU速度、必须要执行的作业、有效的寄存器数量和其他的一些因素;账户管理:我们希望跟踪记录每个用户使用哪些类型的计算机资源和用了多少..这个记录保持可能用于记账以便用户付账或简单地用于累加使用率统计..对于研究者来说;使用率统计可能是个有效的工具..利用使用率统计;研究者可以重新配制系统以改善计算服务;保护:存储在多用户计算机系统上的信息的所有者希望能够控制对该信息的使用..当多个不相关的进程并发执行时;一个进程不应该能够干扰其他进程或操作系统本身..保护包括了监控所有对系统资源的访问..对来自外界的系统安全检测security也是非常重要的..这种保护往往通过密码的方式;用户向系统验证口令才能访问资源..它也包括了保护外部I/O设备包括调制解调器和网络适配器免于非法的访问企图和记录所有这样的非法闯入..如果一个系统受到保护并且是安全的;那么就必须要建立预防措施..一般;系统的安全强度与其最薄弱的一个环节密切相关..1.2.2操作系统功能的实现模型操作系统本身是一组程序;像其他程序一样也在处理器上执行;那么;操作系统程序是否组织成进程它是如何控制和怎样执行的呢下面来讨论这个问题..从操作系统的执行方式来看;可以把它分成:非进程内核模型、OS功能函数在用户进程内执行的模型和OS功能函数作为独立进程执行的模型3种..1.非进程内核模型许多老式操作系统的实现采用非进程内核模型;即操作系统的功能都不组织成进程来实现;如图1-2所示;该模型包括一个较大的操作系统内核程序;进程的执行在内核之外..当中断发生时;当前运行进程的上下文现场信息将被保存;并把控制权传递给操作系统内核..操作系统具有自己的内存区和系统堆栈区;用于控制过程调用和返回..它将在核心态执行相应的操作;并根据中断的类型和具体的情况;或者是恢复被中断进程的现场并让它继续执行;或是转向进程调度指派另一个就绪进程运行..在这种情况下;进程的概念仅仅是针对用户程序而言的;操作系统代码作为一个独立实体在内核模式下运行..2.OS功能在用户进程内执行的模型小型机和工作站操作系统如UNIX等往往采用OS的所有功能在用户进程内执行的模型;如图1-3所示;在这种实现模型中;大部分操作系统功能组织成一组例行程序供用户程序调用;认为操作系统例程与用户进程是上下文相关的;操作系统的地址空间被包含在用户进程的地址空间中;因而;操作系统例行程序也在用户进程的上下文环境中执行..图1-4给出了OS的所有功能在用户进程内执行的模型中的进程映像;它既包含进程控制块、用户堆栈、容纳用户程序和数据的地址空间等;还包括操作系统内核的程序、数据和系统堆栈区..当发生一次中断或系统调用后;处理器状态将被置成内核模式;控制从用户进程手中被剥夺并传递给操作系统例行程序..此时;发生了模式切换;模式上下文现场信息被保存;但是进程上下文切换并没有发生;操作系统仍在该用户进程中执行;提供单独的内核堆栈用于管理进程在核心态下执行时的调用和返回;操作系统例行程序和数据放在共享地址空间;且被所有用户进程共享..当操作系统例程完成了工作之后;如果让当前进程继续运行的话;就可以做一次模式切换来恢复执行原先被中断的用户进程..这种技术提供了不必要通过进程上下文切换就可以中断用户进程来调用操作系统例行程序的手段..如果发生进程切换;控制就被传递给操作系统的进程切换例行程序;由它来实现进程切换操作;把当前进程的状态置为非运行状态;而指派另一个就绪进程来占有处理器运行..需要指出的是;一些系统中进程切换例行程序是在当前进程中执行的;而另一些系统则不是..3.OS功能作为独立进程执行的模型OS功能作为独立进程执行的模型把操作系统组织成一组系统进程、即操作系统功能是这些系统进程集合运行的结果;这些系统进程也称为服务器或服务器进程;于是与用户进程或其他服务器进程之间构成了Client/Server关系;Windows2000/XP采用了这种结构..如图1-5所示;除了极少部分功能在内核模式下运行;大部分操作系统功能被组织在一组分离的独立进程内实现;这组进程在用户模式下运行;而进程切换例行程序的执行仍然在进程之外..这一实现模型有很多优点..首先;它采用了模块化的操作系统实现方法;模块之间具有最少和简洁的接口..其次;大多数操作系统功能被组织成独立的进程;有利于操作系统的实现、配置和扩充;如性能监控程序用来记录各种资源的利用率和系统中用户进程的执行速度;由于这些程序并不提供给进程特别的服务;仅仅被操作系统调用;把它设计成一个服务器进程;便可赋予一定的优先级;夹在其他进程中运行..最后;这一结构在多处理器和多计算机的环境下非常有效;一些操作系统服务可指派到专门处理器上执行;有利于系统性能的改进..。
第四章 MIPS 异常和中断处理MIPS 异常和中断处理(Exception and Interrupt handling)任何一个CPU都要提供一个详细的异常和中断处理机制。
一个软件系统,如操作系统,就是一个时序逻辑系统,通过时钟,外部事件来驱动整个预先定义好的逻辑行为。
这也是为什么当写一个操作系统时如何定义时间的计算是非常重要的原因。
大家都非常清楚UNIX提供了一整套系统调用(System Call)。
系统调用其实就是一段EXCEPTION处理程序。
我们可能要问:为什么CPU要提供Excpetion 和 Interrupt Handling呢?*处理illegal behavior, 例如,TLB Fault, or, we say, the Page fault; Cache Error;* Provide an approach for accessing priviledged resources, for example, CP0 registers. As we know, for user level tasks/processes, they are runningwith the User Mode priviledge and are prohibilited to directly control CPO. CPU need provide a mechanism for them to trap to kernel mode and then safely manipulate resources that are only availablewhen CPU runs in kernel mode.* Provide handling for external/internal interrupts. For instance, the timer interrupts and watch dog exceptions. Those two interrupt/exceptions are very important for an embedded system applicances.Now let's get back to how MIPS supports its exception and interrupt handling.For simplicty, all information below will be based on R7K CPU, which is derived from the R4k family.* The first thing for understanding MIPS exception handling is: MIPS adopts **Precise Exceptions** mechanisms. What that means? Here is the explaination from the book of "See MIPS Run": "In a precise-exception CPU, on any exception we get pointed at one instruction(the exception victim). All instructions preceding the exception victim in executionsequence are complete; any work done on the victim and on any subsequent instructions (BNN NOTE: pipeline effects) has no side effects that the software need worry about. The software that handles exceptions can ignore all the timing effects of the CPU's implementations"上面的意思其实很简单:在发生EXCEPTION之前的一切计算行为会**FINISH**。
三、中断和异常1.中断 同步中断:由当前CPU执⾏完⼀条指令之后产⽣,intel处理器⼿册也将同步中断称为异常。
异步中断:由其他硬件设备依照CPU时钟信号随机产⽣,intel处理器⼿册将异步中断称为中断。
中断处理需要满⾜的约束: 1.中断处理必须尽可能的快和短,关键紧急和跟硬件相关的操作内核应⽴即执⾏,其余推迟的部分由内核稍后执⾏。
2.中断处理程序必须能够嵌套执⾏(针对不同类型的中断)。
3.内核代码的临界区中应该禁⽌中断。
但是必须尽可能的限制这样的临界区,否则会⼤⼤降低内核的运⾏效率。
2.中断和异常 Intel⽂档对中断和异常的分类: 中断: 可屏蔽中断(IRQ)、⾮屏蔽中断 异常: 处理器探测异常:当CPU执⾏指令时探测到的⼀个反常条件所产⽣的异常,可以进⼀步分为三组,取决于产⽣异常时eip寄存器的值。
故障,陷阱,异常中⽌,编程异常3.IRQ和中断 每个能发出中断请求的硬件设备控制器都有⼀条名为IRQ的输出线。
所有的IRQ线都与⼀个名为可编程中断控制器(PIC)的硬件电路的输⼊引脚相连。
IRQ线从0开始顺序编号。
可以有选择的禁⽌每条IRQ线,通过对PIC编程禁⽌和激活IRQ。
禁⽌的中断是丢失不了的,⼀旦中断被激活,PIC会将之前的中断信号发送到CPU,这样中断处理程序可以逐次地处理同⼀类型的IRQ。
⾼级可编程中断控制器: I/O⾼级可编程控制器(APIC),每个CPU都有⼀个本地APIC,每个APIC都有32位寄存器,所有本地APIC都连接到⼀个外部I/O APIC,形成⼀个多APIC的系统。
I/O APIC的组成:⼀组24条IRQ线、⼀张24项的中断重定向表。
中断优先级不与引脚号相关联,中断重定向表中的每⼀项都可以被单独编程以指明中断向量和优先级、⽬标处理器和选择处理器的⽅式。
来⾃外部硬件设备的中断请求以两种⽅式在可⽤CPU之间分发: 静态分发: IRQ信号传递给重定向表相应项中所列出的本地APIC。
一,Linux 异常处理体系结构框架:1,按键按下时。
强制的跳到异常向量处执行(中断是异常的一种)。
2,CPU 发生中断。
3,“入口函数”是一条跳转指令。
跳到某个函数:(作用)将2440 作为单片机使用时:裸机程序时②,执行中断处理函数。
③,恢复被中断的现场。
①,保存被中断处的现场(各种寄存器的值)。
LINUX 中处理中断的过程:1,写程序时先设置异常入口:发生“中断”时,就跳到0x18地址处,跳转到“HandleIRQ”是执行下面的指令:中断处理完后,要返回去继续执行之前被中断的那个程序。
保存寄存器就是保存中断前那个程序的所用到的寄存器。
然后是处理中断,最后是恢复。
linux 中:异常向量在哪里:LINUX 异常处理结构、中断处理结构:2012年2月23日11:03①,LINUX的异常向量在哪里:ARM架构的CPU的异常向量基址可以是 0x0000 0000,也可以是 0xffff0000,LINUX内核使用后者,只需要在某个寄存器里设置下,就可以将异常基址定位到这里来。
这个地址并不代表实际的内存,是虚拟地址。
当建立了虚拟地址与物理地址间的映射后,得将那些异常向量,即相当于把那些跳转指令(如:HandleSWI 等)复制拷贝到这个 0xffff0000这个地址处去。
(“那些跳转指令”是指head.S中那些跳转)。
这个过程是在trap_init这个函数里做。
trap_init函数将异常向量复制到0xffff0000处,部分代码如下:如上:将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。
将 __vectors_start, __vectors_end -__vectors_start 这段代码拷贝到 vectors来。
vectors是“CONFIG_VECTORS_BASE” 是个配置项(内核的配置选项)。
在linux源码顶层目录下:vim .config, 搜索“CONFIG_VECTORS_BASE”。
我的内核配置文件这个地址是“0xffff0002”和书上的不同。
__vectors_start 在 entry-armv.S 中定义,也是些跳转指令。
可见和单片中的一样(都是跳转指令)。
A:假设发生了 vector_und (undefined)异常未定义指令后,会跳转到 vector_und 加一个偏移地址stubs_offset(b vector_und + stubs_offset)。
这个 vector_und 地址标号源代码里没有,它是一个宏:将这个宏展开:将这个宏展开:===========================================vector_stub und, UND_MODE这个宏展开替换下面的语句:.macro vector_stub, name, mode, correction=0(.macro 开始定义宏)把宏展开,上面的name就是"und"。
则下来替换后,“vector_\name”就成了“vector_und”vector_\name:(变成vector_und: )定义了一个vector_und标号。
做的事情如下。
.if \correction因为上面“correction=0”,即这里是:.if 0.所以if...endif 间的代码忽略。
sub lr, lr, #\correction.endif(这三句因为"correction=0,忽略不要")@@ Save r0, lr_<exception> (parent PC) and spsr_<exception>先保存。
@ (parent CPSR)@stmia sp, {r0, lr} @ save r0, lrmrs lr, spsrstr lr, [sp, #8] @ save spsr@@ Prepare for SVC32 mode. IRQs remain disabled.转换到管理模式。
@mrs r0, cpsreor r0, r0, #(\mode ^ SVC_MODE)msr spsr_cxsf, r0@@ the branch table must immediately follow this code这里是下一级跳转@and lr, lr, #0x0fmov r0, spldr lr, [pc, lr, lsl #2]movs pc, lr @ branch to handler in SVC mode.endm(.endm 结束宏定义).endm (.endm 结束宏定义)这里是下一级的跳转,跳转表如下:①,name是und.if \correctionsub lr, lr, #\correction.endif②,correction=0默认是0,则:则这三句不用管。
后面 __und_usr等标号中,去保存那些寄存器,作处理。
处理完后,再恢复那些寄存器,即恢复那些被中断的程序。
③,下一级跳转表:B:下面是一个实例:在 entry -armv.S 源码中的第1069行:B:下面是一个实例:在 entry -armv.S 源码中的第1069行:发生中断便跳转到这里。
这个地址标号“vector_irq”在代码中也没有。
也是一个宏来定义的:vector_stub irq, IRQ_MODE, 4 这里是一个宏,将这个宏和宏参数替换到下面的宏定义中去:“name ”为“irq ”.“correction ”为“4”。
.align 5.macro vector_stub, name, mode, correction=0.if \correction 宏替换后:.if 4vector_\name: 宏替换后:vector_irq:也是和上面的“vector_stub und, UND_MODE”一样,是用下面的宏展开:.if \correction宏替换后:.if 4sub lr, lr, #\correction宏替换后:sub lr, lr, #4.endif这里宏替换后就变成:vector_irq:.if 4sub lr, lr, #4.endif"sub lr, lr, #4"这是计算返回地址,比较裸机程序:“F:\embedded\嵌入式LINUX开发完全手册\嵌入式LINUX开发完全手册光盘\视频\ask100_example\int”下的:head.S@@ Save r0, lr_<exception> (parent PC) and spsr_<exception>转换到“管理模式”。
@ (parent CPSR)@stmia sp, {r0, lr}@ save r0, lrmrs lr, spsrstr lr, [sp, #8]@ save spsr@@ Prepare for SVC32 mode. IRQs remain disabled.@mrs r0, cpsreor r0, r0, #(\mode ^ SVC_MODE)msr spsr_cxsf, r0@@ the branch table must immediately follow this code这里是下一级跳转@and lr, lr, #0x0fmov r0, spldr lr, [pc, lr, lsl #2]movs pc, lr@ branch to handler in SVC mode.endm下一级跳转的跳转表:__irq_usr : 应该是用户态发生中断时,就跳转到“__irq_usr ”标号中去。
__irq_svc:在管理模式里发生中断时,就跳转到“__irq_svc”这个标号中去。
上面的跳转表,从名字上猜测:查看标号“__irq_usr ”:这个宏 usr_entry 应该是保存那些寄存器。
搜索“usr_entry”的宏定义如下:在这个栈(sp )中将寄存器保存进去。
接着再看:__irq_svc标号的实现,会有个:"irq_handler"也是一个宏:"irq_handler"也是一个宏:从上面的宏定义可以看到,最终会调用一个 asm_do_IRQ .就是处理函数,比较复杂的代码就用C语言实现。
总结:linux 内核中处理异常的流程,最后调用到“asm_do_IRQ()”①,异常向量:首先“trap_init”构造了“异常向量”。
②,异常向量是什么?异常向量就是将这段代码“__vectors_start”拷贝到0xffff0000“vectors”处:最后是调用:异常向量就在这里。
这“异常向量”也是某些跳转。
如:“b vector_irq + stubs_offset”因为向量已重新定位了,所以得加上“stubs_offset”偏移地址。
“vector_irq”是链接地址,要加上一个偏移地址才能正确的跳转。
③,vector_irq 做的事:它是由一个宏定义的。
做的事和单片机程序一样。
a,计算返回地址:sub lr, lr, #4b, 保存寄存器值:c,调用处理函数(如:__irq_usr若用户态发生中断,就跳转到这个标号处。
)d, 处理函数又去调用“宏”:如"__irq_usr"标号处理是“usb_entry”宏,此宏先保存环境变量诸多寄存器。
然后就调用宏“irq_handler”。
此宏的定义会调用函数“asm_do_IRQ”。
如: __irq_usr:usr_entry(这个宏也是保存些寄存器)irq_handler(从__irq_usr后调用这个函数,它也是一个宏。
)asm_do_IRQ(irq_hander这个宏是做asm_do_IRQ函数) e:恢复(调用完asm_do_IRQ函数后)==================================================二,LINUX的中断框架:内核中断框架了解“asm_do_IRQ”,理解中断处理的过程。
A,单片机下的中断处理:1,分辨是哪个中断。
2,调用处理函数(哪个中断就调用哪个处理函数)。
3,清中断。
1,上面是先读寄存器“INTOFFSET”,看是哪个中断。
2,中间是中断处理。
3,最后是清中断。
内核的也差不多。
以上单片机的3个过程,都是在 asm_do_IRQ 中实现的。
最终在“handle_irq”中实现的。
struct irq_desc *desc = irq_desc + irq;1,首先是根据传进来的 IRQ 中断号(参1),irq_desc 是一个数组。