Intel手册笔记1

系统级体系结构概览

系统级体系结构由一系列寄存器,数据结构,和指令组成,对基本的系统级操作,包括内存管理,中断和异常处理,任务管理,和多核控制提供支持。

  • Global and Local Descriptor Tables

当操作系统运行在保护模式下,内存的访问通过GDT或LDT。每一个表项都是一个段描述符。段描述符包含了段基址,限长,访问权限,类型,使用信息。每一个段描述符都与一个段选择器(寄存器)关联,段选择器保存段描述符在表中的偏移量。CPL(current priviledge level)控制了当前程序对段的访问权限。
图.段选择器,TI=0指示从全局描述符表GDT中读取描述符;TI=1指示从局部描述符表LDT中读取描述符,请求特权级RPL用于特权检查。

  • System Segments, Segment Descriptors, and Gates

除了SS,DS,CS组成程序的运行环境,系统结构中还定义了两种系统段结构,分别为任务状态段 (TTS) 和LDT。(GDT不被认为是段,因为它不能用段选择器和段描述符访问)另外,还有被称作门的特殊描述符,提供了一种受保护的方式去调用跨特权的系统调用或者处理程序。当权限较低的代码段需要访问更高权限的代码段时,程序有一个call gate的选择器,通过call gate,获取到目标代码段的段描述符以及偏移量,为了执行一个不同优先级的调用,需要有一个拥有目标优先级的栈,当前程序从TTS获得这个新栈的选择器。门使得16位和32位代码之间的切换更加方便。

  • Task-State Segments and Task Gates

任务状态段负责在进程管理的过程中,保存切换任务的现场信息,实现任务的挂起和恢复。任务状态段中包含通用寄存器, 段寄存器, 标志寄存器, eip寄存器, 堆栈指针, 三个对应不同优先级的栈段选择器和栈指针,LDT段选择器(与分页相关)。在保护模式下,所有程序都在其任务上下文中执行。任务寄存器中保存了当前任务的TSS的段选择器。当进行task switch时,首先将当前任务的寄存器信息保存到任务寄存器所指向的当前任务的 TTS ,然后加载指向新任务的段选择器到任务寄存器中,通过任务寄存器在GDT上找到段描述符并访问到新的TSS,再根据TTS 加载上下文至处理器的一系列寄存器组中,接下来就可以开始执行新的任务。任务门也可以实现任务访问,类似于调用门,但与调用门不同的是,任务门访问的是TTS而不是代码段。

  • Interrupt and Exception Handling

外部中断,软件中断和异常是通过中段描述符表 (IDT) 处理的。中断描述符表储存着门描述符(interrupt,trap,task gate descriptors),可以访问中断和异常处理程序。中断描述符表和GDT一样也不是一个系统段,中段描述符表的线性基址储存在中段描述符表寄存器( IDTR)。中断处理过程中,处理器首先接收到内部硬件的中断向量(IDT表项的索引)和外部的中断控制或者中断指令,然后访问中断描述符表,再以类似call gate的方式进行中断处理调用,如果中断描述符表中的是task gate descriptors,则通过task switch找到处理函数。

  • Memory Management

系统支持直接物理寻址和虚拟地址寻址,当使用分页的时候,所有的代码,数据,堆栈,段都可以分页,但是只有最近访问的页会被保存在物理内存中。分页结构的物理基址保存在控制寄存器CR3中,分页结构中的条目决定了页的物理基址,访问权限和内存管理等信息。

  • System Registers

为了帮助处理器的初始化和系统的控制,系统结构中设置了一些系统标志寄存器。
1.EFLAGS 寄存器 控制着任务和模式选择,中断处理,指令跟踪和访问权限。
2.控制寄存器(CR0、CR2、CR3和CR4) 包含用于各种系统级操作的标志和控制字段。
3.调试寄存器 允许设置断点,供程序调试和系统软件中使用。
4.GDTR,LDTR,IDTR 包含各个表的线性地址。
5.任务寄存器TR包含当前任务在 TTS 中描述符的线性地址。

实模式和保护模式转换

1.“实模式–保护模式”的跳转
(1) 关中断
(2) 打开地址线A20
(3) 置cr0寄存器的末位为1 (PE = 1)
(4) 实现跳转,进入到保护模式
2.“保护模式–实模式”的跳转
(1) 从保护模式下的32位代码段跳转到16位代码段
(2) 在16位代码段下初始化所有段寄存器
(3) 置cr0的末位为0 (PE = 0)
(4) 实现跳转,返回到实模式

80x86系统指令寄存器

EFLAGS 标志寄存器 用来控制I/O,硬件终端,调试,任务切换和虚模式。只有相应的权限码能够修改其中的部分字节。

  • EFLAGS寄存器的状态标志(0、2、4、6、7以及11位),用于指示算术指令(如ADD, SUB, MUL以及DIV指令)的结果。
    -TF(bit 8) [Trap flag] 将该位设置为1以允许单步调试模式,清零则禁用该模式。
  • IF(bit 9) [Interrupt enable flag] 该标志用于控制处理器对可屏蔽中断请求(maskable interrupt requests)的响应。置1以响应可屏蔽中断,反之则禁止可屏蔽中断。
  • IOPL(bits 12 and 13) [I/O privilege level field] 指示当前运行任务的I/O特权级(I/O privilege level),正在运行任务的当前特权级(CPL)必须小于或等于I/O特权级才能允许访问I/O地址空间。这个域只能在CPL为0时才能通过POPF以及IRET指令修改。
  • NT(bit 14) [Nested task flag] 这个标志控制中断链和被调用任务。若当前任务与前一个执行任务相关则置1,反之则清零。
  • RF(bit 16) [Resume flag] 控制处理器对调试异常的响应。
  • VM(bit 17) [Virtual-8086 mode flag] 置1以允许虚拟8086模式,清除则返回保护模式。
  • C(bit 18) [Alignment check flag] 该标志以及在CR0寄存器中的AM位置1时将允许内存引用的对齐检查,以上两个标志中至少有一个被清零则禁用对齐检查。
  • VIF(bit 19) [Virtual interrupt flag] 该标志是IF标志的虚拟镜像(Virtual image),与VIP标志结合起来使用。使用这个标志以及VIP标志,并设置CR4控制寄存器中的VME标志就可以允许虚拟模式扩展(virtual mode extensions)
  • VIP(bit 20) [Virtual interrupt pending flag] 该位置1以指示一个中断正在被挂起,当没有中断挂起时该位清零。[Software sets and clears this flag; the processor only reads it.]与VIF标志结合使用。
  • ID(bit 21) [Identification flag] 程序能够设置或清除这个标志指示了处理器对CPUID指令的支持。

处理器提供了4个内存管理寄存器(GDTR、LDTR、IDTR和TR),用于指定分段内存管理所使用的系统表的基地址。处理器为这些寄存器加载和保存提供了特定的指令。

  • GDTR寄存器中用于存放全局描述符表GDT的32位线性基地址和16位表长度值。基地址指定GDT表中字节0在线性地址空间中的地址,表长度指明GDT表的字节长度值。指令LGDT和SGDT用于加载和保存GDTR寄存器的内容。在机器刚加电或处理器复位后,默认基地址设置为0,而长度被设置成0XFFFF,在保护模式初始化过程中必须给GDTR加载一个新值。
  • LDTR寄存器中用于存放局部描述符LDT的32位线性基地址、16位段限长和描述符属性值。LLDT和SLDT分别用于加载和保存LDTR寄存器的段描述符部分。包含LDT表的段必须在GDT表中有一个段描述符项,当使用LLDT指令把含有LDT表段的选择符加载进LDTR时,LDT段描述符的段基地址、段限长度以及描述符属性会被自动加载到LDTR中。当进行任务切换时,处理器会把新任务的段选择符合段描述符自动加载近LDTR中。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。
  • IDTR寄存器用于存放中断描述符表IDT的32位线性基地址和16位表长度值,指令LIDT和SIDT分别用于加载和保存IDTR寄存器的内容。在机器刚加电或者处理复位后,基地址被默认设置为0,而长度值设置为0XFFFF。
  • TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。它引用GDT表中一个TSS类型的描述符。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。当使用LTR指令把选择符加载近任务寄存器时,TSS描述符中的段基地址、段限长度以及描述符属性会被自动的加载到任务寄存器中。当执行任务切换时,处理器会把新任务TSS的段选择符和段描述符自动加载到TR寄存器中。

控制寄存器决定了当前处理器的操作模式和当前正在处理的任务的特性

  • CR0含有控制处理器操作模式和状态的系统控制标志
  • CR1保留
  • CR2含有导致页错误的线性地址
  • CR3含有页目录表物理内存基地址,因此该寄存器也被称为页目录基地址寄存器PDBR

系统指令

  • LGDT SGDT

LGDT指令将GDT的入口地址装入GDTR寄存器,从此以后,CPU就根据此寄存器中的内容作为GDT的入口来访问GDT。GDTR中存放的是GDT在内存中的基地址和其表长界限。SGDT用于保存GDTR寄存器中的值。

  • LIDT SIDT

用于加载和保存LDTR寄存器的段描述符部分,即段基址和段限长度。

  • LLDT SLDT

用于加载和保存IDTR寄存器。

  • LTR STR

TR寄存器用于存放当前任务TSS段的16位段选择符、32位基地址、16位段长度和描述符属性值。指令LTR和STR分别用于加载和保存TR寄存器的段选择符部分。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值