




已阅读5页,还剩35页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Linux源代码阅读 SMP结构中的中断机制和进程调度 张飞 概要 SMP结构中的中断机制分布式中断处理中断初始化处理器间中断IPISMP结构中的进程调度 分布式中断处理APIC简介SMP结构中的中断控制硬件机构全局APIC本地APIC 高级可编程中断控制器APIC 为了充分利用smp体系结构的并行性 要求动态分配中断请求 也就是说可以向任意cpu发出中断请求 传统的i386处理器都采用8259A中断控制器 其作用是提供多个外部中断源与单一cpu之间的连接 如果在SMP结构中还是采用8259A中断控制器 那就只能静态的把所有的外部中断源划分成若干组 分别把每一组都连接到一个8259A 而8259A则与cpu有一对一的连接 这样就达不到动态分配中断请求的目的 为了更好的支持smp结构 从Pentium开始 Intel设计了一种更为通用的中断控制器 称为高级可编程中断控制器APIC AdvancedProgrammableInterruptController SMP结构中的中断控制硬件机构 cpu0 本地APIC cpu1 本地APIC 本地APIC cpun 全局APIC 本地中断请求 本地中断请求 本地中断请求 ICC 中断控制器通信 总线 外部中断请求 分布式中断处理硬件机制概述 两种APIC 本地APIC和全局APIC 通过中断控制器通信 InterruptControllerCommunication ICC 总线相连 本地APIC集成在cpu内部 通过内部APIC可以向其他cpu发送中断请求 全局APIC负责把来自外部设备的中断请求提交和分配给系统中各个cpu的任务 全局APIC 组成全局APIC由一组IRQ线路 一个有24个表项的中断重定向表 InterruptRedirectionTable 一个可编程寄存器和一个用来发送和接受经过ICC总线的APIC消息的消息单元组成 和8259A的IRQ引脚不同 中断优先级和引脚号无关 重定向表中的每个表项都可以被单独编程来说明中断向量和优先级 目标处理器以及如何选定处理器 重定向表中的消息用来把外部IRQ信号转换成通过ICC总线发往一个或多个本地APIC单元的消息 全局APIC 工作模式固定模式把IRQ信号发送到相应的重定向表表项所列出的本地APIC上 最低优先级模式把IRQ信号发送到正在执行优先级最低的进程的处理器的本地APIC上 所有的本地APIC都有一个可编程任务优先级寄存器 taskpriorityregister 它包含了当前正在运行的进程的优先级 在每次任务切换时这个寄存器的值必须由内核进行修改 本地APIC 组成每个本地APIC都有几个32位的寄存器 一个内部时钟 一个定时器设备 240个不同的中断向量 从0 x20 0 xff 0 0 x1f用于cpu本身的陷阱 以及两条为局部中断保留的IRQ线路 这两条线路用于重启系统 本地APIC的一个重要功能是实现处理器间中断IPI当一个cpu想要向其他cpu发送中断时 将中断向量和目标处理器的本地apic标志符保存到自己本地apic的中断命令寄存器中 然后通过ICC总线向目标处理器的本地apic发送一条消息 目标处理器的本地apic就向自己的cpu发出相应的中断 SMP结构中的中断控制硬件机构 cpu0 本地APIC cpu1 本地APIC 本地APIC cpun 全局APIC 本地中断请求 本地中断请求 本地中断请求 ICC 中断控制器通信 总线 外部中断请求 概要 SMP结构中的中断机制分布式中断处理中断初始化处理器间中断IPISMP结构中的进程调度 中断初始化smp相关的几个主要中断向量设置中断门中断响应程序的建立相关中断处理程序代码smp reschedule interrupt smp call function interrupt smp相关的几个主要中断向量 smp结构专用的几个IRQ向量定义在include asm i386 apic h中 defineSPURIOUS APIC VECTOR0 xff defineERROR APIC VECTOR0 xfe defineINVALIDATE TLB VECTOR0 xfd defineRESCHEDULE VECTOR0 xfc defineCALL FUNCTION VECTOR0 xfb defineLOCAL TIMER VECTOR0 xef其他不常用的向量合并到CALL FUNCTION VECTOR中以节省向量空间 使用比较频繁的是TLB reschedule和localAPIC中断向量 设置中断门 void initinit IRQ void for i 0 i NR IRQS i intvector FIRST EXTERNAL VECTOR i if vector SYSCALL VECTOR set intr gate vector interrupt i ifdefCONFIG SMPset intr gate FIRST DEVICE VECTOR interrupt 0 set intr gate RESCHEDULE VECTOR reschedule interrupt set intr gate INVALIDATE TLB VECTOR invalidate interrupt set intr gate CALL FUNCTION VECTOR call function interrupt endif 设置中断门 for循环设置了除SYSCALL VECTOR外从FIRST EXTERNAL VECTOR开始的NR IRQS个中断门向量 在smp结构中覆盖了其中的4个 其他的中断向量基本上没有什么变化 还与采用8259A时大致相同 不同的是现在由全局APIC取代8259A将外部中断请求送达各个cpu 为中断向量FIRST DEVICE VECTOR设置的中断响应入口程序是interrupt 0 中断向量RESCHEDULE VECTOR的中断响应入口程序是reschedule interrupt 中断向量INVALIDATE TLB VECTOR的中断响应入口程序设置为invalidate interrupt 中断向量CALL FUNCTION VECTOR对应call function interrupt程序 中断响应程序的建立 上述几个主要中断向量的实际中断处理程序由下面一组宏语句建立 ifdefCONFIG SMPBUILD SMP INTERRUPT reschedule interrupt RESCHEDULE VECTOR BUILD SMP INTERRUPT invalidate interrupt INVALIDATE TLB VECTOR BUILD SMP INTERRUPT call function interrupt CALL FUNCTION VECTOR endif 中断响应程序的建立 其中BUILD SMP INTERRUPT宏定义如下 defineBUILD SMP INTERRUPT x v XBUILD SMP INTERRUPT x v defineXBUILD SMP INTERRUPT x v asmlinkagevoidx void asmlinkagevoidcall x void asm n ALIGN STR n SYMBOL NAME STR x n t pushl v n t SAVE ALL SYMBOL NAME STR call x n t call SYMBOL NAME STR smp x n t jmpret from intr n 中断响应程序的建立 BUILD SMP INTERRUPT reschedule interrupt RESCHEDULE VECTOR 宏展开如下 asmlinkagevoidreschedule interrupt void asmlinkagevoidcall reschedule interrupt void asm reschedule interrupt pushl RESCHEDULE VECTOR 中断号存进核心栈SAVE ALL 保存各个寄存器值call smp reschedule interrupt callsmp reschedule interruptjmpret from intr 中断响应程序的建立 至此 结合前面说的中断门的初始化 smp专有的主要中断向量及其响应机制建立起来 当发生RESCHEDULE VECTOR中断时 响应程序的入口是reschedule interrupt 实际负责中断处理程序的函数为smp reschedule interrupt 同理 与INVALIDATE TLB VECTOR相对应的入口程序是invalidate interrupt 实际中断处理程序的则是smp invalidate interrupt 与CALL FUNCTION VECTOR相对应的入口程序是call function interrupt 而实际处理中断请求的是smp call function interrupt 具体中断处理程序 smp reschedule interrupt asmlinkagevoidsmp reschedule interrupt void ack APIC irq 发送中断请求确认 externinlinevoidack APIC irq void apic write around APIC EOI 0 向本地APIC的控制寄存器写入0 表示已经收到了中断请求 具体中断处理程序 smp reschedule interrupt 该函数应其他cpu的请求进行一次进程调度 但是从程序代码上看 该函数仅仅发回一个中断确认 实际上 对中断请求的服务隐藏在内核对中断处理的公共部分 内核在针对特定中断请求的服务完成后都要检查 本cpu 是否需要进行进程调度 这正是smp reschedule interrupt 的所要达到的目的 引发目标CPU一次中断 以便检查是否需要重新调度 具体中断处理程序 smp call function interrupt 该函数响应CALL FUNCTION VECTOR 用于请求目标CPU执行一个指定的函数 发送者先设置好一个全局的call data struct数据结构 然后向目标CPU发出请求 目标CPU收到中断向量后 调用该函数进行处理staticspinlock tcall lock SPIN LOCK UNLOCKED structcall data struct void func void info 指向要求对方执行的函数void info 函数参数atomic tstarted atomic tfinished intwait staticstructcall data struct call data 具体中断处理程序 smp call function interrupt asmlinkagevoidsmp call function interrupt void void func void info call data func 取出函数指针void info call data info intwait call data wait ack APIC irq 先发回中断确认atomic inc 具体中断处理程序 smp call function interrupt 当然 一般的函数是没有必要请其他CPU来执行的 因为系统中所有的CPU都可共享同样的代码和数据 之所以要请求其他CPU执行 是因为某个函数必须由特定的CPU来执行 例如 pentium处理器有一条cpuid指令 通过这条指令可以查询本CPU的型号 版本以及是否支持一些特殊的功能 当前的功能设置等等信息 但是这条指令只能由具体的CPU本身执行 而不能由别的CPU代替 这样 如果要知道系统中某一个CPU的有关情况 就只能请求该CPU来执行cpuid指令 概述 SMP结构中的中断机制分布式中断处理中断初始化处理器间中断IPISMP结构中的进程调度 处理器间中断IPIIPI概述IPI中断向量IPI中断请求函数 IPI概述 IPI InterprocessorInterrupt 称为处理机间中断 实际上 前面介绍的RESCHEDULE VECTOR INVALIDATE TLB VECTOR以及CALL FUNCTION VECTOR都属于处理器间中断IPI 从前一部分可以看出 与单cpu系统的中断处理机制相比 smp系统仅仅作了少量修改 并且这些修改又大部分集中在处理器间中断IPI这一部分 也许我们可以从另一个角度来看待smp系统的中断机制 smp中断机制和单CPU系统中断机制在某种程度上是等价的 全局APIC CPU0 CPU1 CPUn 本地APIC 本地APIC 本地APIC 外部中断 外部中断 CPU 8259A 单个 超级 处理器 SMP结构与单CPU系统中断机制的类比 IPI中断向量 本地APIC可以识别6种消息 这些消息是由接收消息的CPU作为不同中断向量来解释的 之所以不同于一般中断向量 可能是因为这些中断向量并不对应着实际的中断请求引脚 SPURIOUS APIC VECTOR 0 xff 入口程序spurious interrupt 实际中断处理程序smp spurious interrupt ERROR APIC VECTOR 0 xfe 出错计数器溢出中断 入口程序error interrupt 中断处理程序smp error interrupt INVALIDATE TLB VECTOR 0 xfd RESCHEDULE VECTOR 0 xfc CALL FUNCTION VECTOR 0 xfb LOCAL TIMER VECTOR 0 xef I OAPIC把定时中断自动发给所有的CPU 相应的入口程序是apic timer interrupt 实际中断服务程序为smp apic timer interrupt 中断请求函数 中断请求函数用于向目标CPU发送指定的IPI请求向量staticinlinevoidsend IPI allbutself intvector 向除自己以外的所有CPU发送一个IPI staticinlinevoidsend IPI all intvector 向所有的CPU 包括自己 发送一个IPI voidsend IPI self intvector 向自己发送一个IPI staticinlinevoidsend IPI mask intmask intvector 向由mask指定的一个或多个CPU发送一个IPI 这几个函数功能大同小异 实现代码也都比较简单 其中以send IPI mask函数最为灵活 因而也稍为复杂一些 send IPI mask函数 staticinlinevoidsend IPI mask intmask intvector unsignedlongcfg unsignedlongflags save flags flags 中断前状态信息保存在flags中 cli 关中断apic wait icr idle 确认或等待APIC ICR处于空闲状态 ICR2 ICR是本地APIC的2个控制寄存器 cfg prepare ICR2 mask 根据中断请求的目标CPU准备将要apic write around APIC ICR2 cfg 写入寄存器APIC ICR2的值cfg prepare ICR 0 vector 根据要发送的中断向量准备将要apic write around APIC ICR cfg 写入寄存器APIC ICR的值 对APIC ICR的写入操作引发并完成将中断向量发送至目标cpu的工作 restore flags flags 恢复标志 staticinlineint prepare ICR2 unsignedintmask returnSET APIC DEST FIELD mask staticinlineint prepare ICR unsignedintshortcut intvector returnAPIC DM FIXED shortcut vector APIC DEST LOGICAL 其他相关发送函数 再看一个较为简单的函数send IPI allstaticinlinevoidsend IPI all intvector send IPI shortcut APIC DEST ALLINC vector staticinlinevoid send IPI shortcut unsignedintshortcut intvector unsignedintcfg apic wait icr idle 确认或等待ICR空闲cfg prepare ICR shortcut vector 对ICR进行编程apic write around APIC ICR cfg 与send IPI reschedule相比 少了耗时的开 关中断动作 并且只对APIC编程一次 除send IPI mask 之外的几个发送函数实际上都是简单的调用 send IPI shortcut函数 只不过传给这个函数的参数不同而已 在这些函数基础上 还定义了一些功能更为专一 明确的函数 比如当一个CPU需要另一个CPU进行一次进程调度时 可以调用下面的函数 voidsmp send reschedule intcpu send IPI mask 1 cpu RESCHEDULE VECTOR 概要 SMP结构中的中断机制分布式中断处理中断初始化处理器间中断IPISMP结构中的进程调度 相关数据结构 单CPU系统中 任一时刻只有当前进程是在运行中的 但在SMP系统中同时有好几个进程在运行 因此在task struct结构中引入两个字段 一个是has cpu 为1时说明进程正在运行 为0则表示不在运行 另一个字段是processor 当has cpu为1时指出进程是在哪一个cpu上运行 一个相关的宏操作can schedule ifdefCONFIG SMP defineidle task cpu init tasks cpu number map cpu definecan schedule p cpu p has cpu p cpus allowed 1 cpu else defineidle task cpu init task definecan schedule p cpu 1 endif 调度函数Schedule 中相关代码 当一个CPU通过schedule 从系统的就绪队列中挑选了一个进程作为运行的下一个进程next 即从当前进程prev切换到这个进程时 就将其task struct结构中的has cpu字段设置成1 并将processor设置成该CPU的逻辑编号 asmlinkagevoidschedule void this cpu prev processor 取得当前CPU逻辑号 ifdefCONFIG SMPnext has cpu 1 将要上台进程的has cpu设置为1next processor this cpu 设置processor字段 endifspin unlock irq 处理下台的prev进程 看能否在其他cpu上重新调度 staticinlinevoid schedule tail structtask struct prev 函数 保存先前进程调度策略并清零prev policy中SCHED YIELD标志位 将prev的has cpu字段清零 下台前运行态 空转 进程或自动下台 之前是运行态 尝试重新调度prev进程 开始 返回 policy prev policy prev policy policy task lock prev prev has cpu 0 mb N Y Y N N Y if prev state TASK RUNNING if prev idle task smp processor id policy SCHED YIELD if prev state TASK RUNNING reschedule idle prev staticvoidreschedule idle structtask struct p 函数 staticvoidreschedule idle structtask struct p ifdefCONFIG SMPintthis cpu smp p
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 内网安全准入考试题库及答案解析
- 教育教学理念演讲课件
- 学校一周工作总结
- 改装喷淋头施工方案范本
- 霍曼门的施工方案
- 剪力墙破除重新施工方案
- 陕西安全资格证c类考试题库及答案解析
- 临床护理带教老师选拔
- 公路路肩工程施工方案
- 塑料防水板公路施工方案
- GB 46039-2025混凝土外加剂安全技术规范
- 传染病医院质量控制检查标准表
- 卷烟零售户培训课件
- 刑事诉讼法案例课件
- 2025年杭州市上城区九堡街道社区卫生服务中心招聘编外4人笔试备考试题及答案解析
- 2025年煤矿从业人员安全培训考试题库及答案
- 医院净化空调系统基本知识
- 内蒙锡林郭勒盟卫生系统招聘考试(护理学专业知识)题含答案2024年
- 财政专题分析报告:财政数据背后的宏观线索-国金证券
- 110kV~750kV架空输电线路施工及验收规范
- DGTJ08-2090-2020 绿色建筑评价标准
评论
0/150
提交评论