zoukankan      html  css  js  c++  java
  • 转载:保护模式1

    实模式与保护模式

    摘自ITWIKI,为我和还没搞明白真实模式保护模式的XDJM们

    真实模式

    Intel 8086和8088有14个16缓存器。其中四个(AX, BX, CX, DX)是通用目的(尽管每个缓存器有额外的目的;举个例子:CX可以被用来当作loop循环)指令的计数器。每个缓存器可以被当成两个分开的字节存取(因此BX的高位可以被当成BH以及低位BL)。除了这些缓存器, 还有四个区段缓存器(CS、DS、SS、ES)。他们用来产生内存的寻址。还有两个指针缓存器(SP是指向堆栈的底部, BP可以用来指向堆栈或内存的其它地方)。两个指针缓存器(SI和DI)可以用来指向数组的内部。最后,有旗标缓存器(包含状态旗标比如进位溢位、结果为零,等等)。以及IP是用来指向目前执行指令个地址。

    在真实模式下,内存的存取是被区段开来。为了得到最后20位的内存地址,要将区段的地址往左移动4位,并且加上偏移的地址。因此,真实模式下总共可以寻址的空间是220字节, 或者是1MB,于1979年是相当让人印象深刻的象征。在真实模式下有两种寻址模式:near和far。在 far模式,区段跟偏移都需要被指定;在near模式,只需要偏移模式被指定,而内存区段是由适当的区段缓存器获得。以数据而言是使用DS缓存器,程序代码是CS缓存器,堆栈是SS缓存器。举个例子,如果DS是A000h且SI是5677h,DS:SI会指向计忆体的绝对地址DS × 16 + SI = A5677h

    在这种架构下,两对不同的区段/篇移可以指向一个相同的绝对地址。因此如果DS是A111h且SI是4567h,DS:SI会指向跟上一段相同的A5677h。除了duplicity之外,这种架构无法同时一次拥有4个以上的区段。此外,CS、DS和SS是为了程序正确功能而必须的,因此仅仅只有ES可以被用来指向其它的地方。这种模式原本是为了与Intel 8085兼容,导致程序设计师永无止尽的痛苦。

    除了以上所说的,8086也拥有8-bit的64K(另一种说法是16-bit的32K)输出输入en:I/O)空间,以及一个由硬件支持的64K(一个区段)内存堆栈。只有words(2字节)可以被推入到堆栈中。堆栈是由内存的上端往下成长,他的底端是由SS:SP指向。有256个中断interrupts),可以由硬件或是软件同时组成。中断是可以串连在一起,使用堆栈来储存返回被中断的程序地址。

     

    16位保护模式

    Intel 80286可以在不改变任何东西下支持8086的真实模式16位软件,然而它也支持额外的工作模式称为保护模式,可以将可寻址的物理内存扩充到16MB,可寻址的虚拟内存最大到 1GB。这是使用节区缓存器来储存在节区表格中的索引值。处理器中有两个这样的表格,分别为GDTLDT,每一个可以储存最多8192个节区的描述子,每一个节区可以给予最大到64KB的内存存取。节区表格提供一个24位的基地址(base address),可以用此基地址增加想要的偏移量来创造出一个绝对地址。此外,每一个节区可以被赋予四种权限等级中的一种(称为 "rings")。

    尽管这个推出的功能是一项进步,但是他们并没有被广泛地使用,因为保护模式的操作系统无法执行现有的真实模式软件。这样的能力只有在随后80386处理器的虚拟86模式中出现。

    在同时,操作系统比如OS/2尝试使用类似乒乓的方法,让处理器在保护和真实模式间切换。这样都会让计算机变慢且不安全,像是在真实模式下的程序可以轻易地使计算机当机。OS/2也定义了限制性的程序设计规则允许"Family API"或"bound"程序可以在真实模式或保护模式下执行。然而这是给原本为保护模式下设计的程序有关,反之则不然。保护模式程序并不支持节区选择子和物理内存之间的关系。有时候会错误地相信在16位保护模式下执行真实模式的程序,导致IBM必须选择使用Intel保留给BIOS的中断呼叫。事实上这类的程序使用任意的选择子数值和使用在上面提到的“节区运算”的方式有关。

    这个问题也在Windows 3.x上出现。这个推出版本想要在16位保护模式下执行程序,而先前的版本只能在真实模式下执行。理论上,如果Windows 1.x或2.x程序是写得“适当”且避免使用节区运算的方式,它就有可能在真实和保护模式两者下执行。Windows程序一般来说都会避免节区运算,这是因为Windows实作出软件的虚拟内存方式,及当程序不执行时候,搬移内存中的程序代码和数据,所以操作绝对地址的方式是很危险的;当程序不执行时,被认为要保持内存区块的“handles”,这样的handles已经非常相当于保护模式的选择子。在保护模式下的Windows 3.0执行一个旧的程序,会触发一个警告对话盒,建议在真实模式下执行Windows(推测还是仍然可以使用扩充内存,可能是在80386机器用EMM386模拟,因此它并不被局限于640KB)或是从厂商那更新到新的版本。好的行为之程序可能可以使用特别的工具来避免这样的对话盒。不可能有些GUI程序在16位保护模式下执行,且其它GUI程序在真实模式执行,可能是因为这会需要两个分开的环境且会依于前面所提到的处理器在两个模式间的乒乓效应。从Windows 3.1版开始,真实模式就消失了。

     

    32位保护模式

    Intel 80386推出后,也许是到目前为止x86架构的最大跃进。除了需要值得注意的Intel 80386SX32位架构但仅只有24位寻址(和16位数据总线)。除此之外其它架构都是32位 - 所有的缓存器指令集、输出输入空间和内存寻址。为了能够在后者所说的功能工作,要使用32位扩充的保护模式。然而不像286、386所有的区段可以使用32位的偏移量,即使内存空间有使用区段,但也允许应用程序存取超过4GB空间而不需要区段的分隔。此外,32位保护模式提供分页的支持,是一种让虚拟内存得以实现的机制。

    没有新的通用缓存器被加入。所有16位缓存器除了区段缓存器外都扩充为32位。Intel在缓存器的助记符号上加入“E”来表示(因此扩充的AX变成EAX,SI变成ESI,依此类推)。因为有更多的缓存器数量、指令、和运算单元,因此机器码的格式也被扩充。为了提供与先前的架构兼容,包含执行码的区段可以被标示为16或是32位的指令集。此外,特殊的前置符号也可以用来在16位的区段包含32位的指令码,反之亦然。

    分页跟区段的内存存取是为了支持现在多任务操作系统所必须要的。Linux386BSDWindows NTWindows 95都是一开始为386所发展,因为它是第一颗提供可靠地程序分离内存空间的支持(每个程序拥有自己的寻址空间)以及可以在必要的情况下打断他们程序的执行(使用ring,一种x86保护模式下权力分级的名称)。这种386的基本架构变成未来所有x86系列发展的基础。

    Intel 80386数学辅助运算处理器也在整合到这个CPU之后的x86系列中,也就是Intel 80486。新的FPU可以帮助浮点数运算,对于科学计算和图形设计是非常重要。

  • 相关阅读:
    JAVA的学习日记15
    JAVA的学习日记14
    CIRD主站与DOPAS构建笔记#1
    信仰之题——Codeforces Round 259(附题面完整翻译)
    平面最近点对问题
    BZOJ4552 [Tjoi2016&Heoi2016]排序
    BZOJ1001 [Beijing2006]狼抓兔子
    (二)k8s编写资源清单
    linux常用搜索工具find/whereis/locate
    解决centos7 的/etc/rc.local不会开机执行
  • 原文地址:https://www.cnblogs.com/loopever/p/2979502.html
Copyright © 2011-2022 走看看