Linux内核分析二.doc

上传人:枫** 文档编号:561726575 上传时间:2023-10-29 格式:DOC 页数:29 大小:850.50KB
返回 下载 相关 举报
Linux内核分析二.doc_第1页
第1页 / 共29页
Linux内核分析二.doc_第2页
第2页 / 共29页
Linux内核分析二.doc_第3页
第3页 / 共29页
Linux内核分析二.doc_第4页
第4页 / 共29页
Linux内核分析二.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《Linux内核分析二.doc》由会员分享,可在线阅读,更多相关《Linux内核分析二.doc(29页珍藏版)》请在金锄头文库上搜索。

1、第一章INTEL 体系结构概述 Intel 的32位处理器提供了很多对操作系统的支持,这些支持已经集成到了处理器的系统级体系结构中。这些支持能够对下述工作提供帮助: Memory management Protection of software modules Multitasking Exception and interrupt handling Multiprocessing Cache management Hardware resource and power management Debugging and performance monitoring 当然,只有系统程序员才用这

2、些系统级体系结构的特性。 11 特权级 Intel系统级体系结构提供了四个特权级,编号从0到3,其中0级是最高特权级,3级是最低特权级。将特权级的概念引入系统体系结构是为了实现保护。所谓386保护模式既是在此概念基础上建立起来的。系统中每个段(代码段、数据段、堆栈段等)都有自己的特权级,系统中每个程序或任务也都有自己特权级。特权级低的任务不能调用特权级高的任务,也不能存取特权级高的数据段。下图展示了特权级及其保护环: 图1.1 Protection Rings 环的中心(0级)保留给最高特权的代码、数据和堆栈,通常由操作系统的内核使用;外层环(3级)用于特权级要求不高软件,通常的应用程序运行在

3、第3级。应用程序无法直接访问OS的代码和数据,从而保证了OS的安全。 经常用的有下面几个特权级: DPL(Descriptor Privilege Level),CPL(Current Privilege Level), RPL(Requestor Privilege Level),EPL(Effective Privilege Level), IOPL(I/O Privilege Level)。 12 操作模式 Intel体系结构支持三种操作模式和一种准操作模式: 1. 保护模式:这是处理器的一种最自然的操作模式。在这种模式下,处理器的所有指令以及体系结构的所有特色都是可用的,并且能够达到最

4、高的性能。 2. 实模式:这种模式提供了Intel 8086的编程环境,并有一些扩展。 3. 系统管理模式:这是一种特殊的操作模式,它仅提供给系统固件使用,应用软件和操作系统都不用该模式。进入系统管理模式的唯一途径是系统管理中断(SMI)。当进入该模式时,首先保存处理器的当前状态,然后切换到一个完全分离的操作环境中,执行SMI处理程序代码,完成诸如:关掉不再使用的硬盘驱动器电源、关掉显示器、挂起整个系统、执行私有代码等工作。SMI处理程序执行完后,再恢复处理器状态,切换回保护模式或实模式。整个处理过程对应用程序和操作系统都是透明的,是在一个完全独立的环境中完成的。 4. 虚拟8086模式:这是

5、一个准操作模式,它允许处理器在保护模式、多任务环境下执行8086软件。 各模式之间的转换关系如下: 图 1.2. Transitions Among the Processors Operating Modes 处理器加电或Reset重启后,首先进入实模式。操作系统初始化部分负责从实模式到保护模式的切换。实模式和保护模式之间的切换由控制寄存器CR0的PE位控制;保护模式和虚拟8086模式之间的切换由EFLAGS寄存器的VM位控制;通过SMI中断进入系统管理模式,在系统管理模式下执行指令RSM再切换回原来的(进入系统管理模式前的操作模式)操作模式。 以下只讨论保护模式。 13 系统级体系结构 I

6、NTEL的系统级体系结构由一组寄存器、数据结构和专门为支持基本的系统级操作而设计的指令组成。 下图描述了该体系结构中系统级的寄存器和数据结构: 图 1.3. System-Level Registers and Data Structures 1 4 段描述符 段是最基本的保护单位。Intel系列的处理器通过段(Segment)管理内存,它把内存划分成一个一个的段。8086处理器采用定长段,每个段的长度都是64K,因此只要给出段的基址就可确定一个段(基址在CS、DS、SS、ES等段寄存器中)。在386保护模式下,段长是可变的,而且段是受保护的对象,所以要描述一个段不但需要段的基址,还需要段长和

7、各种保护信息。因此在386保护模式下,采用段描述符来描述段。段描述符是一个大小为8个字节的数据结构,其一般格式如下: 图1.4. Segment Descriptor 段描述符中包含如下域: 基地址(Base address):由描述符的第2、3、4、7四个字节组合而成,它定义了该段在线性地址空间中的开始地址,可以是0到4G之间的任一位置,但最好是16字节对齐,这样可以提高系统的性能。 段界限(Segment limit):段界限定义了段的大小。段界限由描述符中的第0、1字节和6字节的低4位(共20位)构成,它和第6字节的粒度位(G位)一起确定段的大小。G为0,说明段以字节为单位,最大段长为1

8、M;G为1,说明段以页(4K)为单位,最大段长为4G。 粒度标志(granularity):第6字节的第7位(G位),表示段描述符所描述的段的长度的单位。G=0:单位为字节,G=1:单位为页(4096字节)。 存在标志(segment-present flag):即第5字节的第7位(P位),表示段描述符所描述的段是否在物理内存中。1-在;0-不在。 特权级(DPL):由第5字节的5、6两位组成,用来确定段的特权级(0-3),从而控制对段的存取。 系统标志(S):即第5字节的第4位(S位),用于标记该描述符所描述的段是系统段(S=0)还是用户段(S=1)。系统段和用户段间有很大区别。系统段用来描

9、述局部描述符表(LDT)、任务状态段(TSS)、调用门、中断门、陷阱门和任务门;用户段用来描述用户程序的代码段、数据段和堆栈段。 类型(Type):在系统段和用户段中类型的意义不同。 1) 在系统段中,类型由第5字节的0到3位组成,表示16个系统段的类型,如2:LDT、5:任务门、9:有效TSS、B:TSS忙、C:调用门、E:中断门、F:陷阱门等。 2) 在用户段中,类型由第5字节的1到3位组成: a) 其中第3位(E位)为0表示数据段。此时,第2位表示地址扩展的方向(ED=0:向大方向,ED=1:向小方向)。第1位表示数据段是否可写(W=0:不能写,W=1:可写)。 b) 第3位(E位)为1

10、表示代码段。此时,第2位是一致位(C位)。假设执行从低特权级段转到高特权级段,如果高特权级段的C位为1,则执行可以继续,否则,将产生段保护异常。从低特权级段到高特权级非一致(nonconforming)代码段的转移要切换栈,而到一致(conforming)代码段的转移则不用切换栈。第1位是可读位(R位),表示代码段是否可读(R=1:可读,R=0:不可读)。 c) 第0位(A位)是已存取位。A=0:段尚未被存取,A=1:段已被使用。无论何时,只要处理器存取了一个用户段,它的A位就被置1。 D/B标志:第6字节的第6位,对不同的用户段其意义也不同: 1) 可执行代码段:叫D标志,表示在缺省情况下,

11、该段中的指令所引用的有效地址和操作数的长度。D=1:32位,D=0:16位; 2) 栈段:叫B标志,表示栈操作所使用的栈指针的大小。B=1:32位,B=0:16位。 3) 向下扩展数据段:叫B标志,表示段的上界。B=1:4G,B=0:64K。 可用位和保留位:第6字节的4、5位,保留给操作系统使用。 段的分类如下表所示: 段 用户段 代码段 存放可执行代码 数据段 存放数据或堆栈 系统段 TSS段 任务状态信息 LDT段 描述一个局部段描述符表的信息 门 调用门 任务门 中断门 陷阱门 用户段描述符的格式如上所述,它可作为代码段、数据段和堆栈段。当对其中任一数据或代码进行存取时,处理器都要做特

12、权级检查、段界限检查和读写标志的检查,所有未通过检查的存取都会引起保护异常。 根据其目的的不同,对各系统段的描述也有所区别。系统段描述符的格式在上述基本段描述符的基础上各有变化,当访问它们所描述的对象时,处理器所做的保护性检查也不完全相同。以下将分别讨论各个系统段。 1 5 全局和局部段描述符表(GDT、LDT) 操作系统中会用到许多段,每个段都有描述符,因此系统中会有许多描述符。为了管理和查找的方便,Intel体系结构要求将这些描述符组织在描述符表中。 段描述符表是一个段描述符数组,其长度可变,可变范围在0到8192之间,即一个段描述符表中最多可有8192个段描述符(8字节数据结构,64K大

13、小)。 每一个系统中都必须定义一个全局描述符表(GDT)。系统中的所有程序和任务都可以使用GDT描述符表,因此GDT中包含着系统中所有任务都可用的那些描述符,即公用的描述符。但也不是所有类型的描述符都可以出现在GDT中。实际上,可以出现在GDT中的描述符有:代码段、数据段、TSS、LDT和调用门、任务门描述符,中断门、陷阱门不能出现在GDT中。GDT中的第一个描述符保留不用(全为0)。 GDT本身不是一个段,而是线性地址空间的一个数据结构。GDT不需要段描述符来描述它。Intel体系结构专门定义了一个寄存器(GDTR)来存放GDT的信息。在进入保护模式以前,GDT的基址和界限必须被装入GDTR

14、寄存器中。通过GDTR可以找到GDT,通过GDT可以访问到它管理的各个段。 LGDT指令用于将信息装入GDTR,SGDT指令用于将GDTR中的内容存入内存。 相对于GDT,局部描述符表(LDT)是一个段,它其中存放的是局部的、不需要全局共享的段描述符。例如,可以为每个正在运行的任务定义一个LDT,其中包含仅能被该任务使用的段描述符,如任务的代码段、数据段、堆栈段以及一些门描述符等,当然,多个任务也可以共用一个LDT,从而实现数据的共享。因此系统中可以定义多个局部描述符表(LDT)。 LDT的格式与GDT一样,其中可以出现的描述符也与GDT相同。 因为LDT是一个系统段,所以必须用一个描述符来定

15、义它。定义LDT的描述符叫LDT描述符。对系统中的每一个LDT,在GDT中都必须有一个描述它的LDT段描述符。 LDT描述符的格式与一般的段描述符的格式相同。其基地址域说明LDT在线性地址空间的开始位置;其界限域说明LDT的大小;其粒度域(G)说明段界限的单位;其系统标志(S)域为0,表示为系统段;类型域(Type)为2,表示为LDT段;DPL域无用;P域表示该LDT是否在内存中。 LDT描述符可以出现在GDT的任意位置。 对LDT所描述的各段的访问要经过GDT到LDT再到段,为了加快访问速度,Intel提供了另外一个寄存器LDTR,专门用来保存当前任务的LDT信息(基址、界限、属性等),任务的LDT信息保存在任务的状态段(TSS)中。 LLDT指令用于将信息装入LDTR,SLDT指令用于将LDTR中的内容存入内存。 1 6 段选择符(Segment Selectors) 因为要经常使用段描述符,因此需要一种标识它的简单的方法,这就是段选择符。段选择符是表示一个段的16位标识符。下图给出了段选择符的结构: 图 1.5. Segment Selector 段选择符由下面几项组成: Index:从3到15 共13位,表示范围为0到8192,是描述符在GDT或LDT中的索引。处

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

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