Linux操作系统分析与实践.ppt

上传人:新** 文档编号:576247711 上传时间:2024-08-19 格式:PPT 页数:165 大小:980.10KB
返回 下载 相关 举报
Linux操作系统分析与实践.ppt_第1页
第1页 / 共165页
Linux操作系统分析与实践.ppt_第2页
第2页 / 共165页
Linux操作系统分析与实践.ppt_第3页
第3页 / 共165页
Linux操作系统分析与实践.ppt_第4页
第4页 / 共165页
Linux操作系统分析与实践.ppt_第5页
第5页 / 共165页
点击查看更多>>
资源描述

《Linux操作系统分析与实践.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统分析与实践.ppt(165页珍藏版)》请在金锄头文库上搜索。

1、LinuxLinux操作系统分析与实践操作系统分析与实践第二讲:计算机系统硬件基础第二讲:计算机系统硬件基础LinuxLinux操作系统分析与实践课程建设小组操作系统分析与实践课程建设小组北京大学北京大学二零零八年春季二零零八年春季* *致谢:感谢致谢:感谢IntelIntel对本课程项目的资助对本课程项目的资助本讲主要内容本讲主要内容概述概述中央处理器(中央处理器(CPU)存储系统存储系统中断机制中断机制I/O系统系统时钟以及时钟队列时钟以及时钟队列Linux启动过程启动过程SMP及多核技术及多核技术操作系统的硬件环境操作系统的硬件环境讨论操作系统对运行硬件环境的要求讨论操作系统对运行硬件环

2、境的要求 讨论讨论操作系统设计者操作系统设计者考虑的硬件问题考虑的硬件问题中央处理器(中央处理器(CPUCPU)存储系统存储系统中断机制中断机制I/O系统系统时钟以及时钟队列时钟以及时钟队列一、概述一、概述任何系统软件都是硬件功能的延伸任何系统软件都是硬件功能的延伸操作系统直接依赖于硬件条件操作系统直接依赖于硬件条件OS的硬件环境的硬件环境以较分散的形式同各种管理以较分散的形式同各种管理相结合相结合 实现操作系统时必须理解的实现操作系统时必须理解的 计算机基本结构计算机基本结构 操作系统管理的重要资源操作系统管理的重要资源计算机系统的组成计算机系统的组成中央处理器(中央处理器(CPU)专门设计

3、了一系列基本机制:专门设计了一系列基本机制:- - 具有特权级别的处理器状态,能在不同具有特权级别的处理器状态,能在不同特权级运行的各种特权指令特权级运行的各种特权指令- - 硬件机制使得硬件机制使得OSOS可以和普通程序隔离可以和普通程序隔离 实现保护和控制实现保护和控制1.1 CPU的构成与基本工作方式的构成与基本工作方式 处理器由运算器、控制器、一系列的寄存处理器由运算器、控制器、一系列的寄存器以及高速缓存构成器以及高速缓存构成运算器实现指令中的算术和逻辑运算,是运算器实现指令中的算术和逻辑运算,是计算机计算的核心计算机计算的核心控制器负责控制程序运行的流程,包括取控制器负责控制程序运行

4、的流程,包括取指令、维护指令、维护CPUCPU状态、状态、CPUCPU与内存的交互等与内存的交互等等等寄存器是指令在寄存器是指令在CPUCPU内部作处理的过程中暂存数据、内部作处理的过程中暂存数据、地址以及指令信息的存储设备地址以及指令信息的存储设备 在计算机的存储系统中它具有最快的访问速度在计算机的存储系统中它具有最快的访问速度高速缓存处于高速缓存处于CPUCPU和物理内存之间和物理内存之间 一般由控制器中的内存管理单元(一般由控制器中的内存管理单元(MMUMMU:Memory Memory Management UnitManagement Unit)管理)管理 访问速度快于内存,低于寄存

5、器访问速度快于内存,低于寄存器 利用程序局部性原理使得高速指令处理和低速内存利用程序局部性原理使得高速指令处理和低速内存访问得以匹配,从而提高访问得以匹配,从而提高CPUCPU的效率的效率处理器中的寄存器处理器中的寄存器寄存器提供了一定的存储能力寄存器提供了一定的存储能力速度比主存快得多速度比主存快得多造价高,容量一般都很小造价高,容量一般都很小两类寄存器:两类寄存器:用户可见寄存器,高级语言编译器通过算法分用户可见寄存器,高级语言编译器通过算法分配并使用之,以减少程序访问主存次数配并使用之,以减少程序访问主存次数控制和状态寄存器,用于控制处理器的操作控制和状态寄存器,用于控制处理器的操作 由

6、由OS的特权代码使用的特权代码使用, 以控制其他程序的执行以控制其他程序的执行用户可见寄存器用户可见寄存器机器语言直接引用机器语言直接引用包括数据寄存器、地址寄存器以及条件码寄存器包括数据寄存器、地址寄存器以及条件码寄存器数据寄存器数据寄存器(data register)又称通用寄存器又称通用寄存器 主要用于各种算术逻辑指令和访存指令主要用于各种算术逻辑指令和访存指令地地址址寄寄存存器器(address register)用用于于存存储储数数据据及及指指令令的的物物理理地地址址、线线性性地地址址或或者者有有效效地地址址,用用于于某某种种特特定定方方式式的的寻寻址址。如如index regist

7、er、segment pointer、stack pointer条件码寄存器保存条件码寄存器保存CPU操作结果的各种标记位操作结果的各种标记位 如算术运算产生的溢出、符号等等如算术运算产生的溢出、符号等等控制和状态寄存器控制和状态寄存器用于控制处理器的操作用于控制处理器的操作大部分对于用户是不可见的大部分对于用户是不可见的一部分可以在某种特权模式(由一部分可以在某种特权模式(由OS使用)下访问使用)下访问常见的控制和状态寄存器常见的控制和状态寄存器: :程程序序计计数数器器(PC:Program Counter),记记录录将将要要取取出出的的指令的地址指令的地址指指令令寄寄存存器器(IR:In

8、struction Register),包包含含最最近近取取出出的的指令指令程程序序状状态态字字(PSW:Program Status Word),记记录录处处理理器器的运行模式信息等等的运行模式信息等等1.2、特权指令和非特权指令、特权指令和非特权指令特权指令:特权指令:只能由操作系统使用的指令只能由操作系统使用的指令使用多道程序设计技术的计算机指令系统必须要区使用多道程序设计技术的计算机指令系统必须要区分为特权指令和非特权指令分为特权指令和非特权指令处理器通过特殊的机制将处理器状态切换到操作系处理器通过特殊的机制将处理器状态切换到操作系统运行的特权状态(管态)统运行的特权状态(管态) CP

9、UCPU如何知道当前运行的是操作系统还是一般应用如何知道当前运行的是操作系统还是一般应用软件?有赖于处理器状态的标识软件?有赖于处理器状态的标识1.3、处理器的状态、处理器的状态根根据据运运行行程程序序对对资资源源和和机机器器指指令令的的使使用用权权限限将将处处理理器器设设置为不同状态置为不同状态多数系统将处理器工作状态划分为管态和目态多数系统将处理器工作状态划分为管态和目态管管态态:操操作作系系统统管管理理程程序序运运行行的的状状态态,较较高高的的特特权权级级别别,又称为又称为特权态(特态)、核心态、系统态特权态(特态)、核心态、系统态目目态态:用用户户程程序序运运行行时时的的状状态态,较较

10、低低的的特特权权级级别别,又又称称为为普通态(普态)、用户态普通态(普态)、用户态 有有些些系系统统将将处处理理器器状状态态划划分分核核心心状状态态、管管理理状状态态和和用用户程序状态(目标状态)三种户程序状态(目标状态)三种实例:实例:x86系列处理器(系列处理器(1)386、486、Pentium系列都支持系列都支持4个处理器特权个处理器特权级别(特权环:级别(特权环:R0、R1、R2和和R3)从从R0到到R3特权能力依次降低特权能力依次降低R0相当于双状态系统的管态相当于双状态系统的管态R3相当于目态相当于目态R1和和R2则介于两者之间,它们能够运行的指则介于两者之间,它们能够运行的指令

11、集合具有包含关系:令集合具有包含关系:各个级别有保护性检查(地址校验、各个级别有保护性检查(地址校验、I/O限制)限制)特权级别之间的转换方式不尽相同特权级别之间的转换方式不尽相同四个级别运行不同类别的程序:四个级别运行不同类别的程序:R0- -运行操作系统核心代码运行操作系统核心代码R1- -运行关键设备驱动程序和运行关键设备驱动程序和I/O处理例程处理例程R2- -运行其他受保护共享代码,如语言系统运行环境运行其他受保护共享代码,如语言系统运行环境R3- -运行各种用户程序运行各种用户程序现有基于现有基于x86处理器的操作系统,多数处理器的操作系统,多数UNIX、Linux以及以及Wind

12、ows系列大都只用了系列大都只用了R0和和R3两个特权级别两个特权级别实例:实例:x86系列处理器(系列处理器(2)1.4、程序状态字、程序状态字PSW (Program Status Word ) 在在PSW中专门设置一位,根据运行程序使用指令中专门设置一位,根据运行程序使用指令的权限而设置的权限而设置CPUCPU状态状态CPU的的工工作作状状态态码码指指明明管管态态还还是是目目态态,用用来来说说明明当当前前在在CPU上上执执行行的的是是操操作作系系统统还还是是一一般般用用户户,从从而而决决定定其其是是否否可可以以使使用用特特权权指指令令或或拥拥有有其其他的特殊权力他的特殊权力条件码条件码反

13、映指令执行后的结果特征反映指令执行后的结果特征中断屏蔽码中断屏蔽码指出是否允许中断指出是否允许中断例例:微处理器微处理器M68000的程序状态字的程序状态字条件位:条件位:C: 进位标志位进位标志位 V: 溢出标志位溢出标志位Z: 结果为零标志位结果为零标志位N: 结果为负标志位结果为负标志位I0 I2:三位中断屏蔽位:三位中断屏蔽位S:CPU状态标志位,为状态标志位,为1处于管态,为处于管态,为0处于目态处于目态T:陷阱陷阱(Trap)中断指示位为中断指示位为1, 在下一条指令执行后引起自陷中断在下一条指令执行后引起自陷中断CF: 进位标志位进位标志位 ZF: 结果为零标志位结果为零标志位

14、SF: 符号标志位符号标志位OF: 溢出标志位溢出标志位标准条件位:标准条件位: TF:陷阱标志位:陷阱标志位IF:中断允许(中断屏蔽)标志位:中断允许(中断屏蔽)标志位VIF:虚拟中断标志位:虚拟中断标志位VIP:虚拟中断待决标志位:虚拟中断待决标志位IOPL:IO特权级别特权级别 例例:微处理器微处理器Pentium的程序状态字的程序状态字CPU状态的转换状态的转换目态目态管态管态 唯一途径唯一途径 是是 中断中断管态管态目态目态 设置设置PSW(PSW(修改程序状态字修改程序状态字) ) 可实现可实现二、二、存储系统存储系统支持支持OS运行硬件环境的一个重要方面:运行硬件环境的一个重要方

15、面:作业必须把它的程序和数据存放在内存中才能运行作业必须把它的程序和数据存放在内存中才能运行多道程系统中,若干个程序和相关的数据要放入内存多道程系统中,若干个程序和相关的数据要放入内存 操作系统要管理、保护程序和数据,使它们不至于受操作系统要管理、保护程序和数据,使它们不至于受到破坏到破坏操作系统本身也要存放在内存中并运行操作系统本身也要存放在内存中并运行 2.1、存储器的类型存储器的类型半导体存储器半导体存储器 实现实现 内存内存存储器芯片的内部组织结构存储器芯片的内部组织结构静态存储器(静态存储器(SRAMSRAM)异步动态随机存储器(异步动态随机存储器(DRAMDRAM)同步动态随机存储

16、器(同步动态随机存储器(SDRAMSDRAM)双倍数据速率双倍数据速率SDRAMSDRAM(DDR SDRAMDDR SDRAM)(开放标准)(开放标准)RambusRambus公司的公司的SDRAMSDRAM只读型存储器只读型存储器ROM( Read-Only Memory) :只能从其中读取数据,但不只能从其中读取数据,但不能随意用普通方法写入数据(写入数据只能用特殊方法)能随意用普通方法写入数据(写入数据只能用特殊方法)在微机中,一些常驻内存的模块以微程序形式固化在在微机中,一些常驻内存的模块以微程序形式固化在ROM中,如中,如: :PC BIOS和和CBASIC解释程序被固化于解释程序

17、被固化于ROM中中PROM:可编程只读存储器,使用特殊可编程只读存储器,使用特殊PROM写入器写入数写入器写入数据据EPROM:电可擦写:电可擦写可编程只读存储器,用特殊的紫外线光照可编程只读存储器,用特殊的紫外线光照射此芯片,以射此芯片,以“擦去擦去”信息,恢复原来状态,再使用特殊信息,恢复原来状态,再使用特殊EPROM写入器写入数据写入器写入数据闪存(闪存(flash memoryflash memory)存储器的类型存储器的类型2.2、存储器的层次结构、存储器的层次结构存储系统设计三个问题:存储系统设计三个问题: 容量、速度和成本容量、速度和成本容量:需求无止境容量:需求无止境速度:能匹

18、配处理器的速度速度:能匹配处理器的速度成本问题:成本和其他部件相比应在合适范围之内成本问题:成本和其他部件相比应在合适范围之内容量、速度和成本容量、速度和成本三个目标不可能同时达到最优,要作权衡三个目标不可能同时达到最优,要作权衡存取速度快,每比特价格高存取速度快,每比特价格高容量大,每比特价格越低,同时存取速度也越慢容量大,每比特价格越低,同时存取速度也越慢解决方案:采用层次化的存储体系结构解决方案:采用层次化的存储体系结构当沿着层次下降时当沿着层次下降时每比特的价格将下降,容量将增大每比特的价格将下降,容量将增大速度将变慢,处理器的访问频率也将下降速度将变慢,处理器的访问频率也将下降层次化

19、的存储体系结构层次化的存储体系结构存储访问局部性原理存储访问局部性原理提高存储系统效能关键点:程序存储访问局部性原理提高存储系统效能关键点:程序存储访问局部性原理程序执行时,有很多的循环和子程序调用,一旦进入程序执行时,有很多的循环和子程序调用,一旦进入这样的程序段,就会重复存取相同的指令集合这样的程序段,就会重复存取相同的指令集合对数据存取也有局部性,在较短的时间内,稳定地保对数据存取也有局部性,在较短的时间内,稳定地保持在一个存储器的局部区域持在一个存储器的局部区域处理器主要和存储器的局部打交道处理器主要和存储器的局部打交道在经过一段时间以后,使用的代码和数据集合会改变在经过一段时间以后,

20、使用的代码和数据集合会改变2.3、存储分块、存储分块存储最小单位存储最小单位:“:“二进位二进位”,包含信息为,包含信息为0 0或或1 1最小编址单位最小编址单位: :字节,一个字节包含八个二进位字节,一个字节包含八个二进位主流个人电脑主流个人电脑主存主存:128MB:128MB512MB512MB之间之间辅助存储器辅助存储器: :在在20GB20GB70GB70GB工作站、服务器工作站、服务器主存主存:512MB :512MB 4GB 4GB之间之间硬盘容量硬盘容量: :数百数百GBGB为为简简化化分分配配和和管管理理,存存储储器器分分成成块块, ,称称一一个个物物理理页页(PagePage

21、)块的大小:块的大小:512B512B、1K1K、4K4K、8K8K2.4、存储保护设施存储保护设施 对主存中的信息加以严格的保护,使操作系统及其对主存中的信息加以严格的保护,使操作系统及其他程序不被破坏,是其正确运行的基本条件之一他程序不被破坏,是其正确运行的基本条件之一多用户,多任务操作系统:多用户,多任务操作系统: OS OS给每个运行进程分配一个存储区域给每个运行进程分配一个存储区域问题:问题:多个程序同时在同一台机器上运行,怎样才能互不多个程序同时在同一台机器上运行,怎样才能互不侵犯?侵犯?如何处理重定位?如何处理重定位?保护的硬件支持保护的硬件支持解决方案解决方案 依赖于依赖于 配

22、有特殊硬件的配有特殊硬件的CPUCPU硬件可提供如下功能:硬件可提供如下功能:界地址寄存器(界限寄存器)界地址寄存器(界限寄存器)存储键存储键地址转换机制地址转换机制界地址寄存器(界限寄存器)界地址寄存器(界限寄存器)界地址寄存器被广泛使用的一种存储保护技术界地址寄存器被广泛使用的一种存储保护技术机制比较简单,易于实现机制比较简单,易于实现实现方法:实现方法:在在CPUCPU中设置一对下限寄存器和上限寄存器中设置一对下限寄存器和上限寄存器 存放用户作业在主存中的下限和上限地址存放用户作业在主存中的下限和上限地址也可将一个寄存器作为基址寄存器,另一寄存器作为也可将一个寄存器作为基址寄存器,另一寄

23、存器作为限长寄存器(指示存储区长度)限长寄存器(指示存储区长度)每当每当CPUCPU要访问主存,硬件自动将被访问的主存地址与要访问主存,硬件自动将被访问的主存地址与界限寄存器的内容进行比较,以判断是否越界界限寄存器的内容进行比较,以判断是否越界如果未越界,则按此地址访问主存,否则将产生程序如果未越界,则按此地址访问主存,否则将产生程序中断中断越界中断(存储保护中断)越界中断(存储保护中断)界地址寄存器界地址寄存器存储保护技术存储保护技术存储键存储键每个存储块有一个由二进位组成的存储保护键每个存储块有一个由二进位组成的存储保护键一一用用户户作作业业被被允允许许进进入入主主存存,OSOS分分给给它

24、它一一个个唯唯一的存储键号一的存储键号并并将将分分配配给给该该作作业业各各存存储储块块存存储储键键也也置置成成同同样样键号键号当当OSOS挑挑选选该该作作业业运运行行时时,OSOS将将它它的的存存储储键键号号放放入程序状态字入程序状态字PSWPSW存储键(存储键(“钥匙钥匙”)域中)域中每每当当CPUCPU访访问问主主存存时时,都都将将该该主主存存块块的的存存储储键键与与PSWPSW中的中的“钥匙钥匙”进行比较进行比较如果相匹配,则允许访问,否则,拒绝并报警如果相匹配,则允许访问,否则,拒绝并报警地址转换机制地址转换机制同时有多个程序在内存同时有多个程序在内存程序在内存的位置不是固定的而是随机

25、程序在内存的位置不是固定的而是随机的的用户程序用户程序A A内存内存用户程序用户程序B BCPUMMU内存内存磁盘磁盘控制器控制器总线总线虚拟地址虚拟地址物理地址物理地址MMU:内存管理单元:内存管理单元地址转换机制地址转换机制虚拟地址(逻辑地址)虚拟地址(逻辑地址) 处理器生成的指令或数据的二进制地处理器生成的指令或数据的二进制地址址这些地址用硬件和软件结合的方法转换这些地址用硬件和软件结合的方法转换成物理地址成物理地址MMUMMU:内存管理单元,一种特殊硬件,:内存管理单元,一种特殊硬件,完成转换工作完成转换工作三、三、中断技术中断技术中断对于操作系统的重要性中断对于操作系统的重要性 就像

26、机器中的驱动齿轮一样就像机器中的驱动齿轮一样所以有人把操作系统称为是由所以有人把操作系统称为是由 “中断驱动中断驱动”或者或者 “(中断)事件驱动(中断)事件驱动”它使得它使得OS可以捕获用户程序发出的系统功能调用可以捕获用户程序发出的系统功能调用及时处理设备的中断请求及时处理设备的中断请求防止用户程序中破坏性的活动等等防止用户程序中破坏性的活动等等3.13.1、中断的概念、中断的概念CPUCPU对系统发生的某个事件作出的一种反应对系统发生的某个事件作出的一种反应CPUCPU暂停正在执行的程序,保留现场后暂停正在执行的程序,保留现场后自动自动转转去去执行相应事件的处理程序执行相应事件的处理程序

27、,处理完成后返回,处理完成后返回断点,继续执行被打断的程序断点,继续执行被打断的程序特点:特点: 1) 1) 中断随机的中断随机的 2) 2) 中断是可恢复的中断是可恢复的 3) 3) 中断是自动处理的中断是自动处理的引入中断的目的引入中断的目的解决主机与外设的并解决主机与外设的并行工作问题行工作问题实现实时控制实现实时控制中断中断/ /异常:异常:指系统发生某个异步指系统发生某个异步/ /同步事件后同步事件后, ,处处理机暂停正在执行的程序理机暂停正在执行的程序, ,转去执行处理该事件程转去执行处理该事件程序的过程序的过程中断的引入:中断的引入:为了开发为了开发CPUCPU和通道和通道( (

28、或设备或设备) )之间的之间的并行操作,当并行操作,当CPUCPU启动通道启动通道( (或设备或设备) )进行输入进行输入/ /输输出后,通道便出后,通道便( (或设备或设备) )可以独立工作了,可以独立工作了,CPUCPU也可也可以转去做与此次输入以转去做与此次输入/ /输出不相关的事情,那么通输出不相关的事情,那么通道道( (或设备或设备) ) 输入输入/ /输出完成后,还必须告诉输出完成后,还必须告诉CPUCPU继继续输入续输入/ /输出以后的事情,通道输出以后的事情,通道( (或设备或设备) )通过向通过向CPUCPU发中断告诉发中断告诉CPUCPU此次输入此次输入/ /输出结束输出结

29、束中断的概念中断的概念异常引入:异常引入:用于表示用于表示CPUCPU执行指令时本身出现算术执行指令时本身出现算术溢出、零做除数、取数时的奇偶错,访存指令越溢出、零做除数、取数时的奇偶错,访存指令越界或就是执行了一条所谓界或就是执行了一条所谓“异常指令异常指令”(用于实(用于实现系统调用)等情况,这时中断当前的执行流程,现系统调用)等情况,这时中断当前的执行流程,转到相应的错误处理程序或异常处理程序转到相应的错误处理程序或异常处理程序注意:注意:最早中断和异常并没有区分,都把它们叫最早中断和异常并没有区分,都把它们叫做中断。随着它们的发生原因和处理方式的差别做中断。随着它们的发生原因和处理方式

30、的差别愈发明显,才有了以后的中断和异常愈发明显,才有了以后的中断和异常 中断的概念中断的概念中断中断( (外中断外中断) )异常异常( (内中断内中断) )例外例外I/OI/O中断中断时钟中断时钟中断系统调用系统调用缺页异常缺页异常断点指令断点指令其他程序性异常其他程序性异常( (如算术溢出等如算术溢出等) )中断中断( (狭义狭义) )与异常的区别与异常的区别: :中断中断: : 与正执行指令无关,可以屏蔽与正执行指令无关,可以屏蔽异常异常: : 与正执行指令有关,不可屏蔽与正执行指令有关,不可屏蔽广义中断广义中断中断的概念中断的概念3.23.2、中断系统、中断系统中断系统是现代计算机系统的

31、核心机制之一中断系统是现代计算机系统的核心机制之一硬件和软件相互配合、相互渗透而使得计算机系统得以硬件和软件相互配合、相互渗透而使得计算机系统得以充分发挥能力的计算模式充分发挥能力的计算模式中断系统的两大组成部分:硬件中断装置和软件中断处中断系统的两大组成部分:硬件中断装置和软件中断处理程序理程序中断系统的硬件中断装置中断系统的硬件中断装置- -中断系统的机制部分中断系统的机制部分 负责捕获中断源发出的中断请求,以一定方式响应负责捕获中断源发出的中断请求,以一定方式响应中断源,然后将处理器控制权交给特定的中断处理程中断源,然后将处理器控制权交给特定的中断处理程序序软件中断处理程序软件中断处理程

32、序- -中断系统的策略部分中断系统的策略部分 负责辨别中断类型并做出相应的操作负责辨别中断类型并做出相应的操作中断优先级设计原则:中断优先级设计原则:一般来说,高速设备的中一般来说,高速设备的中断优先级高,慢速设备的中断优先级低。因为高断优先级高,慢速设备的中断优先级低。因为高速设备的中断被处理机优先响应时,可以让处理速设备的中断被处理机优先响应时,可以让处理机尽快地向它发出下一个机尽快地向它发出下一个I/OI/O请求,提高高速设备请求,提高高速设备的利用率的利用率3.33.3、中断优先级和中断屏蔽、中断优先级和中断屏蔽处理机优先级:处理机优先级:指出处理机正运行程序的中断响指出处理机正运行程

33、序的中断响应级别。即当处理机处于某一优先级时,只允许应级别。即当处理机处于某一优先级时,只允许处理机去响应比该优先级高的中断处理机去响应比该优先级高的中断, ,而屏蔽低于或而屏蔽低于或等于该优先级的中断。可以通过置处理机优先级等于该优先级的中断。可以通过置处理机优先级来通知硬件:屏蔽优先级小于等于处理机优先级来通知硬件:屏蔽优先级小于等于处理机优先级的中断的中断中断屏蔽:中断屏蔽:指禁止处理机响应中断或禁止中断出指禁止处理机响应中断或禁止中断出现现中断优先级和中断屏蔽中断优先级和中断屏蔽中断屏蔽有两种方法中断屏蔽有两种方法:n 硬件实现硬件实现由软件置处理机优先级,硬件按系由软件置处理机优先级

34、,硬件按系统设计时的约定,屏蔽那些低优先级中断统设计时的约定,屏蔽那些低优先级中断n 软件实现软件实现由软件按操作系统优先级约定由软件按操作系统优先级约定, ,设置设置屏蔽寄存器屏蔽寄存器中断优先级和中断屏蔽中断优先级和中断屏蔽3.43.4、中断类型、中断类型强迫性中断强迫性中断 正在运行的程序所不期望的,由于某种硬件故正在运行的程序所不期望的,由于某种硬件故障或外部请求引起的障或外部请求引起的自愿性中断自愿性中断 用户在程序中有意识安排的中断,是由于用户用户在程序中有意识安排的中断,是由于用户在编制程序时因为要求操作系统提供服务,有在编制程序时因为要求操作系统提供服务,有意使用意使用“访管访

35、管”指令或系统调用,使中断发生指令或系统调用,使中断发生中断类型中断类型强迫性中断强迫性中断输入输入/ /输出输出(I/O)(I/O)中断:主要来自外部设备通中断:主要来自外部设备通道道程序性中断:运行程序中本身的中断程序性中断:运行程序中本身的中断( (如溢出如溢出, ,缺页中断缺页中断, ,缺段中断缺段中断, ,地址越界地址越界) )时钟中断时钟中断控制台中断控制台中断硬件故障硬件故障中断类型中断类型自愿性中断自愿性中断执行执行I/OI/O,创建进程,分配内存,创建进程,分配内存信号量操作,发送信号量操作,发送/ /接收消息接收消息微机中的中断微机中的中断1.1.可屏蔽中断(可屏蔽中断(I

36、OIO中断)中断)2.2.不可屏蔽中断(机器内部故障、掉电中断)不可屏蔽中断(机器内部故障、掉电中断)3.3.程序错误中断(溢出、除法错等中断)程序错误中断(溢出、除法错等中断)4.4.软件中断(软件中断(TrapTrap指令或中断指令指令或中断指令INTINT)IBM370中的中断中的中断1. 1. 机器故障中断:如电源故障,机器电路检验错等机器故障中断:如电源故障,机器电路检验错等2. 2. 输入输出中断:输入输出设备和通道数据传输状态)输入输出中断:输入输出设备和通道数据传输状态)3. 3. 外外部部中中断断:时时钟钟中中断断,操操作作员员控控制制台台中中断断,多多机机系系统统中中其其他

37、他机机器器的的通通信信要要求求中中断断,各各种种外外设设或或传传感感器器发发来来的实时中断等的实时中断等4. 4. 程程序序中中断断:程程序序中中的的问问题题引引起起的的中中断断,如如错错误误地地使使用用指令或数据、溢出等问题,存储保护等指令或数据、溢出等问题,存储保护等5. 5. 访访管管中中断断:访访管管指指令令或或陷陷阱阱指指令令(TrapTrap指指令令)中中的的操操作作数数规规定定了了要要求求服服务务的的类类型型。每每当当CPUCPU执执行行访访管管指指令令或或陷陷阱阱指指令令时时,即即引引起起中中断断并并调调用用操操作作系系统统相相应应的的功功能能模块为其服务模块为其服务3.5、中

38、断响应中断响应CPUCPU如何响应中断如何响应中断, , 两个问题:两个问题: CPUCPU何时响应中断?何时响应中断? 通通常常在在CPUCPU执执行行了了一一条条指指令令以以后后,更更确确切切地地,在在指指令令周周期期最最后后时时刻刻接接受受中中断断请请求求,或此时扫描中断寄存器或此时扫描中断寄存器如何知道提出中断请求的设备或中断源?如何知道提出中断请求的设备或中断源? 因因为为只只有有知知道道中中断断源源或或中中断断设设备备,才才能能调调用相应的中断处理程序用相应的中断处理程序处理器如何发现中断信号?处理器如何发现中断信号? 处理器的控制部件中设一个能检测中断的机构处理器的控制部件中设一

39、个能检测中断的机构 称为中断扫描机构称为中断扫描机构在每条指令执行周期的最后时刻扫描中断寄存器,在每条指令执行周期的最后时刻扫描中断寄存器,询问是否有中断信号询问是否有中断信号若无中断信号,继续执行下一条指令若无中断信号,继续执行下一条指令若有中断,中断硬件将该中断触发器内容按规定编若有中断,中断硬件将该中断触发器内容按规定编码送入码送入PSWPSW的相应位,称为中断码的相应位,称为中断码通过交换中断向量引出中断处理程序通过交换中断向量引出中断处理程序中断响应中断响应 中断向量:中断向量:一个存放中断处理程序入口地址和程一个存放中断处理程序入口地址和程序运行所需处理机状态字的内存单元序运行所需

40、处理机状态字的内存单元硬件按中断号、异常类型的不同通过中断向量表硬件按中断号、异常类型的不同通过中断向量表转移转移中断向量表中断向量表在有的机器中:在有的机器中:将主存最低位将主存最低位128128个字保留作为中断向量表,每个字保留作为中断向量表,每个中断向量占两个字个中断向量占两个字中断请求的设备接口为了标识自己,向处理器发中断请求的设备接口为了标识自己,向处理器发送一个该设备在中断向量表中表目的地址指针送一个该设备在中断向量表中表目的地址指针中断响应中断响应典型的中断处理(典型的中断处理(1 1):):I/O中断中断由由I/OI/O设备的控制器或者通道发出设备的控制器或者通道发出两类两类I

41、/OI/O中断:中断:I/OI/O操作正常结束操作正常结束如如果果要要继继续续I/OI/O操操作作,需需要要在在准准备备好好以以后后重重新新启启动动I/OI/O,若若请请求求I/OI/O程程序序正正处处于于等等待待I/OI/O状状态态,则则应应将将其其唤唤醒醒I/OI/O异常异常需要重新执行失败的需要重新执行失败的I/OI/O操作操作重试次数有上限,次数过大,系统将判定硬件故障重试次数有上限,次数过大,系统将判定硬件故障系系统统多多道道能能力力的的重重要要推推动动力力量量,时时钟钟中中断断处处理理程程序序通通常常做与系统运转、管理和维护相关的工作,包括:做与系统运转、管理和维护相关的工作,包括

42、:维维护护软软件件时时钟钟:系系统统有有若若干干个个软软件件时时钟钟,控控制制定定时时任任务务以以及及进进程程的的处处理理器器时时间间配配额额,时时钟钟中中断断需需要要维维护护、定时更新这些软件时钟定时更新这些软件时钟处处理理器器时时间间调调度度:维维护护当当前前进进程程时时间间片片软软件件时时钟钟,并并在在当当前前进进程程时时间间片片到到时时以以后后运运行行调调度度程程序序选选择择下下一一个个被调度的进程被调度的进程控控制制系系统统定定时时任任务务:通通过过软软件件时时钟钟和和调调度度程程序序定定时时激激活活一一些些系系统统任任务务,如如监监测测死死锁锁、系系统统记记帐帐、系系统统审审计计等

43、等实时处理实时处理典型的中断处理典型的中断处理(2):时钟中断时钟中断典型的中断处理(典型的中断处理(3):硬件故障中断硬件故障中断 硬件故障中断处理程序一般需要做的工作:硬件故障中断处理程序一般需要做的工作:保存现场,使用一定警告手段,提供些辅助诊断信息保存现场,使用一定警告手段,提供些辅助诊断信息在在高高可可靠靠系系统统中中,中中断断处处理理程程序序还还要要评评估估系系统统可可用用性性,尽尽可可能能恢复系统恢复系统如如Windows Windows 2000/XP2000/XP,关关键键硬硬件件发发生生故故障障时时,如如显显示示卡卡损损坏坏,出出现现系系统统蓝蓝屏屏,系系统统实实际际上上进

44、进入入相相应应故故障障处处理理程程序序,发发现现故故障障不不可可恢恢复复,则则在在屏屏幕幕上上打打印印出出发发生生故故障障时时程程序序位位置置,并并开开始始进进行行内内存存转转储储(将将一一定定范范围围的的内内存存内内容容写写上上磁磁盘盘,是是系系统统故故障障时时的的全系统全系统“快照快照”),备日后故障诊断),备日后故障诊断程序指令出错、指令越权或者指令寻址越界而引发程序指令出错、指令越权或者指令寻址越界而引发两类处理方法:两类处理方法:只能由操作系统的相关扩展功能模块完成只能由操作系统的相关扩展功能模块完成 多为程序试图作不能做的操作引起的系统保护多为程序试图作不能做的操作引起的系统保护

45、如如访访问问合合法法的的、但但不不在在内内存存虚虚地地址址内内,引引发发页页故故障障页页故故障障一一般会引发般会引发OSOS虚存模块作一个页面换入虚存模块作一个页面换入可由程序自己完成,如一些算术运算错误可由程序自己完成,如一些算术运算错误 不不同同程程序序可可有有不不同同处处理理方方法法,所所以以很很多多OSOS提提供供由由用用户户自自己己处处理这类中断的理这类中断的“绿色通道绿色通道” 系系统统调调试试中中断断(断断点点中中断断、单单步步跟跟踪踪)也也可可被被用用户户程程序序处处理理,用以支持各种程序调试用以支持各种程序调试典型的中断处理典型的中断处理( (4) ):程序性中断程序性中断典

46、型的中断处理典型的中断处理(5):系统服务请求(自愿性中断):系统服务请求(自愿性中断)系统服务请求由处理器专用指令(访管指令)激发系统服务请求由处理器专用指令(访管指令)激发如如x86x86处理器提供处理器提供int指令,用来激发软件中断指令,用来激发软件中断其他不少处理器则提供系统调用指令其他不少处理器则提供系统调用指令syscall 执行专用指令的结果是系统被切换到管态,并且转执行专用指令的结果是系统被切换到管态,并且转移到一段专门移到一段专门OS程序处开始执行程序处开始执行指令格式通常是指令名加请求服务识别号(中断号)指令格式通常是指令名加请求服务识别号(中断号)OS利用处理器提供的这

47、种接口建立系统服务体系利用处理器提供的这种接口建立系统服务体系处理器一般不负责定义系统调用所传递的参数格式处理器一般不负责定义系统调用所传递的参数格式DOS:21h号中断的系统服务功能以及参数列表号中断的系统服务功能以及参数列表 现现代代操操作作系系统统一一般般不不提提供供直直接接使使用用系系统统调调用用指指令令的的接接口口,通通常常做做法法:提提供供一一套套方方便便、实实用用的的应应用用程程序序函函数数库库(应应用用程程序序设计接口设计接口APIAPI)从应用层面重新封装系统调用从应用层面重新封装系统调用屏蔽复杂的系统调用传参问题屏蔽复杂的系统调用传参问题高级语言接口,有助于快速开发高级语言

48、接口,有助于快速开发有的系统在更高层面提供系统程序设计模板库和类库有的系统在更高层面提供系统程序设计模板库和类库 如如Windows Windows 2000/XP2000/XP提提供供封封装装系系统统用用Win32 Win32 APIAPI和和高高层层编编程程机机制制MFCMFC以及以及ATLATL Linux Linux提供封装系统调用、符合提供封装系统调用、符合POSIXPOSIX标准标准 API API和和C C运行库运行库典型的中断处理典型的中断处理( (6) ):系统服务请求实例系统服务请求实例设备控制器或其他设备控制器或其他系统硬件发出中断系统硬件发出中断处理器完成当前指处理器完

49、成当前指令的执行令的执行处理器接受中断处理器接受中断处理器将处理器将PSW和和PC推入系统堆栈推入系统堆栈处理器根据中断类处理器根据中断类型读入新的型读入新的PC值值中断系统硬件完成的工作中断系统硬件完成的工作保存进程状态的其保存进程状态的其余信息余信息进程中断进程中断恢复进程状态信息恢复进程状态信息从系统堆栈恢复原从系统堆栈恢复原PSW和和PC中断系统软件完成的工作中断系统软件完成的工作四、四、I/O技术技术I/O控制使用下面几种技术:控制使用下面几种技术:程序控制程序控制中断驱动中断驱动直接存储器存取直接存储器存取(DMA)通道通道4.1、程序控制、程序控制I/O技术技术由处理器提供由处理

50、器提供I/OI/O相关指令来实现相关指令来实现I/O处理单元处理请求并设置处理单元处理请求并设置I/O状态寄存器相关位状态寄存器相关位不中断处理器,也不给处理器警告信息不中断处理器,也不给处理器警告信息处理器定期轮询处理器定期轮询I/O单元的状态,直到处理完毕单元的状态,直到处理完毕I/O软件包含直接操纵软件包含直接操纵I/O的指令的指令控制指令控制指令: : 用于激活外设,并告诉它做什么用于激活外设,并告诉它做什么状态指令状态指令: : 用于测试用于测试I/OI/O控制中的各种状态和条件控制中的各种状态和条件数据传送指令数据传送指令: : 用于在设备和主存之间来回传送数据用于在设备和主存之间

51、来回传送数据主主要要缺缺陷陷:处处理理器器必必须须关关注注I/OI/O处处理理单单元元的的状状态态,因因而而耗耗费费大大量时间轮询信息,严重地降低了系统性能量时间轮询信息,严重地降低了系统性能4.2、中断驱动、中断驱动I/O技术技术为了解决程序控制为了解决程序控制I/O方法的主要问题方法的主要问题 应该让处理器从轮询任务中解放出来应该让处理器从轮询任务中解放出来 使使I/O操作和指令执行并行起来操作和指令执行并行起来具体作法:具体作法: 当当I/O处理单元准备好与设备交互的时候处理单元准备好与设备交互的时候 通过物理信号通知处理器,即中断处理器通过物理信号通知处理器,即中断处理器4.3、DMA

52、技术(技术(1)中断的引入大大地提高了处理器处理中断的引入大大地提高了处理器处理I/O的的效率效率当处理器和当处理器和I/O间间传送数据时,效率仍旧不高传送数据时,效率仍旧不高解决方法:解决方法:直接存储器访问直接存储器访问(DMA:Direct Memory Access)通过系统总线中一独立控制单元通过系统总线中一独立控制单元DMA控制控制器器自动控制成块数据在内存和自动控制成块数据在内存和I/O单元间的传送单元间的传送大大提高处理大大提高处理I/O的效能的效能DMA技术技术(2)当处理器需要读写一整块数据时当处理器需要读写一整块数据时给给DMA控制单元发送一条命令控制单元发送一条命令包含

53、:是否请求一次读或写,包含:是否请求一次读或写,I/O设备的编址,开始设备的编址,开始读或写的主存编址,需要传送的数据长度等信息读或写的主存编址,需要传送的数据长度等信息处理器发送完命令后就可处理其他事情处理器发送完命令后就可处理其他事情DMADMA控制器将自动管理数据的传送控制器将自动管理数据的传送当这个过程完成后,它会给处理器发一个中断当这个过程完成后,它会给处理器发一个中断处理器只在开始传送和传送结束时关注一下就可处理器只在开始传送和传送结束时关注一下就可处理器和处理器和DMA传送不完全并行传送不完全并行有时会有总线竞争的情况发生有时会有总线竞争的情况发生 处理器用总线时可能稍作等待处理

54、器用总线时可能稍作等待 不会引起中断不会引起中断 不引起程序上下文的保存不引起程序上下文的保存通常过程只有一个总线周期通常过程只有一个总线周期在在DMA传送传送时,处理器访问总线速度会变慢时,处理器访问总线速度会变慢对于大量数据对于大量数据I/O传送,传送,DMA技术是很有价值技术是很有价值DMA技术技术(3)4.4、通道、通道独立于中央处理器,专门负责数据独立于中央处理器,专门负责数据I/O传输传输的的处理机处理机它对外设实现统一管理它对外设实现统一管理代替代替CPU对对I/O操作进行控制操作进行控制使使CPU和和外设可以并行工作外设可以并行工作通道又称为通道又称为I/O处理机处理机引入通道

55、的目的引入通道的目的: :为了使为了使CPU从从I/O事务中解脱出来事务中解脱出来同时为了提高同时为了提高CPU与设备、设备与设备之间的并行与设备、设备与设备之间的并行度度五、时钟五、时钟时钟为计算机完成以下必不可少的工作:时钟为计算机完成以下必不可少的工作:在在多多道道程程序序运运行行环环境境中中,为为系系统统发发现现陷陷入入死死循循环环(编编程程错错误误)的作业,防止机时的浪费的作业,防止机时的浪费在分时系统中,间隔时钟实现作业间按时间片轮转在分时系统中,间隔时钟实现作业间按时间片轮转在在实实时时系系统统中中,按按要要求求的的间间隔隔输输出出正正确确时时间间信信号号给给实实时时的的控控制设

56、备(如制设备(如AD、D/A转换设备)转换设备)定定时时唤唤醒醒要要求求延延迟迟执执行行的的各各外外部部事事件件(如如定定时时为为各各进进程程计计算算优先数,银行中定时运行某类结账程序等)优先数,银行中定时运行某类结账程序等)记录用户使用设备时间和记录某外部事件发生时间记录用户使用设备时间和记录某外部事件发生时间记录用户和系统所需要的绝对时间,即年、月、日记录用户和系统所需要的绝对时间,即年、月、日 时钟是操作系统运行的必不可少的硬件设施时钟是操作系统运行的必不可少的硬件设施时时钟钟,实实际际上上都都是是硬硬件件时时钟钟寄寄存存器器,按按时时钟钟电电路路所所产产生生的的脉脉冲数对时钟寄存器进行

57、加冲数对时钟寄存器进行加1 1或减或减1 1的工作的工作绝对时钟:记录当时时间(年、月、日、时、分、秒)绝对时钟:记录当时时间(年、月、日、时、分、秒) 一一般般来来说说,绝绝对对时时钟钟准准确确,当当停停机机时时,绝绝对对时时钟钟值值仍仍然然自自动动修改修改间隔时钟间隔时钟( (相对时钟相对时钟) ):通过时钟寄存器实现:通过时钟寄存器实现 置置上上时时间间间间隔隔初初值值,每每经经过过一一个个单单位位时时间间,时时钟钟值值减减1 1,直直到该值为负时,则触发时钟中断,并进行相应中断处理到该值为负时,则触发时钟中断,并进行相应中断处理每个脉冲使计数器减每个脉冲使计数器减1用来装入计用来装入计

58、数器初值数器初值硬件时钟:硬件时钟:某个寄存器来模拟某个寄存器来模拟( (根据脉冲频率定时加根据脉冲频率定时加1 1,减,减1)1)软件时钟:软件时钟:用作相对时钟,用内存单元来模拟时钟用作相对时钟,用内存单元来模拟时钟CPU保护:防止进程得到保护:防止进程得到CPU后不放弃控制权后不放弃控制权解决:分配给每个进程一段时间(时间片)解决:分配给每个进程一段时间(时间片) 时间片到,发时钟中断,控制权交给操作系统时间片到,发时钟中断,控制权交给操作系统六、系统调用六、系统调用系统调用:系统调用:用户在程序中调用操作系统所提供的一些子功能用户在程序中调用操作系统所提供的一些子功能这是特殊的过程调用

59、,由特殊的机器指令实现(这是特殊的过程调用,由特殊的机器指令实现(每种机器每种机器的机器指令集中都有一条系统调用指令的机器指令集中都有一条系统调用指令访管指令访管指令)这条指令将系统转入管态这条指令将系统转入管态系统调用是一个低级过程,只能由汇编语言直接访问系统调用是一个低级过程,只能由汇编语言直接访问系统调用是操作系统提供给编程人员的唯一接口系统调用是操作系统提供给编程人员的唯一接口利用系统调用,动态请求和释放系统资源利用系统调用,动态请求和释放系统资源 完成与硬件相关的工作以及控制程序的执行等完成与硬件相关的工作以及控制程序的执行等每个操作系统都提供几百种系统调用每个操作系统都提供几百种系

60、统调用.A= A+1 printf(. . .)B=B+A(1)源程序段)源程序段6.16.1、系统调用简介、系统调用简介(2)printf目标代码目标代码(3)程序段编译产生的程序段编译产生的可执行代码可执行代码(4)操作系统操作系统内部代码内部代码INT.INTA=A+1B=B+A.INOUT.嵌入后嵌入后该系统调该系统调用的操作用的操作系统内部系统内部实现代码实现代码系统调用简介系统调用简介( (续续1)1)用户程序用户程序函数函数操作系统操作系统凡是与硬件相关、与应用无关的工作,都通过凡是与硬件相关、与应用无关的工作,都通过操作系统程序来完成操作系统程序来完成系统调用简介系统调用简介(

61、 (续续2)2) 以以I/O设备的硬件接口为例:设备的硬件接口为例:一般由四种寄存器(地址,数据,状态,控制)或其一般由四种寄存器(地址,数据,状态,控制)或其子集组成子集组成任一程序中若要使用任一程序中若要使用I/O设备来输出数据或接受输入设备来输出数据或接受输入必须通过对这四种寄存器读写的必须通过对这四种寄存器读写的I/O机器指令进行机器指令进行系统调用简介系统调用简介( (续续3)3)6.2、系统调用的处理过程、系统调用的处理过程需要有一个类似于硬件中断处理的处理机构需要有一个类似于硬件中断处理的处理机构 当用户使用系统调用时,产生一条相应的指令当用户使用系统调用时,产生一条相应的指令

62、处理机在执行到该指令时发生相应的中断,并处理机在执行到该指令时发生相应的中断,并发出有关的信号给该处理机构发出有关的信号给该处理机构 该处理机构在收到了处理机发来的信号后,启该处理机构在收到了处理机发来的信号后,启动相关的处理程序去完成该系统调用所要求的动相关的处理程序去完成该系统调用所要求的功能功能系统调用的处理过程(续系统调用的处理过程(续1)在系统中为控制系统调用服务的机构称为在系统中为控制系统调用服务的机构称为陷入陷入(TRAP)或异常处理机构或异常处理机构相对应,把由于系统调用引起处理机中断的指令相对应,把由于系统调用引起处理机中断的指令称为称为陷入或异常指令(或称访管指令)陷入或异

63、常指令(或称访管指令)在操作系统中,每个系统调用都对应一个事先给在操作系统中,每个系统调用都对应一个事先给定的功能号,例如定的功能号,例如0、1、2、3等,称为系统调用等,称为系统调用功能号功能号(在陷入指令中必须包括对应系统调用的功能号(在陷入指令中必须包括对应系统调用的功能号 有些陷入指令中,还带有传给陷入处理机构和内有些陷入指令中,还带有传给陷入处理机构和内部处理程序的有关参数)部处理程序的有关参数)必须为实现系统调用功能的子程序编造入口地址表必须为实现系统调用功能的子程序编造入口地址表每个入口地址与相应的系统调用执行程序名对应每个入口地址与相应的系统调用执行程序名对应陷入处理程序把陷入

64、指令包含功能号与入口地址表有关项对陷入处理程序把陷入指令包含功能号与入口地址表有关项对应应, , 驱动有关子程序执行驱动有关子程序执行在系统调用处理结束之后,用户程序需利用系统调用返回结在系统调用处理结束之后,用户程序需利用系统调用返回结果继续执行果继续执行保护现场:保护现场:进入系统调用处理前,陷入处理机构还需保存处理机现场进入系统调用处理前,陷入处理机构还需保存处理机现场在系统调用处理结束之后,要恢复处理机现场,现场被保护在系统调用处理结束之后,要恢复处理机现场,现场被保护在特定的内存区或寄存器中在特定的内存区或寄存器中系统调用的处理过程(续系统调用的处理过程(续2) system cal

65、l 入口地址表入口地址表 (1)保护处保护处理现场理现场(2)取系统取系统调用功能号调用功能号并寻找子程并寻找子程序入口序入口(3)返回返回A0A1Ai AnA0 A1AiAnSub0Sub1SubiSubn 用户程序用户程序 陷入处理机构陷入处理机构 系统子程序系统子程序系统调用的处理过程系统调用的处理过程6.3、参数传递过程问题、参数传递过程问题怎样实现用户程序和系统程序间的参数传递?怎样实现用户程序和系统程序间的参数传递?常用的常用的3种实现方法:种实现方法:由陷入指令自带参数:陷入指令的长度有限的,且还由陷入指令自带参数:陷入指令的长度有限的,且还要携带系统调用功能号,只能自带有限的参

66、数要携带系统调用功能号,只能自带有限的参数通过有关通用寄存器来传递参数:这些寄存器应是系通过有关通用寄存器来传递参数:这些寄存器应是系统程序和用户程序都能访问,由于寄存器长度较短,统程序和用户程序都能访问,由于寄存器长度较短,从法传递较多的参数从法传递较多的参数大多在内存中开辟专用堆栈区来传递参数大多在内存中开辟专用堆栈区来传递参数6.4、系统调用的分类、系统调用的分类系统功能可分为两部分系统功能可分为两部分系统自身所需要的系统自身所需要的作为服务提供给用户的作为服务提供给用户的OS的系统调用的系统调用: :进程控制类系统调用进程控制类系统调用文件操作类系统调用文件操作类系统调用进程通信类系统

67、调用进程通信类系统调用设备管理类系统调用设备管理类系统调用信息维护类系统调用信息维护类系统调用进程管理进程管理文件管理文件管理目录管理目录管理其他其他 系统调用方式(系统调用方式(INT)与程序中一般的调)与程序中一般的调用方式的用方式的相同点相同点:改变指令流程改变指令流程重复执行和公用重复执行和公用改变指令流程后需要返回原处改变指令流程后需要返回原处6.5、系统调用与一般过程调用比较、系统调用与一般过程调用比较系系统调用方式(用方式(INT)与程序中一般的)与程序中一般的调用方式用方式的的不同点不同点:运行在不同的系统状态运行在不同的系统状态 一般过程调用,其调用程序和被调用程序都运行在相

68、同状一般过程调用,其调用程序和被调用程序都运行在相同状态:核心态或用户态态:核心态或用户态系统调用:调用程序在用户态,被调用程序在系统态系统调用:调用程序在用户态,被调用程序在系统态状态的转换状态的转换一般的过程调用不涉及系统状态的转换,可直接由调用过程转一般的过程调用不涉及系统状态的转换,可直接由调用过程转向被调用过程向被调用过程运行系统调用时,调用和被调用过程在不同系统状态,不允许运行系统调用时,调用和被调用过程在不同系统状态,不允许由调用过程直接转向被调用过程由调用过程直接转向被调用过程 通过软中断机制先由用户态转换为核心态通过软中断机制先由用户态转换为核心态 在在OSOS核心分析后,转

69、向相应的系统调用处理子程序核心分析后,转向相应的系统调用处理子程序系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续1 1)返回问题返回问题一般过程调用在被调用过程执行完后,返回调一般过程调用在被调用过程执行完后,返回调用过程用过程抢占式调度的系统中,被调用过程执行完后,抢占式调度的系统中,被调用过程执行完后,系统将对所有要求运行的进程进行优先级分析。系统将对所有要求运行的进程进行优先级分析。如果调用进程仍有最高优先级,则返回到调用如果调用进程仍有最高优先级,则返回到调用进程执行进程执行 否则,引起重新调度,让优先级最高的进程优否则,引起重新调度,让优先级最高的进程优先执行。此时,系

70、统把调用进程放入就绪队列先执行。此时,系统把调用进程放入就绪队列系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续2 2)CALL指令的内部实现过程指令的内部实现过程返回地址压栈(即该返回地址压栈(即该CALL指令所在的地址)指令所在的地址)将该将该CALL指令中所含的地址(即被调用代码所指令中所含的地址(即被调用代码所在地址)送入在地址)送入PCRET指令的内部实现过程指令的内部实现过程从栈顶弹出返回地址送入程序计数器从栈顶弹出返回地址送入程序计数器PCn 进入方式不同进入方式不同利用利用int或或trap指令进行系统调用;利用指令进行系统调用;利用call 或或 jmp 指令进入

71、普通的过程调用指令进入普通的过程调用系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续3 3)系统调用是动态调用,而系统调用是动态调用,而CALL调用方调用方式是静态调用式是静态调用a. 同一程序中不包含被调用代码同一程序中不包含被调用代码 系统调用是动态调用,程序中不包含被调系统调用是动态调用,程序中不包含被调用代码,好处:用代码,好处:(1)用户程序长度缩短)用户程序长度缩短(2)当)当OS升级时,调用方不必改变升级时,调用方不必改变系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续4 4) b. 系统调用方式的调用地址和返回地址都是不固定系统调用方式的调用地址和返回地

72、址都是不固定的的 系统调用指令中不包含调用地址系统调用指令中不包含调用地址, 只包含功能号只包含功能号 是按功能号(在可执行目标程序中)调用的是按功能号(在可执行目标程序中)调用的在操作系统内部在操作系统内部 由系统调用处理程序通过系统调用分支表由系统调用处理程序通过系统调用分支表 (OS的一个数据结构)的一个数据结构) 将功能号转换为相应的指令地址将功能号转换为相应的指令地址系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续5 5).功能号功能号 地址地址显显 示示打打 印印读文件读文件.OS的系统调用分支表的系统调用分支表OS代码代码显示显示打印打印读文件读文件OS用户程序用户程

73、序INT.系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续6 6)系统调用返回指令中不包括返回地址,通过栈保系统调用返回指令中不包括返回地址,通过栈保存和弹出返回地址存和弹出返回地址系统调用返回地址不固定,因为用户程序在不同系统调用返回地址不固定,因为用户程序在不同的地方调用的地方调用OS CALL调用方式是静态调用,调用方式是静态调用,被调用代码与调用被调用代码与调用代码在同一程序之内代码在同一程序之内。CALL调用方式,其调用方式,其调用调用地址是固定的地址是固定的,包含在调用语句中;,包含在调用语句中;返回地址是返回地址是不固定的不固定的(同一子程序可能被不同处多次调用)(同

74、一子程序可能被不同处多次调用),在程序执行过程中通过栈的实现来保存和弹出,在程序执行过程中通过栈的实现来保存和弹出返回地址返回地址系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续7 7)c. 安全接口安全接口INT指令和指令和IRET指令的执行过程中指令的执行过程中 要处理程序状态字要处理程序状态字PSW INT指令中要保存用户程序的老指令中要保存用户程序的老PSW 并根据中断向量表设置新并根据中断向量表设置新PSW IRET指令中要在返回用户程序前恢复用户程序指令中要在返回用户程序前恢复用户程序的老的老PSW系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续8 8)安全

75、接口(续安全接口(续1)目的:目态、管态的管理目的:目态、管态的管理系统态与用户态的转换系统态与用户态的转换 由系统在由系统在INT指令与指令与IRET指令内部自动完成指令内部自动完成 没有用一条单独的专门指令没有用一条单独的专门指令好处:有效地防止在系统态下执行用户程序好处:有效地防止在系统态下执行用户程序系统调用与一般过程调用比较(续系统调用与一般过程调用比较(续9 9)七、七、Linux系统启动过程系统启动过程针对针对linux系统的单系统的单x86 cpu的版本的版本说在前面的话说在前面的话引导涉及到系统各个部分的数据结构,引导涉及到系统各个部分的数据结构,因此,只有随着课程的深入,才

76、会彻底因此,只有随着课程的深入,才会彻底弄清楚引导程序中的初始化工作弄清楚引导程序中的初始化工作不同不同OS的引导程序可能会不同,但是仍的引导程序可能会不同,但是仍有一些普遍的原理可以遵循有一些普遍的原理可以遵循前面的部分侧重代码,目的是为了说清前面的部分侧重代码,目的是为了说清楚一些基本概念,启动核心部分侧重原楚一些基本概念,启动核心部分侧重原理,增强大家的感性认识理,增强大家的感性认识系统初始化所包括的内容系统初始化所包括的内容基础知识基础知识系统引导系统引导通过通过lilo进行引导进行引导实模式下的系统初始化实模式下的系统初始化保护模式下的系统初始化保护模式下的系统初始化启动核心启动核心

77、Init进程进程7.1 基础知识基础知识Linux源代码中的源代码中的C语言代码语言代码Linux源代码中的汇编语言代码:两种源代码中的汇编语言代码:两种完全的汇编代码,以完全的汇编代码,以.s作为文件名后缀作为文件名后缀嵌入在嵌入在c程序中的汇编代码。程序中的汇编代码。C语言代码语言代码Linux主体是用主体是用GNU的的c语言编写语言编写从从c+中吸收了中吸收了“inline”和和“const”支持支持“属性描述符属性描述符”(attribute)增加了新的基本数据类型增加了新的基本数据类型“long long int”用于支持用于支持64位位cpu汇编语言代码汇编语言代码与一般的与一般的

78、386汇编语言采用汇编语言采用intel定义不同,定义不同,它采用的是它采用的是AT&T定义的格式。主要差别定义的格式。主要差别如下:如下:Intel中多使用大写字母,而这里大多使用小写字中多使用大写字母,而这里大多使用小写字母母寄存器名前面要加寄存器名前面要加“%”作为前缀,作为前缀,指令的源操作数与目标操作数的顺序与指令的源操作数与目标操作数的顺序与intel的正的正好相反。好相反。AT&T格式中,源在前,目标在后格式中,源在前,目标在后汇编语言代码汇编语言代码访问内存的指令的操作数大小(即宽度)由操作访问内存的指令的操作数大小(即宽度)由操作码名称的最后一个字母决定,用作操作码后缀的码名

79、称的最后一个字母决定,用作操作码后缀的字母有字母有b(8位),位),w(16位),位),l(32位),位),e.g movb直接操作数要加直接操作数要加“$”作为前缀,作为前缀,intel中不用中不用基本格式基本格式asm(“汇编语句汇编语句” :输出寄存器输出寄存器 :输入寄存器输入寄存器 :会被修改的寄存器会被修改的寄存器);输出和输入寄存器统一按顺序编号,起始是输出和输入寄存器统一按顺序编号,起始是%0基础知识基础知识Linux的启动是指从系统加电到控制台显的启动是指从系统加电到控制台显示登录提示为止的运行阶段:示登录提示为止的运行阶段:主要相关的代码是在主要相关的代码是在arch/i3

80、86/boot中:中:bootsect.S,这是这是linux引导扇区的源代码引导扇区的源代码setup.S这是辅助程序的一部分这是辅助程序的一部分video.S这是辅助程序的另外一部分,用于引导过这是辅助程序的另外一部分,用于引导过程中的屏幕显示程中的屏幕显示基础知识基础知识另外,子目录另外,子目录compressed中还有两个源代码中还有两个源代码文件文件head.S,misc.c。用于内核映象的解压。用于内核映象的解压缩。也属于辅助程序一部分。缩。也属于辅助程序一部分。经过编译,汇编和连接后就形成三个部分:经过编译,汇编和连接后就形成三个部分:引导扇区的映象引导扇区的映象bootsetc

81、,辅助程序,辅助程序setup和和内核映象本身。内核映象本身。大小不超过大小不超过508KB的内核引导映象称为小映的内核引导映象称为小映象象zImage;否则称为大内核;否则称为大内核bzImage7.2 系统引导系统引导加电开机后,加电开机后,intel cpu在在实模式实模式下工作,下工作,只能使用低端的只能使用低端的640kb(即(即0XA0000以下)以下)的内存空间的内存空间(why?)由由ROM BIOS或者或者lilo将启动盘的第一扇将启动盘的第一扇区(引导扇区)的内容装入起始地址为区(引导扇区)的内容装入起始地址为0x7c00的内存空间,然后跳转到的内存空间,然后跳转到0x7c

82、00开始执行引导扇区的代码开始执行引导扇区的代码该引导扇区内的代码就是该引导扇区内的代码就是bootset.S汇编汇编后生成的二进制代码后生成的二进制代码系统引导系统引导该段代码该段代码(bootset.S)将自身转移到将自身转移到0x90000处,然后跳转到那里继续执行,处,然后跳转到那里继续执行,并通过并通过bios提供的提供的“int 0x13”调用从磁调用从磁盘上读入盘上读入setup和内核的映象,然后跳转和内核的映象,然后跳转到到setup的代码中,为执行内核映象做准的代码中,为执行内核映象做准备备对部分代码的解释如下所示:对部分代码的解释如下所示:系统引导系统引导bootsect.

83、S中的部分代中的部分代码码movw $BOOTSEG, %axmovw %ax, %ds# %ds = BOOTSEG,将,将ds段寄存器设为段寄存器设为0x7c00movw $INITSEG, %axmovw %ax, %es# %ax = %es = INITSEG,将,将es段寄存器设为段寄存器设为0x9000movw $256, %cx#移动计数值移动计数值256subw%si, %si#源地址源地址ds:si=0x07c0:0x0000subw%di, %di#目标地目标地es:di=0x9000:0x0000cld#清方向标志位清方向标志位rep#重复执行直到重复执行直到cx=0m

84、ovsw#移动移动1个字个字ljmp$INITSEG, $go#间接跳转,间接跳转,INITSEG指出跳转到的段地址指出跳转到的段地址go:movw$0x4000-12, %di# 0x4000 is an arbitrary value =# length of bootsect + length of# setup + room for stack;# 12 is disk parm size.movw%ax, %ds# 将将ds,ss都置成移动后代码所在的段处都置成移动后代码所在的段处0x9000movw%ax, %ssmovw%di, %sp# 设置堆栈设置堆栈put stack at

85、 INITSEG:0x4000-12.系统引导系统引导bootsect.S中部分代码的解中部分代码的解释释这段代码将启动扇区代码由这段代码将启动扇区代码由0x7C00移至移至0x90000处。处。Linux将地址为将地址为0x90000的代的代码段称为码段称为INITSEG。然后跳转到。然后跳转到go标志,标志,准备一块堆栈,栈底位于准备一块堆栈,栈底位于$INITSEG:0x4000-12系统引导系统引导bootsect.S中部分代码中部分代码load_setup:xorb%ah,%ah #ah=0x02读磁盘扇区到内存;读磁盘扇区到内存;al=需读出的扇区数,需读出的扇区数,xorb%dl

86、,%dlint$0x13xorw%dx,%dxmovb$0x02,%clmovw $0x0200,%bxmovb$0x02,%ahmovbsetup_sects,%alint$0x13jncok_load_setuppushw %axcallprint_nlmovw %sp,%bpcallprint_hexpopw%axjmpload_setupok_load_setup:系统引导系统引导bootsect.S中部分代码的解中部分代码的解释释该段代码利用该段代码利用BIOS中提供的读磁盘调用中提供的读磁盘调用“int 0x13”从磁盘将从磁盘将setup.S装入到装入到9000:0200(lin

87、ux中称之为中称之为SETUPPSEG段)段),即紧跟在,即紧跟在bootsect.S之后,共四个扇区之后,共四个扇区如果载入失败,则不断尝试循环。除非如果载入失败,则不断尝试循环。除非某次尝试成功,否则只有等待系统重启某次尝试成功,否则只有等待系统重启7.3 通过通过lilo来进行引导来进行引导Lilo(linux loader)也存储在启动扇区)也存储在启动扇区中,用以让用户选择上电后使用何种操中,用以让用户选择上电后使用何种操作系统作系统Lilo在系统安装阶段建立关于核心代码占在系统安装阶段建立关于核心代码占用硬盘数据块的位置的对照表。启动时用硬盘数据块的位置的对照表。启动时lilo将利

88、用这张表引导将利用这张表引导BIOS装入指定的操装入指定的操作系统作系统通过通过lilo来进行引导来进行引导Lilo将用户在启动时输入的命令和参数存将用户在启动时输入的命令和参数存储在储在empty_zero_page(0x5000)的后半页,的后半页,供供arch/i386/kernel/setup.c文件的文件的setup_arch()函数使用函数使用Lilo完成任务后,跳转至完成任务后,跳转至setup.S程序,转程序,转入实模式下的系统初始化入实模式下的系统初始化7.4 实模式下的系统初始化实模式下的系统初始化setup.S连同内核映象由连同内核映象由bootsect.S装入。装入。s

89、etup.S从从BIOS获取计算机系统的参数,获取计算机系统的参数,放到内存参数区,仍在实模式下运行放到内存参数区,仍在实模式下运行Cpu在在setup的执行过程中转入的执行过程中转入32位保护位保护模式的段式寻址方式模式的段式寻址方式辅助程序辅助程序setup为内核映象的执行做好准为内核映象的执行做好准备,然后跳转到备,然后跳转到0x100000开始内核本身开始内核本身的执行,此后就是内核的初始化过程的执行,此后就是内核的初始化过程实模式下的系统初始化实模式下的系统初始化setup.S版本检查和参数设置版本检查和参数设置检查签名检查签名“55AA5A5A”,此签名位于,此签名位于setup.

90、S代码代码段的末尾,判断安装程序是否完全安装进来段的末尾,判断安装程序是否完全安装进来判断核心(判断核心(kernel)是否为)是否为BIG_KERNEL设置参数设置参数为进入保护模式做准备,主要包括为进入保护模式做准备,主要包括关中断关中断检查自身(检查自身(setup.S)是否在)是否在SETUPSEG处处置置idt(中断描述符表)为空,设置(中断描述符表)为空,设置gdt(全局描述(全局描述符表)符表)真正进入保护模式真正进入保护模式7.5 保护模式下的系统初始化保护模式下的系统初始化保护模式下的核心初始化模块从保护模式下的核心初始化模块从0x10000开始执行,负责检查数据区,开始执行

91、,负责检查数据区,idt表,页表,页表和寄存器的初始化,同时进行一些必表和寄存器的初始化,同时进行一些必要的状态检查,最后转入要的状态检查,最后转入start_kernel()模块。如果核心系统是压缩存放的,则模块。如果核心系统是压缩存放的,则先执行解压缩。保护模式下的初始化主先执行解压缩。保护模式下的初始化主要包括:要包括:保护模式下的系统初始化保护模式下的系统初始化初始化寄存器和数据区初始化寄存器和数据区核心代码解压缩核心代码解压缩页表初始化页表初始化初始化初始化idt,gdt和和ldt启动核心启动核心下面分项介绍下面分项介绍初始化寄存器和数据区初始化寄存器和数据区Arch/i386/bo

92、ot/compressed目录下的目录下的head.S是段保护模式的汇编程序,先设是段保护模式的汇编程序,先设置堆栈,然后调用同目录置堆栈,然后调用同目录 下的下的misc.c文文件的件的decompress_kernel()函数解压缩函数解压缩设置堆栈与寄存器设置堆栈与寄存器检查检查A20线是否有效线是否有效数据区数据区BSS全部清零全部清零转入核心代码解压缩过程转入核心代码解压缩过程核心代码解压缩核心代码解压缩调用调用mics.c中的中的decompress_kernel开始解开始解压缩。解压缩的步骤为:压缩。解压缩的步骤为:设置设置output_bufferMakecrc:建立一张:建立

93、一张CRC(校验)表(校验)表(lib/inflate.c)调用调用gunzip()解压缩,同时比较解压缩,同时比较CRC表,如表,如果不一致说明解压出错。果不一致说明解压出错。检查检查kernel的大小的大小解除压缩以后的内核映象放在解除压缩以后的内核映象放在0x10000处,处,调转到此处执行。调转到此处执行。页表初始化页表初始化进行解压缩后,核心系统的入口就是进行解压缩后,核心系统的入口就是arch/i386/kernel目录下的目录下的head.S。系统。系统先初始化寄存器和数据区,然后执行以先初始化寄存器和数据区,然后执行以下步骤:下步骤:将将ds,es,fs,gs寄存器初始化为寄存

94、器初始化为_KERNEL_DS的值的值进行两级页表的部分初始化。其中第一级进行两级页表的部分初始化。其中第一级swapper_pg_dir是页目录,页目录的第一是页目录,页目录的第一个表项所指的第二级页表称为个表项所指的第二级页表称为pg0页表初始化页表初始化清空清空BSS区(未初始化数据区)区(未初始化数据区)跳转到跳转到setup_idt处对处对idt表进行初始化表进行初始化复制复制bootup参数到参数到empty_zero_page检查检查cpu类型类型下面详细解释一下如何进行两级页表的下面详细解释一下如何进行两级页表的初始化:初始化:先把先把swapper_pg_dir清零清零Pg0

95、登记在页目录的第登记在页目录的第0项和第项和第768项,即把项,即把线性地址线性地址0和和3G都指向都指向pg0初始化二级页表初始化二级页表pg0和和pg1Cpu控制寄存器的初始化:使控制寄存器的初始化:使CR3指向指向swapper_page_dir,将,将CR0的的PG位置位位置位(cpu的的paging功能启动位)。功能启动位)。Cpu的页管的页管理功能便生效理功能便生效两级页表初始化的图示如下:两级页表初始化的图示如下:初始化初始化idt,gdt,ldt(三步)(三步)1、初始化、初始化gdtGdt表项数表项数=2个内核态段个内核态段+两个用户态段两个用户态段+4个个空闲表项空闲表项+

96、4个个APM段段+2NRTASK个用于个用于LDT和和TSS描述的段。描述的段。Gdt的初始化的代码如下页图示:的初始化的代码如下页图示:ENTRY(cpu_gdt_table).quad 0x0000000000000000 /* NULL descriptor */.quad 0x0000000000000000 /* 0x0b reserved */.quad 0x0000000000000000 /* 0x13 reserved */.quad 0x0000000000000000 /* 0x1b reserved */.quad 0x00cffa000000ffff/* 0x23 u

97、ser 4GB code at 0x00000000 */.quad 0x00cff2000000ffff/* 0x2b user 4GB data at 0x00000000 */.quad 0x0000000000000000 /* 0x33 TLS entry 1 */.quad 0x0000000000000000 /* 0x3b TLS entry 2 */.quad 0x0000000000000000 /* 0x43 TLS entry 3 */.quad 0x0000000000000000 /* 0x4b reserved */.quad 0x0000000000000000

98、 /* 0x53 reserved */.quad 0x0000000000000000 /* 0x5b reserved */.quad 0x00cf9a000000ffff/* 0x60 kernel 4GB code at 0x00000000 */.quad 0x00cf92000000ffff/* 0x68 kernel 4GB data at 0x00000000 */.quad 0x0000000000000000 /* 0x70 TSS descriptor */.quad 0x0000000000000000 /* 0x78 LDT descriptor */* Segmen

99、ts used for calling PnP BIOS */.quad 0x00c09a0000000000 /* 0x80 32-bit code */.quad 0x00809a0000000000 /* 0x88 16-bit code */.quad 0x0080920000000000 /* 0x90 16-bit data */.quad 0x0080920000000000 /* 0x98 16-bit data */.quad 0x0080920000000000 /* 0xa0 16-bit data */* * The APM segments have byte gra

100、nularity and their bases * and limits are set at run time. */.quad 0x00409a0000000000 /* 0xa8 APM CS code */.quad 0x00009a0000000000 /* 0xb0 APM CS 16 code (16 bit) */.quad 0x0040920000000000 /* 0xb8 APM DS data */#if CONFIG_SMP.fill (NR_CPUS-1)*GDT_ENTRIES,8,0 /* other CPUs GDT */#endif2、设定、设定idt寄存

101、器为寄存器为idt_descr变量的当前变量的当前值,指向值,指向idt表(共表(共256项),但目前不允项),但目前不允许中断(尚未设置中断门)许中断(尚未设置中断门)3、在新的页管理方式下,重新设置堆栈,、在新的页管理方式下,重新设置堆栈,段选择寄存器,描述符寄存器。段选择寄存器,描述符寄存器。7.6 启动核心启动核心前面对前面对cpu进行了初始化,并启动了保护模式进行了初始化,并启动了保护模式现在的任务是初始化内核的核心数据结构,这现在的任务是初始化内核的核心数据结构,这些数据结构主要涉及:些数据结构主要涉及:中断管理中断管理进程管理进程管理内存管理内存管理设备管理设备管理各种数据结构纷

102、繁复杂,需要对各部分进行分各种数据结构纷繁复杂,需要对各部分进行分析析启动核心启动核心进入保护模式后,系统从进入保护模式后,系统从start_kernel处处开始执行,开始执行,Start_kernel()函数变成函数变成0号进号进程,不再返回程,不再返回Start_kernel显示版本信息,调用显示版本信息,调用setup_arch() (arch/i386/kernel/setup.c):初始化核心的数据结构初始化核心的数据结构最后,调用最后,调用kernel_thread()创建创建init进程,进程,进行系统配置进行系统配置该部分的代码在该部分的代码在init/main.c中中启动核心

103、启动核心核心数据结构的初始化核心数据结构的初始化调用调用paging_init()初始化页表初始化页表调用调用mem_init()初始化页描述符初始化页描述符调用调用trap_init()和和init_IRQ()完成完成IDT最后最后的初始化工作的初始化工作调用调用k_mem_cache_init()和和kmem_cache_sizes_init()初始化初始化slab分配器分配器启动核心启动核心调用调用time_init()初始化系统日期和时间初始化系统日期和时间调用调用kernel_thread为进程为进程1创建创建内核线程内核线程父进程创建父进程创建init子进程之后,返回执行子进程之后

104、,返回执行cpu_idle7.7 Init进程和系统配置进程和系统配置Init进程(进程(1号进程)首先创建一些后台号进程)首先创建一些后台进程来维护系统,然后进行系统配置,进程来维护系统,然后进行系统配置,执行执行shell编写的初始化程序。然后转入编写的初始化程序。然后转入用户态运行用户态运行Init进程的执行流程如下进程的执行流程如下static int init(void * unused)lock_kernel();smp_init();#if CONFIG_SMPmigration_init();#endifdo_basic_setup();prepare_namespace();

105、/* * Ok, we have completed the initial bootup, and * were essentially up and running. Get rid of the * initmem segments and start the user-mode stuff. */free_initmem();unlock_kernel();if (open(/dev/console, O_RDWR, 0) 0)printk(Warning: unable to open an initialconsole.n);(void) dup(0);(void) dup(0);

106、 /* * We try each of these until one succeeds. * * The Bourne shell can be used instead of init if we are * trying to recover a really broken machine. */if (execute_command)execve(execute_command,argv_init,envp_init);execve(/sbin/init,argv_init,envp_init);execve(/etc/init,argv_init,envp_init);execve

107、(/bin/init,argv_init,envp_init);execve(/bin/sh,argv_init,envp_init);panic(No init found. Try passing init= option to kernel.);对对init进程的解释进程的解释首先调用函数首先调用函数do_basic_setup()做系统初做系统初始化的工作(这之前系统只启动了始化的工作(这之前系统只启动了cpu,内存和一些进程管理方面的工作)内存和一些进程管理方面的工作)调用调用free_initmem()函数,将初始化过程函数,将初始化过程中使用的范围在中使用的范围在_init_be

108、gin和和_init_end之间的页面释放给空闲页面链之间的页面释放给空闲页面链表表打开一个控制台设备打开一个控制台设备如果存在指定命令就执行,否则,按顺如果存在指定命令就执行,否则,按顺序执行:序执行:Init进程进程如果存在如果存在“/sbin/init”文件,则跳转文件,则跳转去执行去执行“/sbin/init”如果存在如果存在“/etc/init”文件,则跳转去文件,则跳转去执行执行“/etc/init”如果存在如果存在“/bin/init”文件,则跳转去文件,则跳转去执行执行“/bin/init”如果存在如果存在“/bin/sh”文件,则跳转去执文件,则跳转去执行行“/bin/sh”

109、思考题思考题在在i386中,内核可执行代码在内存中的首地址中,内核可执行代码在内存中的首地址是否可随意选择?为什么?是否可随意选择?为什么?主引导扇区位于硬盘什么位置?如果一个硬盘主引导扇区位于硬盘什么位置?如果一个硬盘的主引导扇区有故障,此硬盘是否还可以使用的主引导扇区有故障,此硬盘是否还可以使用?在没有在没有LILO的情况下,系统是怎么样引导的的情况下,系统是怎么样引导的进入保护模式为什么要打开进入保护模式为什么要打开A20地址线?地址线?Linux内核在实模式下的初始化完成哪些功能内核在实模式下的初始化完成哪些功能?进程进程0和和init进程的主要任务是什么?进程的主要任务是什么?Lin

110、ux中断分析中断分析大纲大纲基本概念基本概念X86中断的硬件支持中断的硬件支持中断向量表中断向量表IDT的初始化的初始化中断请求队列的初始化中断请求队列的初始化中断的响应和服务中断的响应和服务软中断和软中断和bottom half总结总结基本概念基本概念中断中断由硬件信号引发的,在程序执行的任何时刻由硬件信号引发的,在程序执行的任何时刻都可能出现,分为可屏蔽和不可屏蔽中断都可能出现,分为可屏蔽和不可屏蔽中断异常异常由指令执行引发的,比如除零异常由指令执行引发的,比如除零异常系统调用系统调用X86中断的硬件支持中断的硬件支持8259a中断控制器中断控制器硬件设备通过硬件设备通过8259a向向CP

111、U发出中断请求发出中断请求中断向量表中断向量表寄存器寄存器IDTR存放中断向量表存放中断向量表IDT的基址的基址CPU的四种门:的四种门:任务门,中断门任务门,中断门,陷阱门和调用,陷阱门和调用门门任务状态段任务状态段TSS复杂的数据结构,用于保存当前任务的运行状态复杂的数据结构,用于保存当前任务的运行状态Linux中断机制利用了当中的堆栈指针中断机制利用了当中的堆栈指针硬件的中断机制硬件的中断机制中断向量表中断向量表IDT的初始化的初始化异常和系统调用异常和系统调用填陷阱门填陷阱门不同的异常的中断服务程序各不相同不同的异常的中断服务程序各不相同由由trap_init()填写中断向量填写中断向

112、量外部中断外部中断填中断门填中断门外部中断服务程序实际上都跳转统一的中断服务程外部中断服务程序实际上都跳转统一的中断服务程序序由由init_IRQ()填写中断向量填写中断向量中断向量表中断向量表IDT的初始化的初始化(续)续)Trap_init() 在中断向量表中填上在中断向量表中填上int0-int 19的中断向的中断向量,并填上量,并填上system_call的中断向量,每的中断向量,每个中断向量表项填上相应的门(外部中个中断向量表项填上相应的门(外部中断填中断门,异常填陷阱门)断填中断门,异常填陷阱门)中断向量表中断向量表IDT的初始化(续)的初始化(续)arch/i386/kernel

113、/traps.c:#define _set_gate(gate_addr,type,dpl,addr)In trap_int():set_trap_gate(0,÷_error);set_trap_gate(1,&debug);set_intr_gate(2,&nmi);set_system_gate(3,&int3);/* int3-5 can be called from all */set_system_gate(4,&overflow);set_system_gate(5,&bounds);set_trap_gate(6,&invalid_op);set_trap_gate

114、(7,&device_not_available);set_trap_gate(8,&double_fault);set_trap_gate(9,&coprocessor_segment_overrun);set_trap_gate(10,&invalid_TSS);set_trap_gate(11,&segment_not_present);set_trap_gate(12,&stack_segment);set_trap_gate(13,&general_protection);set_intr_gate(14,&page_fault);set_trap_gate(15,&spurious

115、_interrupt_bug);set_trap_gate(16,&coprocessor_error);set_trap_gate(17,&alignment_check);set_trap_gate(18,&machine_check);set_trap_gate(19,&simd_coprocessor_error);set_system_gate(SYSCALL_VECTOR,&system_call);_set_gate()具体负责向中断向量表中填数据。这里的set_XXXX_gate()都会调用_set_gate(),只不过传的参数值不同罢了:set_trap_gate() typ

116、e:陷阱门,dpl=0set_intr_gate() type:中断门,dpl=0set_system_gate() type:陷阱门,dpl=3中断向量表中断向量表IDT的初始化(续)的初始化(续)init_IRQ() 往中断向量表中填外部中断的中断门,往中断向量表中填外部中断的中断门,共填共填224个个中断向量表中断向量表IDT的初始化(续)的初始化(续)arch/i386/kernel/i8259.c:#define NR_IRQS 224#define FIRST_EXTERNAL_VECTOR0x20#define SYSCALL_VECTOR0x80in init_IRQ():fo

117、r (i = 0; i NR_IRQS; i+) int vector = FIRST_EXTERNAL_VECTOR + i;if (vector != SYSCALL_VECTOR) set_intr_gate(vector, interrupti);Interrupti为函数指针数组,这些函数指针实际上是宏,在形式为函数指针数组,这些函数指针实际上是宏,在形式上它们是一样的上它们是一样的中断向量表中断向量表IDT的初始化(续)的初始化(续)下面是一个外部中断服务程序的例子:下面是一个外部中断服务程序的例子: asmlink void IRQ0x01_interrupt();_asm_(“

118、n”“IRQ0x01_interrupt: nt”“pushl $0x01 256nt”“jmp common_interrupt”);中断请求队列的初始化中断请求队列的初始化X86只支持只支持256个中断向量,这对众多的个中断向量,这对众多的外设显然是不够的外设显然是不够的Linux中,每个外部中断向量都有一个中中,每个外部中断向量都有一个中断请求队列,允许外设的中断为多个中断请求队列,允许外设的中断为多个中断源共享断源共享在填中断向量表之前,要对中断请求队在填中断向量表之前,要对中断请求队列进行初始化列进行初始化中断请求队列的初始化(续)中断请求队列的初始化(续)Include/linux

119、/irq.h:typedef struct unsigned int status; /IRQ状态状态 hw_irq_controller *handler;/中断服务队列共用中断服务队列共用“中断通道中断通道”的控制器的控制器 struct irqaction *action; /指向中断服务队列指向中断服务队列 unsigned int depth; spinlock_t lock; irq_desc_t;extern irq_desc_t irq_descNR_IRQS;中断请求队列数组中断请求队列数组struct irqaction void (*handler)(int, void

120、*, struct pt_regs *); /指向具体的设备中断处理程序指向具体的设备中断处理程序unsigned long flags; unsigned long mask;const char *name;void *dev_id;struct irqaction *next;中断请求队列的初始化(续)中断请求队列的初始化(续)arch/i386/kernel/i8259.c:void _init init_ISA_irqs (void)int i;#ifdef CONFIG_X86_LOCAL_APICinit_bsp_APIC();#endifinit_8259A(0);for (i

121、 = 0; i NR_IRQS; i+) irq_desci.status = IRQ_DISABLED; irq_desci.action = 0; irq_desci.depth = 1; if (i 16) / 16 old-style INTA-cycle interrupts: irq_desci.handler = &i8259A_irq_type; else / high PCI IRQs filled in on demand irq_desci.handler = &no_irq_type; struct hw_interrupt_type const char * type

122、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 (*end)(unsigned int irq);void (*set_affinity)(unsigned int irq, unsigned long mask);typedef struct hw_interrupt_type

123、 hw_irq_controller;static struct hw_interrupt_type i8259A_irq_type = XT-PIC,startup_8259A_irq,shutdown_8259A_irq,enable_8259A_irq,disable_8259A_irq,mask_and_ack_8259A,end_8259A_irq,NULL;可见,在可见,在IDT表的初始化完成之初,每个中断队列都是空的。此时即使打开中断并且某个外表的初始化完成之初,每个中断队列都是空的。此时即使打开中断并且某个外设中断真的发生了,也得不到实际的服务,设中断真的发生了,也得不到实际的

124、服务,具体的中断服务程序由设备驱动程序通过具体的中断服务程序由设备驱动程序通过request_irq()向系统登记以挂到中断请求队列上向系统登记以挂到中断请求队列上。Everything is ready NOW!中断的响应与服务中断的响应与服务场景场景外设的驱动程序已经完成初始化,并且把相外设的驱动程序已经完成初始化,并且把相应的中断服务程序挂入到特定中断请求队列应的中断服务程序挂入到特定中断请求队列中,系统运行在用户空间,某个外设产生一中,系统运行在用户空间,某个外设产生一个中断请求。该请求通过中断控制器个中断请求。该请求通过中断控制器8259到到达达CPU的引脚的引脚INTR,CPU在执

125、行完当前指在执行完当前指令后开始响应中断请求令后开始响应中断请求中断的响应与服务中断的响应与服务(续续)1.CPU从中断控制器取得中断向量,根据具体从中断控制器取得中断向量,根据具体中断向量从中断向量从IDT中找到相应表项中找到相应表项中断门中断门2.CPU通过中断门的设置到达该通道的总服务通过中断门的设置到达该通道的总服务程序入口程序入口3.由于当前运行级别为由于当前运行级别为3(用户空间),而中断(用户空间),而中断服务程序属于内核,运行级别为服务程序属于内核,运行级别为0,此时,此时CPU从寄存器从寄存器TR所指的当前所指的当前TSS中取出内核的堆中取出内核的堆栈指针,把堆栈切换到内核堆

126、栈(此时堆栈栈指针,把堆栈切换到内核堆栈(此时堆栈一定为空)一定为空)中断的响应与服务中断的响应与服务(续续)4.硬件保存:硬件保存:SSESP、EFLAGS、CSEIP5.保存现场,把中断发生前夕所有寄存器的内保存现场,把中断发生前夕所有寄存器的内容保存在堆栈中容保存在堆栈中6.为为do_IRQ()建立模拟子程序调用环境,并调建立模拟子程序调用环境,并调用此函数执行中断服务(用此函数执行中断服务(示意图示意图)7.执行软中断执行软中断bottom half部分部分8.检查是否需要一次进程调度(如果中断发生检查是否需要一次进程调度(如果中断发生在系统空间则无此过程)在系统空间则无此过程)中断的

127、响应与服务中断的响应与服务(续续)10.如果需要,则调用如果需要,则调用schedule()进行调度进行调度11.最终到达最终到达RESTORE_ALL(对应于前面对应于前面的的SAVE_ALL)软中断与软中断与bottom half中断服务后半部分在开中断条件下执行,中断服务后半部分在开中断条件下执行,这部分就称为这部分就称为bottom half,作用是避免,作用是避免将中断关闭过久将中断关闭过久软中断机制软中断机制在内核中设置一个函数指针数组在内核中设置一个函数指针数组bh_base,其大小是,其大小是32,数组中每个指针可以用,数组中每个指针可以用来指向一个具体的来指向一个具体的bh函

128、数函数设置两个设置两个32位无符号整数位无符号整数bh_active和和bh_mask,每个数的,每个数的32位对应着位对应着bh_base的的32项项软中断软中断 vs. 中断中断Bh_base相当于硬件中断机制的数组相当于硬件中断机制的数组irq_desc,每个元素相当于中断通道每个元素相当于中断通道Bh_active相当于硬件的相当于硬件的“中断请求寄存器中断请求寄存器”,而而bh_mask相当于相当于“中断屏蔽寄存器中断屏蔽寄存器”需要执行需要执行bh函数时,将函数时,将bh_active中的相应位置中的相应位置1,相当于发出中断请求,具体标识位则类似,相当于发出中断请求,具体标识位则

129、类似“中断向量中断向量”Bh_mask的相应位也必须是的相应位也必须是1,表示没有被屏,表示没有被屏蔽才可以真正执行蔽才可以真正执行bh函数函数软中断的问题及演化软中断的问题及演化老的老的bh机制(机制(2.4版本前)版本前)Bh函数执行不可嵌套,采用锁机制保证函数执行不可嵌套,采用锁机制保证Bh函数最多只有一个函数最多只有一个CPU执行(多执行(多CPU系统)系统)2.4及其以后及其以后在硬,软中断服务程序内部都不允许执行(保证了在硬,软中断服务程序内部都不允许执行(保证了上面的第一条)上面的第一条)不同的不同的CPU可以同时进入软中断服务程序执行可以同时进入软中断服务程序执行思考,第二条的

130、修改对软中断服务程序设计有什么思考,第二条的修改对软中断服务程序设计有什么要求?要求?总结总结异常异常 vs.外部中断外部中断陷阱门陷阱门 vs.中断门中断门单一的中断处理程序单一的中断处理程序 vs. 多中断源共享多中断源共享“中中断通道断通道”堆栈的变化堆栈的变化硬件硬件 vs. 软件软件软中断与软中断与bottom half思考题思考题初始化中断向量表时,为什么各表项要初始化中断向量表时,为什么各表项要填门这样的数据结构,而不是直接填中填门这样的数据结构,而不是直接填中断服务程序地址断服务程序地址系统调用可中断的么?为什么?系统调用可中断的么?为什么?响应外部中断时,为什么要将外部中断响

131、应外部中断时,为什么要将外部中断号减去号减去256再压栈?再压栈?在什么地方能得到在什么地方能得到CPU当前的特权级?当前的特权级?为什么为什么x86最多支持最多支持256个中断?个中断?八八 SMP与多核技术与多核技术SMP(Symmetrical Multi-Processing,对称多,对称多处理)技术是指在一台计算机上存在多个处理处理)技术是指在一台计算机上存在多个处理器,每个处理器都含有它自己的控制单元、算器,每个处理器都含有它自己的控制单元、算术逻辑单元和寄存器;每个处理器共享主存和术逻辑单元和寄存器;每个处理器共享主存和I/O设备。设备。 多核技术是指在单个芯片上实现两个或多核技

132、术是指在单个芯片上实现两个或多个多个“执行核执行核”。 多核处理器的出现面临的最大问题就是多核处理器的出现面临的最大问题就是软件支持问题。软件支持问题。 Q&A本讲结束本讲结束 !RiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&

133、w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9L

134、cOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr

135、%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7

136、JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmY

137、p!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQmYp!s&w)z1C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7I

138、aLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp

139、#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5

140、H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2D5H8KcNfQiUlXo#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+BI9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr

141、%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7

142、JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmY

143、p!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3FbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6I

144、aLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOgRjUmYp!s&w)z1C4F7JaMdPhSkWnZq$u*x-A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w)z1C4G7JaMePhSkWnZr$u*x+A2D5H8KcNfQiUlXo

145、#s%v)y0B3F6I9LdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVnYq!t*w-z1D4G8JbMeQhTkWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D4G8JbNeQhTlWoZr%u(y+B2E6H9KcOfRjUmXp!s&v)z0C4F7IaMdPgSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H9LcOfRjUmYp!s&w)z0C4F7JaMdPhSkVnZq$u*x-A2D5

146、G8KbNfQiTlXo#r%v(y0B3E6I9LcOgRjVmYp!t&w)z1C4G7JaMePhSkWnZq$u*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfRiUlXp#s%v)y0C3F6IaLdOgSjVmY*x+A2D5H8KbNfQiUlXo#s%v(y0B3F6I9LdOgRjVmYq!t&w-z1C4G7JbMePhTkWnZr$u(x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t*w-z1D4G7JbMeQhTkWoZr

147、$u(x+B2E5H9KcNfRiUmXp#s&v)y0C3F7IaLdPgSjVnYq$t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E6H9KcOfRiUmXp!s&v)z0C3F7IaMdPgSkVnYq$t*x-A1D5G8JbNeQiTlWo#r%u(y+B3E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A2D5G8KbNeQiTlXo#r%v(y+B3E6I9LcOgRjUmYp!t&w)z1C4F7JaMePhSkWnZq$u*x+A2D5H8KbNfQiTlXo#s%v(y0B3E6I9LdOgRjVmYp!t&w-z1C4G7JaMePhTkWnZr$u*x+A2E5H8KcNfQiUlXp#s%v)y0B3F6IaLdOgSjVmYq!t&w-z1D4G7JbMePhTkWoZr$u(x+A2E5H9KcNfRiUlXp#s&v)y0C3F6IaLdPgSjVnYq!t*w-A1D4G8JbMeQhTlWoZr%u(x+B2E5H9KcOfRiUmXp#s&v)z0C3F7IaLdPgSkVnYq$t*w-A1D5G8JbNeQhTlWo#r%u(y+B2E6H9LcOfRjUmXp!s&w)z0C4F7IaMdPhSkVnZq$t*x-A1D5G8KbNeQiTlWo#r%v(y+B3E6H

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号