x86保护模式    任务状态段和控制门

每个任务都有一个任务状态段TSS     用于保存任务的有关信息     在任务内权变和任务切换时  需要用到这些信息   
任务内权变的转移和任务切换  一般需要通过控制门进行这些转移。
<一>   系统段描述符
系统段是为了实现存储管理机制所使用的一种特别的段
任务状态段TSS和局部描述符表LDT段   用于描述系统段的描述符成为系统段描述符
1.描述符格式

与存储段描述符类似   区别位属性字节中的描述符类型为DT的值

DT=1为存储段    DT=0为系统段   
存储段中的D位在系统描述符中不使用   用符号X表示
TYPE字段用4位表示   含义与存储段描述符的类型完全不同

由图中可知  仅仅只有类型编码为2 1 3 9 和B的描述符才是真正的系统段描述符

用于ldt和任务状态段TSS
其他的都是门描述符
注意系统段描述符的选择子不能用来读写系统段   如果想读写需要用到别名技术
2.LDT段描述符
局部描述符表
此描述符必须位于gdt中才有效
3.任务状态段描述符
TSS用于保存任务的各种状态信息    tss规定任务状态段的基地址和任务状态段的大小等信息   
例如 TempTask DESC <104,3456H,12H,89H,,>

此为386任务状态段  基地址为123456h   以字节为单位的界限是104   描述符的特权级是0
装载tr寄存器时    描述符中的基址和界限等信息被装入到tr高速缓冲寄存器中    
当任务切换时或执行LTR时    要装载TR寄存器
tss两种状态  忙和可用   当一个任务为当前正在执行,或者是用tss中的链接字段挂起任务链接到当前任务上的任务,那么是忙的任务    否则就是可用的任务
利用jmp和call   直接通过tss描述符或通过任务门来实现任务的切换
 
二  门描述符
此描述符不描述内存段   而是描述控制转移的入口点
就好象一个代码段通往另一个代码段的门   可以实现任务内权级的变换和任务间的切换    也称控制门
1.门描述符的一般格式

仅仅是描述符偏移5的字节一致  也由此字节标识门描述符和系统段描述符    该字节内的p和dpl的意义与其他描述符中的意义相同

根据上图给出的门描述符的结构,可定义如下的门描述符结构类型:
    GATE     STRUC      ;门结构类型定义
OFFSETL DW 0 ;32位偏移的低16位
SELECTOR DW 0 ;选择子
DCOUNT DB 0 ;双字计数字段
GTYPE DB 0 ;类型
OFFSETH DW 0 ;32位偏移的高16位
GATE ENDS
门描述符可以分为   任务门   调用门 中断门和陷阱门  除了任务门   其他描述符还分成286和386两种
2.调用门
描述某个子程序的入口     选择子必须实现代码段描述符  
调用门内的偏移是对应代码段内的偏移 利用段间调用指令call 实现任务内从外层到内层特权级的转移
门描述符中4字节双字计数字段 仅仅在调用门中有效 在其他门中无用
意义:主程序通过堆栈把入口参数传递为子程序 如果在利用调用门时 子程序引起权变 则会引起堆栈的变化 那么就需
要将外层堆栈中的参数复制到内层堆栈中 。该双字计数字段用于说明需要复制的双字参数的数量
3.任务门
此门内的选择子必须指示gdt中的任务状态段TSS描述符   门中的偏移没有意义。任务的入口点保存在TSS中。利用段间转移指令JMP和段间调用指令call   通过任务门可以实现任务切换。
4.中断门和陷阱门
此两个门   描述中断和异常的处理程序的入口点
选择子通调用门相同  需要指向代码段描述符   门内的偏移就是对应代码段的入口点的偏移。
此门只有在IDT中才有效    
三   任务状态段
保存一个任务的重要信息的段    
tss在任务切换过程中起作用   通过它来实现任务的挂起和恢复   
任务切换为挂起当前正在执行的任务,恢复或启动另一任务的执行。
步骤:
1.cpu中的各个寄存器被自动保存到TR所指定的TSS中
2.下一个任务TSS的选择子被装入TR
3.从TR所指定的TSS中各个寄存器的值送到cpu中的各个寄存器中
tss格式如下

104个字节构成的基本格式     不可改变    可以分为链接字段    内层堆栈指针区    地址映射区    寄存器保存区   和其他字段等五个区域

1.寄存器保存区
20h到5fh处     用于保存通用  段   指令指针   标志寄存器
当tss对应的任务执行时   此时区域未定义  ;当前任务切换出时    这些寄存器的当前值就保存在该区
当切换回此任务时    再从保存区恢复出这些寄存器的值
通用寄存器   指令指针 标志寄存器各杜英一个32位的双字
段寄存器也对应32位的双字   但是选择子只有16位  存于低16位   高16填0
2.内层堆栈指针区
一个任务有可能有4个堆栈   当发生向内层转移时   不可能转移到3级   所以没有3级的堆栈区
只有0 1 2三个级别的堆栈
三个堆栈指针   都是48位的全指针  16位子和32位的偏移   依次存放到4 12 20开始的位置
发生向内层转移时   把适当的堆栈指针装入ss级esp寄存器 变换到内层堆栈   外层堆栈的指针保存到内层堆栈中
注意:当向外层变换时   不把内层堆栈的指针保存到tss的内层堆栈指针区        cpu从不向该区写入  
向内层转移时   总是把内层栈认为是空栈   不允许发生同级别内层转移的递归;如果向内层转移  那么返回到外层的正常途径是相匹配的向外层返回。
3.地址映射寄存器区域
虚拟到线性有GDT和LDT决定   与特定任务相关的有LDT确定   LDTR确定LDT     
如果分页机制  则线性到物理的映射由包含页目录表起始物理地址的控制寄存器cr3确定 ,所以与特定任务相关的虚拟到物理的地址映射有LDTR和cr3确定
任务的切换   相应的地址映射关系  函数  表一样要切换
位于偏移1ch处的cr3和偏移60h处的LDTR字段组成   任务切换时  需要cpu自动从要执行的任务中取出这两个字段 ,分别装入到寄存器cr3和ldtr      这样就改变了虚拟到物理地址的映射
注意   任务切换时 ,处理器不把换出任务的寄存器cr3和ldtr的内容保存到tss中的地址映射寄存器区 ,   如果程序改变了LDTR和CR3  那么必须把新值人为地保存到tss中的相应字段  且通过别名技术
4.链接字段
链接字段在最开始的位置    其中高16位未用   ;当起链接作用时  低16位保存前一个任务的描述符的选择子
如果当前任务由段间调用指令call或中断和异常而激活,那么链接字段保存被挂起任务(任务链上的前一个任务)的TSS的选择子,并且标志寄存器的NT位被置1,使链接字段有效。在返回时,由于NT标志位为1,返回ret或中断返回指令iret   将使得控制沿着链接字段所指的恢复到前一个任务。
5.其他字段
66h处存放i/o许可位图  实现输入输出的保护
64h处为调试陷阱    最低位用T表示   其他位为0   当任务切换时,如果进入任务的T位为1  那么完成之后  新任务的第一条指令执行之前会产生调试陷阱。
6.用结构类型定义TSS
根据上图给出的任务状态段TSS的结构,可定义如下的TSS结构类型:
;----------------------------------------------------------------------------
;任务状态段结构类型定义
;----------------------------------------------------------------------------
TSS STRUC
TRLink DW 0 ;链接字段
DW 0 ;不使用,置为0
TRESP0 DD 0 ;0级堆栈指针
TRSS0 DW 0 ;0级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP1 DD 0 ;1级堆栈指针
TRSS1 DW 0 ;1级堆栈段寄存器
DW 0 ;不使用,置为0
TRESP2 DD 0 ;2级堆栈指针
TRSS2 DW 0 ;2级堆栈段寄存器
DW 0 ;不使用,置为0
TRCR3 DD 0 ;CR3
TREIP DD 0 ;EIP
TREFlag DD 0 ;EFLAGS
TREAX DD 0 ;EAX
TRECX DD 0 ;ECX
TREDX DD 0 ;EDX
TREBX DD 0 ;EBX
TRESP DD 0 ;ESP
TREBP DD 0 ;EBP
TRESI DD 0 ;ESI
TREDI DD 0 ;EDI
TRES DW 0 ;ES
DW 0 ;不使用,置为0
TRCS DW 0 ;CS
DW 0 ;不使用,置为0
TRSS DW 0 ;SS
DW 0 ;不使用,置为0
TRDS DW 0 ;DS
DW 0 ;不使用,置为0
TRFS DW 0 ;FS
DW 0 ;不使用,置为0
TRGS DW 0 ;GS
DW 0 ;不使用,置为0
TRLDTR DW 0 ;LDTR
DW 0 ;不使用,置为0
TRTrip DW 0 ;调试陷阱标志(只用位0)
TRIOMap DW $+2 ;指向I/O许可位图区的段内偏移
TSS ENDS

x86保护模式 任务状态段和控制门的更多相关文章

  1. x86 保护模式 十 分页管理机制

    x86   保护模式  十  分页管理机制 8.386开始支持分页管理机制 段机制实现虚拟地址到线性地址的转换,分页机制实现线性地址到物理地址的转换.如果不启用分页,那么线性就是物理地址 一  分页管 ...

  2. X86保护模式 八操作系统类指令

    X86保护模式  八操作系统类指令 通常在操作系统代码中使用,应用程序中不应用这些指令 指令分为三种:实模式指令,任何权级下使用的指令.实模式权级0下可执行的指令和仅在保护模式下执行的指令 一  实模 ...

  3. x86保护模式-七中断和异常

    x86保护模式-七中断和异常 386相比较之前的cpu   增强了中断处理能力   并且引入了 异常概念 一 80386的中断和异常 为了支持多任务和虚拟存储器等功能,386把外部中断称为中断     ...

  4. x86保护模式 实模式与保护模式切换实例

    x86保护模式     实模式与保护模式切换实例 实例一 逻辑功能   以十六进制数的形式显示从内存地址110000h开始的256个字节的值    实现步骤: 1  切换保护方式的准备 2. 切换到保 ...

  5. x86保护模式 控制寄存器和系统地址寄存器

    控制寄存器和系统地址寄存器 控制寄存器    crx cr0   指示cpu工作方式的控制位  包含启用和禁止分页管理机制的控制位  包含控制浮点协处理器操作的控制位   注意必须为0的位 cr2和c ...

  6. x86保护模式-六 控制转移

    控制转移可以分为两大类  :同一任务内的控制转移    和   任务间的控制转移(任务切换) 同一个任务内的控制转移可以分为段内转移 .特权级不变的段间转移和特权级改变的段间转移 段内转移与实模式相同 ...

  7. x86保护模式 二 分段管理机制

    分段管理机制 段选择子和偏移地址的二维虚拟地址转换为一维的线性地址 一  段定义和虚拟地址到线性地址的转换 三个参数定义段:段基地址    段界限  和段属性    同时也是段描述符的结构 段基地址为 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第10章:32位x86处理器的编程架构

    ★PART1:32位的x86处理器执行方式和架构 1. 寄存器的拓展(IA-32) 从80386开始,处理器内的寄存器从16位拓展到32位,命名其实就是在前面加上e(Extend)就好了,8个通用寄存 ...

  9. 【译】x86程序员手册39-10.3切换到保护模式

    10.3 Switching to Protected Mode  切换到保护模式 Setting the PE bit of the MSW in CR0 causes the 80386 to b ...

随机推荐

  1. [转]用NPOI操作EXCEL--通过NPOI获得公式的返回值

    本文转自:http://www.cnblogs.com/atao/archive/2009/10/12/1582085.html 前面我们学习了通过NPOI向Excel中设置公式,那么有些读者可能会问 ...

  2. WPF MATERAIL DESIGN TOOKIT

    最近有个程序需要用到WPF,本以为WEB可以做到很炫的,没有想到XAML也能做到如此之炫.心动了,那就行动吧. 搜到有各种款式的:METRO风格,RIBBON风格,MATERIAL风格…… 也许是玩W ...

  3. 将Android系统源码导入Android studio的方法

    Android源码目录结构如下: |-- Makefile|-- abi (applicationbinary interface,应用程序二进制接口,生成libgabi++.so相关库文件)|-- ...

  4. 基于Myeclipse的三大框架(SSH)整合

    文中主要基于Myeclipse进行配置,配置流程为:Hibernate --> Spring --> 整合 --> struts2 -->整合.注意:在此文中,主要讲述基于注解 ...

  5. React Native 手工搭建环境 之iOS篇

    常识 React native 开发服务器 在开发时,我们的框架是这样的:  当正式发布进入到生产环境时,开发服务器上所有的js文件将会被编译成包的形式,直接嵌入到客户端内.这时,已经不再需要开发服 ...

  6. 重置Mysql的root密码及用户权限设置

     一.重置Mysql的root密码 方法一: 直接进入localhost/phpmyadmin修改用户root的权限,设置密码: 方法二: 进入mysql控制台:mysql->use mysql ...

  7. CSS实现画一条竖线

    在开发中遇到一种需求:画一条竖线. 横线倒是很好画,直接<hr/>就可以了.但是竖线没有这么现成的标签,囧囧囧~ 在网上搜索了很多资料,莫衷一是,也没有什么可信的结果. 1.原来这就是竖线 ...

  8. [Batch檔案筆記] 在UNC路徑中執行Batch檔

    為了讓其他人可以免安裝又可以執行python程式所以我把python portable版本 winpython 放在samba的空間共享但是使用者如果要開 winpython cammand prom ...

  9. Codeforces Round #318 (Div. 2) A Bear and Elections (优先队列模拟,水题)

    优先队列模拟一下就好. #include<bits/stdc++.h> using namespace std; priority_queue<int>q; int main( ...

  10. SVN中的check out与export的区别

    http://blog.csdn.net/zndxlxm/article/details/7763116 check out跟check in对应,export跟import对应. check out ...