码迷,mamicode.com
首页 > 其他好文 > 详细

二 -- (1)

时间:2015-12-12 21:48:05      阅读:252      评论:0      收藏:0      [点我收藏+]

标签:

第二章 保护模式
● 80386简介
    【01:30】8086  寻址空间  1M
    【01:32】80286 寻址空间 16M
    【01:36】80386 寻址空间  4G

● 控制寄存器 (eflags)
    【01:57】eflags 用来指示微处理器
    【02:41】TF(陷阱标志) 能够激活微处理器芯片上的调试功能。如果为 1,允许调试;如果为 0,禁止调试。
    【03:05】IF(中断标志) 控制 INTR引脚的输入的操作。为1,INTR引脚被允许;为0,INTR引脚被禁止。
        ZC: 被允许 和 被禁止 干嘛?输入?
    【03:20】DF(方向标志) ZC: 记得在 有过,请的就是这个标志吧?
    【03:37】IOPL :输入输出的优先级。这个标志是用来保护 在保护模式当中操作的时候 被IO设备选择优先级。如果当前任务的优先级高于IOPL IO指令就会(顺序的执行)顺利的执行。如果IOPL比当前任务的优先级低(ZC: 说反了吗?这里和前面是一个意思啊) 产生中断,导致执行程序被挂起。
        00/01/10/11
        【04:18】00 ==> 最高优先级;11 ==> 最低优先级。

    【04:35】NT(嵌套标志) :在保护模式下 当前执行任务的,当前的执行任务 嵌套于另一个任务当中,这个标志 就被设置了。
    【04:58】RF : 是和 调试寄存器一起使用,控制下条指令之后 恢复程序的执行。
    【05:15】VM :用于在保护模式系统中 选择虚拟操作的模式。虚拟模式系统允许 多个1M长的DOS存储分区共存在存储器系统中,这样就允许系统执行多个DOS程序。

    ZC:关于这些标志的含义,貌似和网上的一篇文章内容类似,详见“... ...\网页\关于多功能寄存器的说明”里面保存的网页内容。

    【05:45】家下来看 控制寄存器CR0、CR1、CR2、CR3
        【05:55】CR1 :在80386中是没有使用的,它是为后续的产品保留的。(ZC: 那现在有没有用到它呢?)
        【06:10】CR2 :保存 页故障中断之前所访问的最后一页的线性地址
        【06:20】CR3 :保存 页目录的基地址。
            左边20位(高20位) 总是有效的,低12位 为0。CR3的低12位 与 其它位 一起确定4K长的页面的起始地址。(ZC: 这里的"其它位"指的是什么?)
        【06:52】主要看一下 CR0 :CR0中由许多特定的控制位。
            【07:01】PG(第31位) :值为1 ==> 选择线性地址到物理地址的转换(也就是开启了分页机制)
            【07:28】ET(第4位) :值为0 ==> 选择81287协处理器;值为1 ==> 选择80387协处理器。【07:45】之所以这样设计这个位,是∵80386刚开始出来的时候还没有80387(ZC: 协处理器),在多数系统中ET被置位(设置值为1) 表示系统没有80387
            【08:08】TS(第3位) :表示系统已经切换了位(ZC: 听得不太清楚)。值为1 ==> 协处理器指令引起类型7的一个中断,类型7 就是协处理器不存在。
            【08:30】EM(第2位) :值为1 ==> 可以使每条esc指令引起类型7中断(ZC: 有esc指令?)。我们通常通过这个中断 用软件来模拟协处理器指令底下的功能,模拟的方法 可以降低系统的成本,但执行模拟的协处理器指令 通常至少需要100倍的时间。
            【09:05】MP(第1位) :值为1 ==> 表明系统中有协处理器
            【09:12】PE(第0位) :值为1 ==> 选择 保护模式,开启段级的保护模式;值为0 ==> 进入实模式。在80286中,该位只能被置位,86286只有硬件复位 才能回到实模式(ZC: 什么是"硬件复位"?)。80386没有这个限制。

        ZC: 控制寄存器 CR0 中的 PE、PG位 分别控制 分段机制 和 分页机制,这里不是很明白,只要它们置位了,就强制开启了 分段/分页机制?能否在它们置位时 不使用 分段/分页机制?这个到底是怎么控制的?只有它们置位时才能使用 分段/分页 相关的寄存器?


【09:53】
“
● 实模式寄存器寻址
1、段 和 偏移
2、默认段 和 偏移寄存器

● 保护模式寻址
1、选择子 和 描述符
”
    【10:41】保护模式 和 实模式 寻址区别:
        保护模式下的 段地址 不再像 实模式那样 由段寄存器提供,在原来存放段地址的段寄存器里面含有一个选择子(或者叫 段选择子,或者叫 选择符)。选择子 用来 选择 描述符表内的一个描述符。描述符 描述 存储器段的位置/长度/访问的权限。【11:20】由于 段寄存器 和 偏移地址 仍然用于访问存储器,所以 保护模式指令 和 实模式指令 都是完全相同的。【11:42】两种模式之间的区别 就是 微处理器访问存储器段的时候 对段寄存器的解释不同(ZC: 所以需要看CR0的PE/PG位来决定使用哪种方式)。另一个差别是在保护模式下,可以用32位数取代16位数,32位的偏移地址微处理器访问长达4G的段内的数据。


【12:22】“1、选择子 和 描述符”
    装在 段寄存器里的选择子,从两个描述符表(GDT全局描述符表 或者 LDT本地描述符表)中的任意一个中,选择8192个描述符中的一个。
    【12:47】描述符 :它是用来说明存储器的段的 位置/长度/访问权限 的。
    段寄存器 仍然选择一个存储器段,但是不再像实模式那样直接选 而是间接的选择。
    【13:26】GDT全局描述符表 包含 适用于所有程序的段定义。
    【13:33】LDT局部描述符表 通常只适用于 唯一的应用程序。
    【13:41】可以把全局描述符 称为 系统描述符,局部描述符表 称为 应用描述符。
    【13:49】每个描述符表 最多包含 8192个。∴ 在任何时刻应用程序最多可以有16384个描述符。
        ZC: 16384 和 8192 的关系是怎么确定的?(16384 / 8192 = 2) 
        ZC: 16384 和 8192 这两个数字是如何得到的?和 4G(4194304) 又有什么关系?
        ZC: 4194304 /  8192 = 512
        ZC: 4194304 / 16384 = 256
    【14:00】∵一个描述符 说明一个存储器段,这就允许为每一个应用程序描述多达16384个存储器的段
    【14:20】描述符的基地址部分,只是存储器段的起始位置。80386以及更高等型号的微处理器 使用32位的基地址,允许段的起始于4G存储器中的任何一个地方。段界限包含段中最大的偏移地址。
    【15:00】80386以及更高等型号的微处理器 可以访问长度 :1字节~1M字节 或者是 4K字节~4G(ZC:字节) 之间的存储器段。为何会有两个段呢?原因:描述符中 有一个"G"位,这个位 表示颗粒度。"G"位值为1时,它的增长的比例是以4K位单位的,∴它是 4K字节~4G(ZC:字节) 之间。"G"位值为1时,以字节位增长的单位,∴是 1字节~1M字节 之间。
    【16:03】"AVL"位 :指示 段 是有效的/无效的。值为1 ==> 表示这个段是有效的;值为0 ==> 表示这个段是无效的。
    【16:30】描述符的长度 是 8个字节(ZC: 怪不得有两个0-32位)
    【16:46】"D/B"位 :D位 指示 是在保护模式下 或者 是在实模式下 指定是怎样访问寄存器或者存储器的数据。若 D==0 :指令 跟8086~80286之间的微处理器兼容,是16位的指令,这就意味着指令在默认方式下是16位的偏移地址和16位的寄存器,这种方式通常称为16位指令方式。若 D==1 :那么指令就是32位指令,默认情况下 32位指令 描述 假定 所有KAD里和寄存器都是32位的。(ZC: kad?什么东西?)
    【17:42】第8~16位(ZC: P/DPL/S/Type) :是 访问权限字节,它控制 对保护模式中存储器段的访问。这个字节(ZC: 这里是指"访问权限字节"还是指"S"?) 描述了段在系统中是怎样起作用的。访问权限字节 全面的控制着段。如果是数据段 就指定它的增长方向,如果段的增长超出了它的界限,微处理器的程序就被中断了 并且给出一个一般的保护错误。用户可以说明一个数据段 是否为可写或者是写保护。也可以用类似的方式控制代码段。为了保护软件还可以禁止读。

    【18:45】描述符 是通过 段寄存器 从描述符表中选择的。段寄存器包含了一个13位的段选择子字段。TI:表选择字段。RPL:请求优先级字段。
        【19:23】3~15位(共13位)的选择子字段,可以从描述符表的8192个描述符中选中一个。
        【19:35】TI:指明 全局描述符表(Ti == 0) 还是 局部描述符表(Ti == 1).
        【19:58】RPL:请求优先级字段。请求存储器段的访问优先级,最高级==0x00,最低级==0x11。
            【20:23】如果 请求优先级 和 访问权限设定的优先级 相匹配或者高于它,就允许访问。
            【20:33】优先级 用于多用户环境中。如果违背了优先级,系统通常只是一个优先级违例的错误。

【20:45】
“
2、程序不可见寄存器
”

    存储器系统中有 全局描述符表 和 局部描述符表,为了访问和指定这些表的地址,微处理器中包含有一些程序不可见寄存器。
    【21:08】程序不可见 就是指 不能被普通的程序访问 但是能被系统软件访问 可以被操作系统内核访问 (的寄存器).
    【21:22】在保护模式下 操作的时候,这些寄存器(程序不可见寄存器)控制微处理器.
    【21:35】GDTR :全局描述符表 寄存器
    【21:38】IDTR :中断描述符表 寄存器
    【21:43】Task Register :TR 任务寄存器
    【21:47】LDTR :本地描述符表 寄存器

    【21:55】保护模式中 每个段寄存器 含有一个程序的不可见的区域,这些寄存器的程序不可见区域 通常称为高速缓冲/高速缓冲器(翻译过来就是 cache,但是这个cache 和 微处理器中的一级二级高速缓存的cache是不一样的)。
        【22:25】每当段寄存器中的数发生改变的时候,基地址 界限 访问权限 就装入段寄存器的程序不可见区域。
        【22:35】当一个新的段号 被放到段寄存器里的时候,微处理器就访问 描述符表,并把描述符装入 段寄存器的程序不可见高速缓冲中。这个描述符 一直保存在 这个地方, 在访问存储器段的时候使用,直到段号再次发生变化。这样就允许微处理器重复访问存储器段,不必每次都去查询描述符表,因此它称为高速缓冲的寄存器。
    【23:23】GDTR 和 IDTR,包含的是描述符表的 基地址 界限。∵描述符表最大的长度为 64Kb,∴两个表的界限是16位。【23:41】当工作在保护模式的情况下,全局描述符表 基地址 界限 装入GDTR中,在使用保护模式之前 必须初始化中段描述符IDTR。
    【24:08】局部描述符表的位置 是从全局描述符表中选择的。为了寻址局部描述符表 建立了一个 全局描述符,需要访问局部描述符表的时候,把选择子装入IDTR中,就像在段寄存器中装入选择子是一样的。【24:39】这个 选择子 访问 全局描述符表,并且 局部描述符表的 基地址 界限 访问权限 装入LDTR的高速缓冲存储器中。(ZC: 这里,由 将"高速缓冲寄存器"改为"高速缓冲存储器",是否上面也讲错了?)
    【25:01】TR 包含有一个选择子,这个选择子 用来访问 一个确定的任务的描述符,任务 通常就是进程/应用程序。进程/应用程序 的描述符 存储在 全局描述符表中,因此 可以通过优先级控制对它进行访问。【25:33】任务切换机制 允许微处理器在足够短的时候内实现任务之间的切换,也允许多任务系统以简单而规则的方式 从一个任务切换到另一个任务。


【25:55】
“
● 分页机制
1、分页寄存器
”
    【26:03】80386和更高级的微处理器 它的分页机制 允许为任何的线性地址分配物理存储器的地址。线性地址 就是由程序产生的地址,通过内存分页机制 线性地址透明的转换为物理地址,这样 就能使 需要的 在特定地址上运行的程序通过分页机制重定位。

    【26:45】微处理器中 控制寄存器的内容 控制分页的单位,对分页单位至关重要的寄存器 就是CR0和CR3。
    【27:02】CR0的最左边 第31位 PG位 :置位==>选择了分页机制 ; PG 清零 ==> 程序产生的线性地址 就是位于寻址存储器的物理地址 。 PG 置1的时候 线性地址通过分页机制 转换成了物理地址。

    【27:35】CR3 的内容,包括页目录基地址 以及 PCD和PWT。我们主要讲解 页目录基地址,它是从第12位到第31位。页目录基地址 是被 页转换部件寻址页目录,这个地址可以寻址存储器中以4K为边界的页目录。
        ZC:"页目录基地址用于为页转换部件寻址页目录"这句话,可参看“Intel微处理结构.docx”。
        【28:16】页目录 包含 1024个 (页)目录项,每项长度是4字节。每个页目录项寻址一个包含1024项的页表。

    【28:38】由软件生成的线性地址,分成3部分,分别用于 寻址 页目录项(Directory),页表项(Table),偏移地址(Offset)。每一个页目录项代表存储系统的4M的一个区域,页目录的内容选择 由随后的10位线性地址 指示的页表 ,这是一个4K的区域。线性地址的偏移部分 选择4K页内的一个字节。∵进行4K存储区 重新分页的操作 要求访问存储器内的页目录和页表,∴Intel创造了一个称为TLB的 高速缓冲存储器。如果要访问某个存储区 而且它的地址已经在TLB中,那么就不需要 再访问页目录和页表,因此加速了程序的执行。如果一个页表转换不在TLB中,那么必须访问页目录和页表。


【30:13】
“
2、页目录和页表
”
    【30:25】图中显示的就是 怎么样把一个线性地址转换成物理地址的一个过程。它(ZC:线性地址?)的第22位到第31位,指定了页目录,页目录 的基地址是由CR3来决定的,它(ZC:CR3的PDBR?)指定了页目录中 某一个目录项。
        【30:50】第12位到第21位,指定了 某一个目录项中的一个页表项。
        【31:00】Offset,然后 偏移值 加上 页表项 就构成了物理地址。


【31:15】
“
● 80386存储管理
1、描述符和选择子
”
    【31:23】80386中的存储管理单元 MMU 和 286中的MMU 是很类似的,只是80386中包含了分页单元 286中没有。
    【31:41】MMU是用来完成 把程序中输出的线性地址转换成物理地址的。
    【31:51】80386 利用分页机制 把物理地址分配到逻辑地址,因此 如果分页是激活的 即使程序指令需要访问 比如说A0000单元 实际的物理地址可能是10000H单元 或者其他单元。这个特点 实际上使得对任意存储单元进行操作的软件 都能运行在80386上,∵任何的线性地址 都可以变换为物理地址。

    【32:38】描述符 是描述和定位存储器段的8个连续的字节。选择子 用来从描述符表中检索描述符。
    【32:52】80386的描述符使用 32位的基地址、20位的界限。
    【33:01】80386中用 32位的基地址 寻址4G的存储空间。
    【33:10】由于具有两种不同方式的20位界限,它的段长度可以是1M或4G。为什么会出现1M和4G呢,是∵颗粒度的原因 G位,G位为0时是1M,G位为1时 允许寻址最大长度是4G。

    【33:45】这个图(ZC: 上面那张图)说明了80386在保护模式下,如何用 选择子、描述符 来寻址 存储器段。选择子 用它最左边的13位 从描述附表中选择一个描述符,ti位(ZC:有听错吗?)指示的是 局部描述符表 还是 全局描述符表。我们提到过 ti==0时 是全局描述符表,ti==1时 是局部描述符表。
        【34:28】选择子最右边的两位 RPL,我们也讲过,用来定义所需要的访问优先级别。
        【34:40】选择子 在描述符表中 选择了一个描述符,这个描述符中有段的基地址,它通过取出基地址 再加上 偏移地址 就得到我们想要的线性地址。
    【34:58】由于选择子 是用13位的代码访问描述符,它的整个是16位的(ZC:13+2=15,还有一位是干嘛的?),∴在每个局部/全局描述符表中最多可以有8192个描述符。由于每个段可以是4G,而我们可以用两个描述符表 访问 16384个段,这样就使得80386 可以访问的虚拟存储器地址可以达到64T,1T=1024G。【36:18】存储器系统 实际存在的存储器 是32位地址线,∴只能是4G。如果在某个时刻,某个程序需要用多于4G的存储器,就可以把存储器系统 和 磁盘驱动器 或者其他形式的大容量存储设备之间 进行交换。
    【36:45】80386有 全局描述符表 和 局部描述符表,还有一个 中断描述符表IDT。 IDT 是为 中断描述符 或者 门描述符 设计的。
    【37:11】80386的基地址是32位的 界限域是20位。G位 表示颗粒度,可以是 1 或者是 4K 为倍数的。
    【37:35】我们看一下描述符(ZC: 下面那张图),看一下各个位代表的含义。
        【37:50】第0位到第15位 表示 段限长。段限长 还有 第16位到第19位,它俩的组合构成了 实际的段限长。
        【38:08】第16位到第31位 是 基地址。第5个字节 它也是基地址,所以 第5、4、3个字节 还有第16位到第31位(ZC: 实际应该是 第56位到第63位 吧?) 它们的组合构成了基地址的值。
        ZC: 这里可以看出描述符是64位长的。
        【38:45】D/B位 :它用来选择默认的 寄存器的宽度的,如果D==0 寄存器的宽度是16位,如果D==1 寄存器的宽度是32位。
        【39:09】AVL :是由操作系统以适当的方式使用的,通常用来表示描述符所描述的段是否可用。


【39:27】
“
2、段描述符
3、系统描述符
”
    【39:38】ZC: 这张图 是段描述符?不是 系统描述符?
    【39:45】段描述符 中 访问权限位 是这几位(ZC: 貌似视频中指的是第8-16/40-48位,P/DPL/S/Type)。 访问权限位 是用来指示 描述符所描述的 数据段、堆栈段 或 代码段 是怎么工作的。
        【40:12】访问权限的第4个字节 是 S (ZC: 说明上面确实指的是 P/DPL/S/Type),表示 这个描述符是 系统描述符/数据描述符/代码描述符。S==0,表示系统描述符,S==1,表示是普通的描述符(可能是 数据描述符 或 代码段描述符)
        ZC:讲到这里 感觉  段描述符 和 系统描述符 的结构应该是一样的,都是这个图里面的结构。
        【40:47】P :存在位。P==1 表示这个段是存在的,P==0 并且通过描述符访问这个段 会产生一个类型11的中断 这个中断表明访问的段在系统中是不存在的。
        【41:17】DPL :描述 描述符优先级,用来设置描述符的优先级。00表示最高优先级,11表示最低优先级。用来对段的访问进行保护。如果用一个比DPL低的优先级 来访问这个段,就会发生越权中断。多用户系统中 优先级可以防止对系统存储区的访问
        【42:06】S==0 表示是 系统段,S==1 表示是 数据段 或者 代码段。
        【42:24】Type 占用了4位,4位 中有几个标志,从高位向低位依次为 e标志、x标志、rw标志、a标志
            【42:58】e位 :可执行位。用来选择 数据/代码段。
            【43:07】x位 :当 e位==0时,x指示 数据段/堆栈段 的扩展方向 --> x==0时,段就像数据段那样向上扩展,若x==1,段就像堆栈段那样向下扩展。
                当e==1时,x指示代码段的优先级被忽略。
            【43:38】rw位 :若e==0,rw位 指示数据段是否允许写。若e==1,rw位 指示代码段是否允许读。允许是1,不允许是0 。
            【44:03】a位 :访问位。处理器每次访问段的时候,这个位都被置位为1。操作系统使用这一位跟踪那些段已经被访问了。

    【44:20】再来看一下 系统描述符
    【44:28】系统描述符 S位为0时,描述符就是系统描述符。
    【44:33】80386系统中有16种可能的系统描述符类型,但是并不是都在80386中使用,有的类型是为80286定义的,使80286上的软件和80386兼容。有的类型是新定义的 并且是80386独有的,有些还没有定义,是为后续产品保留的。
        ZC: 这些类型都是 硬件厂商定义的??
        【45:10】怎么样表示16种可能的描述符类型呢,每种是什么类型的呢,是根据 Type,∵Type是4位,用Type来区别它是什么样的系统描述符。分别看一下:
            Type==0,无效的。
            Type==1,用于286的任务状态段。
            Type==2,用于LDT 表示本地描述符的。
            Type==3,表示这个描述符正在执行80286的任务状态段。
            Type==4,表示 80286的调用门。
            Type==5,任务门。
            Type==6,80286的中断门。
            Type==7,80286的陷阱门。
            Type==8,无效的。
            Type==9,80386的任务状态段。
            Type==10,为以后的Intel产品保留。
            Type==11,正在执行的80386的任务状态段。
            Type==12,80386的调用门。
            Type==13,为以后的Intel产品保留。
            Type==14,80386的中断门。
            Type==15,80386的陷阱门。



【完毕】

 

1、eflags_01.jpg

技术分享

 

2、eflags_02.jpg

技术分享

 

3、eflags_03.png

技术分享

 

4、段描述符_01.jpg

技术分享

 

5、段描述符_02.jpg

技术分享

 

6、段选择符(或称段选择子)_01.jpg

技术分享

 

7、段选择符(或称段选择子)_02.gif

技术分享

 

8、程序不可见寄存器.jpg

技术分享

 

9、分页寄存器.jpg

技术分享

 

10、页目录和页表.jpg

技术分享

 

11、描述符和选择子.jpg

技术分享

 

12、段描述符?系统描述符?.jpg

技术分享

 

 

C

 

二 -- (1)

标签:

原文地址:http://www.cnblogs.com/CodeSkill/p/5041830.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!