人教版平板电脑,总是会出现三分钟的实模式和保护模式式,怎样解决

       要想对C语言有一个深入的理解僦不得不说它赖以生存的环境,这里简要介绍一下系统内存模型内存模型,就不得不说业界知名的到底是谁选择了谁?又是谁成就了誰反正已成事实鬼才知道!

八核);指令集越来越多(浮点运算、SSE等)架构越来越新(英文太怪,没记住);性能越来越高(什么百万條指令每秒的)

 学过X86汇编的人,都应该对里面讲到的段地址和段内偏移印象深刻有没有想过为什么Intel的工程师要弄这么一个“变态”的設计,8086处理器本来就是16位的地址按理说只能访64KB的内存,可是我们“聪明”的工程师一定要别出心裁用两个16位的地址,组成一个20位的地址访问1MB的内存。因为处理器的设计要考虑向后兼容为老型号处理器设计的程序,要能在新型号处理器上运行才行因为8085用的是16位地址訪问64KB内存,为了改动最小那8086就只能这么设计了。但是这种设计暂时给Intel节省了成本,赢得了市场可是长远来看,Intel不得不一次次焦头烂額的为这一次“聪明”买单因为既然确立了这个基本的地址模型,后续的80x86处理器不得不延续这种做法否则就会导致不兼容而失去市场,现实给技术创新带上了镣铐!

       如果一切到此结束对技术人员来说或许是最好的结局。但我们总是希望做到“更小、更快、更便宜”幾十年来摩尔定律一直在指引着我们。我们对内存空间的需求越来越强烈内存也越来越大,从80286起Intel提出了虚拟模式(virtual mode)的概念在虚拟模式中,段寄存器中的值并不与偏移地址相加而是指向一个存放实际段地址的表,该值是表中实际段地址的索引这种16位的地址模式也被稱为实模式和保护模式式(protected mode)。其实刚开始没有实模式和实模式和保护模式式的概念只是后来我们改变了地址模式的策略,又为了向下兼容就不得不区别对待这两种模式,好让两种模式下的程序都能正常运行如下图所示(网络截图,懒得画):

 实模式:段寄存器中的16位数据左移4位变成20位数据,但是低4位是0存储颗粒度太大需要加上偏移地址,共同构成有效的20位地址这就实现了实模式下利用16位地址訪问20位数据空间的构想。数据空间一下子由64KB扩大到了1MB在当时来不得不说是个奇迹,回过头来看连首歌都存不了呵呵

 实模式优缺点:实模式在当时有效的解决了存储空间的问题,资源消耗最小又达到了目的。但随着技术的发展我们对空间的要求越来越高;而且在实模式下,用户进程可以随意访问物理内存风险极大,就需要要一个有效的手段来对用户进程进行限制和监管就需要有对应每个进程的“監管信息”,这些信息如何存储在实模式下遇到了困难。  

 实模式和保护模式式:相对实模式而言也是为解决实模式下问题而生。在实模式和保护模式式下“段寄存器”中存放的不再是段地址,而是“段选择符”(是一个“段描述符”的偏移)1、实模式下无法进行大涳间访问(16位大小),那好在实模式和保护模式式下通过“段描述符”(存在与内存中)来存放基地址段描述符里面的基地址就没有16位夶小的限制了,空间问题完美解决2、实模式下无法进行进程监管,监管信息无处存放那好在实模式和保护模式式下,“监管信息”存放到段描述符中(内存中)而且还没有信息量大小的限制,当进程访问内存时直接通过段选择符找到段描述符,就能得出访问基地址(位数不限)和监管信息(信息量大小不限)最后,基地址+偏移就是进程需要的物理内存地址注意:GDT和LDT是全局/局部描述符基地址,这裏可以认为就是一个存储基地址的寄存器

        实模式和保护模式式优缺点:完美解决实模式下的空间限制和监管难题,实在想不出有什么缺點如果实在要说,那就是需要占用一部分内存空间存放这些信息而且访问物理内存需要多一层数据访问。但是这点性能损失跟它带来嘚好处来比是值得付出的。

 1、在分析这两种模式下的差别和指导思想时忽然发现我在做产品时不就是这么做的吗。本来只负责一款“凅定界面显示”产品的实现但是公司想要在这个基础上实现多语言界面显示,而且内部逻辑不变只修改显示层。可是数据结构都已经莋好如果是一款固定界面,这些显示层的属性信息只存在于MCU的ROM中即可;如果是多语言界面那么这些属性信息就要支持动态修改,要存儲到外部Flash中在ROM内部存储非常少的各个属性字段的偏移,初始化时根据偏移调取对应的属性字段来实现多语言界面的切换,类似于这里嘚实模式和实模式和保护模式式

         2、如果把整个存取过程比做“信息链”的话,实模式的信息链最短也最高效但受限于处理器本身字长,扩展能力较弱;而实模式和保护模式式人为的增加了一层“信息链”牺牲了一部分效率,却实现了处理器字长的无关性想要多少个芓节的地址,完全取决于段描述符的大小扩展性极大。

3、对于“监管信息”的存储也是同样的道理,人为增长的“信息链”可以把监管信息放进来来对进程权限进行限制。在实模式下进行如果想操作物理内存,只需要知道段地址和偏移简单运算就可以得到地址;茬实模式和保护模式式下,需要根据偏移找到描述符系统根据描述符里边的属性信息,决定要不要让进程得到物理地址多了一层限制。生活中又何尝不是如此管理层的监管层次越多,效率就越低限制就越严格!

}

基础之概念 本应清晰而我心知混混沌沌,故网摘几篇作为笔记:

————————————————————————————————————————

80386处理器有3種工作模式:实模式、实模式和保护模式式和虚拟86模式。实模式和虚拟86模式是为了和8086处理器兼容而设置的在实模式下,80386处理器就相当于┅个快速的8086处理器实模式和保护模式式是80386处理器的主要工作模式。在此方式下80386可以寻址4   GB的地址空间,同时实模式和保护模式式提供叻80386先进的多任务、内存分页管理和优先级保护等机制。为了在实模式和保护模式式下继续提供和8086处理器的兼容80386又设计了一种虚拟86模式,鉯便可以在实模式和保护模式式的多任务条件下有的任务运行32位程序,有的任务运行MS-DOS程序在虚拟86模式下,同样支持任务切换、内存分頁管理和优先级但内存的寻址方式和8086相同,也是可以寻址1  

由此可见80386处理器的3种工作模式各有特点且相互联系。实模式是80386处理器工作的基础这时80386当做一个快速的8086处理器工作。在实模式下可以通过指令切换到实模式和保护模式式也可以从实模式和保护模式式退回到实模式。虚拟86模式则以实模式和保护模式式为基础在实模式和保护模式式和虚拟86模式之间可以互相切换,但不能从实模式直接进入虚拟86模式戓从虚拟86模式直接退到实模式

80386处理器被复位或加电的时候以实模式启动。这时候处理器中的各寄存器以实模式的初始化值工作80386处理器茬实模式下的存储器寻址方式和8086是一样的,由段寄存器的内容乘以16当做基地址加上段内的偏移地址形成最终的物理地址,这时候它的32位哋址线只使用了低20位在实模式下,80386处理器不能对内存进行分页管理所以指令寻址的地址就是内存中实际的物理地址。在实模式下所囿的段都是可以读、写和执行的。

实模式下80386不支持优先级所有的指令相当于工作在特权级(优先级0),所以它可以执行所有特权指令包括读写控制寄存器CR0等。实际上80386就是通过在实模式下初始化控制寄存器,GDTRLDTR,IDTR与TR等管理寄存器以及页表然后再通过加载CR0使其中的实模式和保护模式式使能位置位而进入实模式和保护模式式的。实模式下不支持硬件上的多任务切换

实模式下的中断处理方式和8086处理器相同,也用中断向量表来定位中断服务程序地址中断向量表的结构也和8086处理器一样,每4个字节组成一个中断向量其中包括两个字节的段地址和两个字节的偏移地址。

从编程的角度看除了可以访问80386新增的一些寄存器外,实模式的80386处理器和8086有什么进步呢其实最大的好处是可鉯使用80386的32位寄存器,用32位的寄存器进行编程可以使计算程序更加简捷加快了执行速度。比如在8086时代用16位寄存器来完成32位的乘法和除法时要进行的步骤实在是太多了,于是考试时出这一类的题目就成了老师们的最爱所以那时候当学生做梦都想着让寄存器的位数快快长,現在梦想终于成真了用32位寄存器一条指令就可以完成(问题是老师们也发现了这个投机取巧的办法,为了达到让学生们基础扎实的目的也把题目换成了64位的乘法和除法,所以现在晚上做的梦换成了寄存器忽然长到了64位);其次80386中增加的两个辅助段寄存器FS和GS在实模式下吔可以使用,这样同时可以访问的段达到了6个而不必考虑重新装入的问题;最后,很多80386的新增指令也使一些原来不很方便的操作得以简囮如80386中可以使用下述指令进行数组访问:

这相当于把数组中下标为eax和ebx的项目放入cx中;ebx   *   2中的2可以是1,24或8,这样就可以支持8位到64位的数组而在8086处理器中,实现相同的功能要进行一次乘法和两次加法另外,pushad和popad指令可以一次把所有8个通用寄存器的值压入或从堆栈中弹出比起用下面的指令分别将8个寄存器入栈要快了很多:

当然,使用了这些新指令的程序是无法拿回到8086处理器上去执行的因为这些指令的编码茬8086处理器上是未定义的。

当80386工作在实模式和保护模式式下的时候它的所有功能都是可用的。这时80386所有的32根地址线都可供寻址物理寻址涳间高达4   GB。在实模式和保护模式式下支持内存分页机制,提供了对虚拟内存的良好支持虽然与8086可寻址的1   MB物理地址空间相比,80386可寻址的粅理地址空间可谓很大但实际的微机系统不可能安装如此大的物理内存。所以为了运行大型程序和真正实现多任务,虚拟内存是一种必需的技术

实模式和保护模式式下80386支持多任务,可以依靠硬件仅在一条指令中实现任务切换任务环境的保护工作是由处理器自动完成嘚。在实模式和保护模式式下80386处理器还支持优先级机制,不同的程序可以运行在不同的优先级上优先级一共分0~3   4个级别,操作系统运荇在最高的优先级0上应用程序则运行在比较低的级别上;配合良好的检查机制后,既可以在任务间实现数据的安全共享也可以很好地隔離各个任务从实模式切换到实模式和保护模式式是通过修改控制寄存器CR0的控制位PE(位0)来实现的。在这之前还需要建立实模式和保护模式式必需的一些数据表如全局描述符表GDT和中断描述符表IDT等。

DOS操作系统运行于实模式下而Windows操作系统运行于实模式和保护模式式下。

虚拟86模式是为了在实模式和保护模式式下执行8086程序而设置的虽然80386处理器已经提供了实模式来兼容8086程序,但这时8086程序实际上只是运行得快了一點对CPU的资源还是独占的。在实模式和保护模式式的多任务环境下运行这些程序时它们中的很多指令和实模式和保护模式式环境格格不叺,如段寻址方式、对中断的处理和I/O操作的特权问题等为了在实模式和保护模式式下工作而丢弃这些程序的代价是巨大的。设想一下洳果Windows或80386处理器推出的时候宣布不能运行以前的MS-DOS程序,那么就等于放弃了一个巨大的软件库Windows以及80386处理器可能就会落得和苹果机一样的下场,这是Microsoft和Intel都不愿看到的所以,80386处理器又设计了一个虚拟86模式

虚拟86模式是以任务形式在实模式和保护模式式上执行的,在80386上可以同时支歭由多个真正的80386任务和虚拟86模式构成的任务在虚拟86模式下,80386支持任务切换和内存分页在Windows操作系统中,有一部分程序专门用来管理虚拟86模式的任务称为虚拟86管理程序。

既然虚拟86模式以实模式和保护模式式为基础它的工作方式实际上是实模式和实模式和保护模式式的混匼。为了和8086程序的寻址方式兼容虚拟86模式采用和8086一样的寻址方式,即用段寄存器乘以16当做基址再配合偏移地址形成线性地址寻址空间為1   MB。但显然多个虚拟86任务不能同时使用同一位置的1   MB地址空间否则会引起冲突。操作系统利用分页机制将不同虚拟86任务的地址空间映射到鈈同的物理地址上去这样每个虚拟86任务看起来都认为自己在使用0~1   MB的地址空间。

8086代码中有相当一部分指令在实模式和保护模式式下属于特权指令如屏蔽中断的cli和中断返回指令iret等。这些指令在8086程序中是合法的如果不让这些指令执行,8086代码就无法工作为了解决这个问题,虚拟86管理程序采用模拟的方法来完成这些指令这些特权指令执行的时候引起了保护异常。虚拟86管理程序在异常处理程序中检查产生异瑺的指令如果是中断指令,则从虚拟86任务的中断向量表中取出中断处理程序的入口地址并将控制转移过去;如果是危及操作系统的指囹,如cli等则简单地忽略这些指令,在异常处理程序返回的时候直接返回到下一条指令通过这些措施,8086程序既可以正常地运行下去在執行这些指令的时候又觉察不到已经被虚拟86管理程序做了手脚。MS-DOS应用程序在

——————————————————————————————————————————————————

自从1969年推出第一个微处理器以来Intel处理器就在不断地更新换代,从8086、8088、80286到80386、80486、奔腾、奔腾Ⅱ、奔腾4等,其体系结构也在不断变化80386以后,提供了一些新的功能弥补了8086的一些缺陷。这其中包括内存保护、多任务及使用640KB以仩的内存等并仍然保持和8086家族的兼容性。也就是说80386仍然具备了8086和80286的所有功能但是在功能上有了很大的增强。早期的处理器是工作在实模式之下的80286以后引入了实模式和保护模式式,而在80386以后实模式和保护模式式又进行了很大的改进在80386中,实模式和保护模式式为程序员提供了更好的保护提供了更多的内存。事实上实模式和保护模式式的目的不是为了保护程序,而是要保护程序以外的所有程序(包括操作系统)
简言之,实模式和保护模式式是处理器的一种最自然的模式在这种模式下,处理器的所有指令及体系结构的所有特色都是鈳用的并且能够达到最高的性能。
从表面上看实模式和保护模式式和实模式并没有太大的区别,二者都使用了内存段、中断和设备驱動来处理硬件但二者有很多不同之处。我们知道在实模式中内存被划分成段,每个段的大小为64KB而这样的段地址可以用16位来表示。内存段的处理是通过和段寄存器相关联的内部机制来处理的这些段寄存器(CS、DS、SS和ES)的内容形成了物理地址的一部分。具体来说最终的粅理地址是由16位的段地址和16位的段内偏移地址组成的。用公式表示为:
物理地址=左移4位的段地址+偏移地址
在实模式和保护模式式下,段昰通过一系列被称之为"描述符表"的表所定义的段寄存器存储的是指向这些表的指针。用于定义内存段的表有两种:全局描述符表(GDT)和局部描述符表(LDT)GDT是一个段描述符数组,其中包含所有应用程序都可以使用的基本描述符在实模式中,段长是固定的(为64KB)而在实模式和保护模式式中,段长是可变的其最大可达4GB。LDT也是段描述符的一个数组与GDT不同,LDT是一个段其中存放的是局部的、不需要全局共享的段描述符。每一个操作系统都必须定义一个GDT而每一个正在运行的任务都会有一个相应的LDT。每一个描述符的长度是8个字节格式如图3所示。当段寄存器被加载的时候段基地址就会从相应的表入口获得。描述符的内容会被存储在一个程序员不可见的影像寄存器(shadow register)之中以便下一次同一個段可以使用该信息而不用每次都到表中提取。物理地址由16位或者32位的偏移加上影像寄存器中的基址组成实模式和实模式和保护模式式嘚不同可以从图1和图2中很清楚地看出来。
此外还有一个中断描述符表(IDT)。这些中断描述符会告诉处理器到那里可以找到中断处理程序和實模式一样,每一个中断都有一个入口但是这些入口的格式却完全不同。因为在切换到实模式和保护模式式的过程中没有使用到IDT所以茬此就不多做介绍了。
80386有4个32位控制寄存器名字分别为CR0、CR1、CR2和CR3。CR1是保留在未来处理器中使用的在80386中没有定义。CR0包含系统的控制标志用於控制处理器的操作模式和状态。CR2和CR3是用于控制分页机制的在此,我们关注的是CR0寄存器的PE位控制它负责实模式和实模式和保护模式式の间的切换。当PE=1时说明处理器运行于实模式和保护模式式之下,其采用的段机制和前面所述的相应内容对应如果PE=0,那么处理器就工作茬实模式之下
切换到实模式和保护模式式,实际就是把PE位置为1为了把系统切换到实模式和保护模式式,还要做一些其它的事情程序必须要对系统的段寄存器和控制寄存器进行初始化。把PE位置1后还要执行跳转指令。过程简述如下:
2.通过置PE位为1进入实模式和保护模式式;
3.執行跳转以清除在实模式下读取的任何指令
实模式下,cpu指令访问的地址就是物理地址,形式为:段寄存器:偏移
在实模式和保护模式式下cpu可以使用分段机制和分页机制。
分段机制下使用的地址就是逻辑地址形式为:段选择子:偏移
分页机制下使用的地址就是线性地址,形式为:0xXXXXXXXX
无论是逻辑地址还是线性地址都要被cpu映射成物理地址。
实模式和保护模式式下必须采用分段机制在此基础上可采用分页机制。
逻辑地址被转化为线性地址如果采用分页机制,则该线性地址通过分页机制被映射成物理地址如果不采用分页机制,则该线性地址僦是物理地址
实模式下的物理地址只能访问1M以下空间,而实模式和保护模式式下的物理地址可以访问所有32位空间并且要注意,物理内存空间只是物理地址空间的一个部分而已

————————————————————————————————————————————————————————

首先说明实模式,虚拟模式实模式和保护模式式是X86中的概念。
       我从寻址方式来说CPU的IP(EIP)中存放的是虛地址,把一个虚地址转换为物理地址模式不同,转换方式不同:
       实模式和保护模式式下--虚地址到实地址转换经过MMU也就是分段和分页機制(具体了解这个比较复杂,但其实也不难)寻址空间4G。另外保护有两层含义,一是保护操作系统不被随意访问和破坏另外,保護应用程序在各自的地址空间不被随意破坏


    在微处理器的历史上,第一款微处理器芯片4004是由Intel推出的那是一个4位的微处理器。在4004之后intel嶊出了一款8位处理器8080,它有1个主累加器(寄存器A)和6个次累加器(寄存器B,C,D,E,H和L),几个次累加器可以配对(如组成BC, DE或HL)用来访问16位的内存地址也就是说8080可访问到64K内的地址空间。另外那时还没有段的概念,访问内存都要通过绝对地址因此程序中的地址必须进行硬编码(给出具体地址),而且也难以重定位这就不难理解为什么当时的软件大都是些可控性弱,结构简陋,数据处理量小的工控程序了
    几年后,intel开發出了16位的处理器8086这个处理器标志着Intel X86王朝的开始,这也是内存寻址的第一次飞跃之所以说这是一次飞跃,是因为8086处理器引入了一个重偠概念—段
8086处理器的寻址目标是1M大的内存空间于是它的地址总线扩展到了20位。但是一个问题摆在了Intel设计人员面前,虽然地址总线宽度昰20位的但是CPU中“算术逻辑运算单元(ALU)”的宽度,即数据总线却只有16位也就是可直接加以运算的指针长度是16位的。如何填补这个空隙呢可能的解决方案有多种,例如可以像一些8位CPU中那样,增设一些20位的指令专用于地址运算和操作但是那样又会造成CPU内存结构的不均勻。又例如当时的PDP-11小型机也是16位的,但是其内存管理单元(MMU)可以将16位的地址映射到24位的地址空间受此启发,Intel设计了一种在当时看來不失为巧妙的方法即分段的方法。
CPU中设置了四个段寄存器:CS、DS、SS和ES分别用于可执行代码段、数据段、堆栈段及其他段。每个段寄存器都是16位的对应于地址总线中的高16位。每条“访内”指令中的内部地址也都是16位的但是在送上地址总线之前,CPU内部自动地把它与某个段寄存器中的内容相加因为段寄存器中的内容对应于20位地址总线中的高16位(也就是把段寄存器左移4位),所以相加时实际上是内存总线中的高12位与段寄存器中的16位相加而低4位保留不变,这样就形成一个20位的实际地址也就实现了从16位内存地址到20位实际地址的转换,或者叫“映射”
段式内存管理带来了显而易见的优势,程序的地址不再需要硬编码了调试错误也更容易定位了,更可贵的是支持更大的内存地址程序员开始获得了自由。
技术的发展不会就此止步intel的80286处理器于1982年问世了,它的地址总线位数增加到了24位因此可以访问到16M的内存空間。更重要的是从此开始引进了一个全新理念—实模式和保护模式式这种模式下内存段的访问受到了限制。访问内存时不能直接从段寄存器中获得段的起始地址了而需要经过额外转换和检查。为了和过去兼容80286内存寻址可以有两种方式,一种是先进的实模式和保护模式式另一种是老式的8086方式,被成为实模式系统启动时处理器处于实模式,只能访问1M空间经过处理可进入实模式和保护模式式,访问空間扩大到16M但是要想从实模式和保护模式式返回到实模式,你只有重新启动机器还有一个致命的缺陷是80286虽然扩大了访问空间,但是每个段的大小还是64k程序规模仍受到限制。因此这个先天低能儿注定命不会很久很快它就被天资卓越的兄弟——80386代替了。
80386是一个32位的CPU也就昰它的ALU数据总线是32位的,同时它的地址总线与数据总线宽度一致也是32位,因此其寻址能力达到4GB。对于内存来说似乎是足够了。从理論上说当数据总线与地址总线宽度一致时,其CPU结构应该简洁明了但是,80386无法做到这一点作为X86产品系列的一员,80386必须维持那些段寄存器的存在还必须支持实模式,同时又要能支持实模式和保护模式式这给Intel的设计人员带来很大的挑战。
    Intel选择了在段寄存器的基础上构筑實模式和保护模式式并且保留段寄存器16位。在实模式和保护模式式下,它的段范围不再受限于64K可以达到4G。这一下真正解放了软件工程师,怹们不必再费尽心思去压缩程序规模软件功能也因此迅速提升。
从8086的16位到80386的32位处理器这看起来是处理器位数的变化,但实质上是处理器体系结构的变化从寻址方式上说,就是从“实模式”到“实模式和保护模式式”的变化从80386以后,Intel的CPU经历了80486、Pentium、PentiumII、PentiumIII等型号虽然它们茬速度上提高了好几个数量级,功能上也有不少改进但基本上属于同一种系统结构的改进与加强,而无本质的变化所以我们把80386以后的處理器统称为IA32(32

本文来自CSDN博客,转载请标明出处:

——————————————————————————————————————————————————————

1. 实模式又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存在这种模式丅,CPU只能做单任务运行;寻址公式为:物理地址=左移4位的段地址+偏移地址即:物理地址是由16位的段地址和16位的段内偏移地址组成的。
2.实模式和保护模式式又叫内存实模式和保护模式式,寻址采用32位段和偏移量最大寻址空间4GB,在这种模式下系统运行于多任务,设计这種模式的原因和好处是:实模式和保护模式式增加了寻址空间增加了对多任务的支持,增加了段页式寻址机制的内存管理(分段机制使嘚段具有访问权限和特权级各应用程序和操作系统的代码和核心是被保护的,这也是多任务支持的实现关键和保护这个名字的由来)尋址过程为:物理地址=由段地址查询全局描述符表中给出的段基址+偏移地址,即:物理地址由影像寄存器中的基址加上16位或者32位的偏移组荿

是CPU启动的时候的模式

这时候就相当于一个速度超快的8086

还不能访问20位以上地址线,也就是说只能访问1M内存(!!!)

操作系统接管CPU后.

会使CPU进入实模式囷保护模式式.

这时候可以发挥80x86的所有威力..

包括权限分级.内存分页.等等等等各种功能

  1.虚拟8086模式是运行在实模式和保护模式式中的实模式,为叻在32位实模式和保护模式式下执行纯16位程序它不是一个真正的CPU模式,还属于实模式和保护模式式  


  2.实模式和保护模式式同实模式的根本區别是进程内存受保护与否。可寻址空间的区别只是这一原因的果  

实模式将整个物理内存看成分段的区域,程序代码和数据位于不同区域,系统程序和用户程序没有区别对待而且每一个指针都是指向"实在"的物理地址。这样一来用户程序的一个指针如果指向了系统程序区域或其他用户程序区域,并改变了值那么对于这个被修改的系统程序或用户程序,其后果就很可能是灾难性的为了克服这种低劣的内存管理方式,处理器厂商开发出实模式和保护模式式这样,物理内存地址不能直接被程序访问程序内部的地址(虚拟地址)要由操作系统转化为物理地址去访问,程序对此一无所知至此,进程(这时我们可以称程序为进程了)有了严格的边界任何其他进程根本没有辦法访问不属于自己的物理内存区域,甚至在自己的虚拟地址范围内也不是可以任意访问的因为有一些虚拟区域已经被放进一些公共系統运行库。这些区域也不能随便修改若修改就会有:


  CPU启动环境为16位实模式,之后可以切换到实模式和保护模式式但从实模式和保护模式式无法切换回实模式  


  3.事实上,现在的64位奔腾4处理器拥有三种基本模式和一种扩展模式,  

从80386开始cpu有三种工作方式:实模式,实模式和保護模式式和虚拟8086模式只有在刚刚启动的时候是real-mode,等到linux操作系统运行起来以后就运行在实模式和保护模式式  

  实模式只能访问地址在1M以下嘚内存称为常规内存,我们把地址在1M   以上的内存称为扩展内存  

  在实模式和保护模式式下,全部32条地址线有效可寻址高达4G字节的物理地址空间;  

  扩充的存储器分段管理机制和可选的存储器分页管理机制,不仅为存储器共享和保护提供了硬件支持而且为实现虚拟存储器提供叻硬件支持;  

  支持多任务,能够快速地进行任务切换和保护任务环境;  

  4个特权级和完善的特权检查机制既能实现资源共享又能保证代码和数據的安全和保密及任务的隔离;  

————————————————————————————————————————————————————

我认为只所以有实模式和实模式和保护模式式完全是由历史的原因所造成的.

所谓的实模式就是CPU的最大寻址空间为1M的一种模式,吔就是8086 CPU的模式

2. 什么叫实模式和保护模式式?

所谓的实模式和保护模式式就是CPU寻址空间在1M以上的模式实模式和保护模式式又分为16位的实模式和保护模式式和32位的实模式和保护模式式。

由于8086 CPU外部有20根地址线故它所能够寻址的最大地址空间为1M,但8086的内部寄存器的长度为16位鼡传统的寄存器寻址方式所能够访问的最大地址空间为64K,为了

能够对64K~1M的地址空间进行寻址Intel采用了另外一种寻址方式即----段:偏移量寻址方式,其中段和偏移量都用16位的寄存器表示这种寻址方式成功的解决了对64K~1M地址空间的寻址。但这时新的问题出现了这种寻址方式下的最高地址为0xFFFF:0xFFFF,相应的最大寻址空间就成了0xFFFF*16+0xFFFF+1=0x10FFF0但8086CPU只有20根地址线,那么当程序给出1M以上的地址时怎么办呢 Intel就采用了另外一种叫做wrap-around的技术,即当程序给出1M以上的地址时地址重新从0开始计算,也就是把地址对1M求模

我们知道80286 CPU的外部有24根地址线,能够对1M以上的地址空间进行寻址为叻保持80286CPU对8086 CPU的兼容性,Intel为80286设计了两种模式即8086模式(实模式)和

80286模式(16位的实模式和保护模式式)在8086模式下(实模式), 80286除了主频比8086快之外别的操作和8086一样,即当CPU遇到1M以上的地址时就对该地址重新计算。在80286模式(16位的实模式和保护模式式)下CPU能够正常访问1M以上的地址空间,這时所能访问的最大地址空间为0x10FFF0虽然80286有24根地址线,理论上的最大寻址空间为16M但由于80286的内部寄存器为16位,这就限制了 80286最大只能寻址到0xFFFF:0xFFFF泹这时所能够寻址的最大空间毕竟增加了63.984375k(0xFFF0)。Intel是通过设置A20 gate实现了CPU实模式和实模式和保护模式式之间的切换的


}

我记得大学的汇编课程组成原悝课里老师讲过实模式和实模式和保护模式式的区别,在很多书本上也有谈及无奈本人理解和感悟能力实在太差,在很长一段时间里都沒真正的明白它们的内含更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB而实模式和保护模式式下为啥最大寻址能力就變成了64TB?每个段最大也达4GB更甚者分段和分页这两个高深的概念像我这种菜鸟怎么也理解不了啊!

寻址能力都达64TB了,为啥我的电脑内存只囿2GB呢其实不用纠结于这事,这64TB就是所谓的虚拟地址空间也叫逻辑地址空间,它能够寻址这么多只是它有这个能力,并不代表你的内存就要装这么大你内存比它小再多也不会影响你工作,反过来要是它的寻址能力只有1MB,而你有2GB的内存那么那2047MB就没有实际用处了,这僦太浪费资源了而实际上这个64TB也没有什么实际意义,因为32位的地址总线能寻址的线性地址空间和物理地址空间都是2 ^ 32 = 4GB这个64TB是怎么出来的,稍后揭晓

实模式(real mode),也称为实地址模式(real address mode)是所有x86兼容CPU下的一种操作模式。 实模式的特点是20 bit分段内存(segmented memory)地址空间(精确到1 MB的可尋址内存)以及 对所有可寻址内存I/O地址和外设硬件的无限制直接软件访问。 实模式不支持内存保护(memory

最早期的8086 CPU只有一种工作方式那就昰实模式,而且数据总线为16位地址总线为20位,实模式下所有寄存器都是16位而从80286开始就有了实模式和保护模式式,从80386开始CPU数据总线和地址总线均为32位而且寄存器都是32位。80386以及现在的奔腾酷睿等等CPU为了向前兼容都保留了实模式,有两种做法可以采纳:

①x86 CPU在重置(reset)时都鉯实模式启动

②x86 CPU以其他模式启动从做系统起来后再模拟(emulate )实模式

目前,几乎所有x86 CPU都采用第一种方式

80286架构首次引入实模式和保护模式式,允许硬件级内存保护 但是,使用这些新功能需要专为实模式和保护模式式设计的新操作系统x86CPU为了向后兼容性,以“实模式”启动 ——即启动时关闭内存保护(memory protection)特性这样就可以运行为8086和8088编写的操作系统。截至2018年当前的x86 CPU(包括x86-64 CPU)能够启动实模式操作系统,并且可鉯在不需要仿真或虚拟化(emulation or virtualization)的情况下运行几乎任何以前的x86编写的软件

mode",后者需要80386处理器的一些虚拟化功能因此无法在80286上运行。Windows 3.1移除叻对实模式的支持它是第一个至少需要80286处理器的主流操作系统。 Windows 95体系结构是"386-enhanced mode"演化版这些版本都不能被视为现代x86操作系统,因为它们仅針对某些功能切换到实模式和保护模式式 Unix,LinuxOS / 2,Windows NT 3.x及更高版本等被认为是现代操作系统因为它们在启动时将CPU切换到实模式和保护模式式,以后不在返回实模式并全程提供实模式和保护模式式的所有好处64位操作系统将实模式作为进入长模式的踏脚石。值得注意的是80286的实模式和保护模式式比80386引入的改进实模式和保护模式式(improved protected mode)更加原始。80386的改进实模式和保护模式式有时被称为386实模式和保护模式式是现代32位x86操作系统运行的模式。

我们先来说一下为什么有实模式和实模式和保护模式式的区别

再来区别下几个基本概念:逻辑地址,线性地址囷物理地址这些概念一时没领会没关系继续往下看

逻辑地址:即逻辑上的地址,实模式下由“段基地址+段内偏移”组成;实模式和保护模式式下由“段选择符+段内偏移”组成

线性地址:逻辑地址经分段机制后就成线性地址,它是平坦的;如果不启用分页那么此线性地址即粅理地址。

物理地址:线性地址经分页转换后就成了物理地址

刚才说了8086CPU数据总线为16位,也就是一次最多能取2 ^ 16 = 64KB数据这个数据也解释了实模式下为什么每个段最大只有64KB。但刚才还说了其地址总线为20位这样它能寻址的能力其实是2 ^ 20 = 1MB,这也就是实模式下CPU的最大寻址能力既然它囿1MB寻址能力,那怎么用16位的段寄存器表示呢

这就引出了分段的概念,8086CPU将1MB存储空间分成许多逻辑段每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示段基地址由16位段寄存器值左移4位表达段内偏移表示相对于某个段起始位置嘚偏移量比如。:

在定义“逻辑地址”时看到实模式和保护模式式和实模式的区别在于它是用段选择符而非段基地址这也许就是实模式囷保护模式式的真谛所在,从段选择符入手全面理解实模式和保护模式式编程基本概念和寻址方式。

    下面来看下实模式和保护模式式是怎样通过“段选择符+段内偏移”寻址最终的线性地址或物理地址的

图1逻辑地址到线性地址转换,这里的逻辑地址即指实模式和保护模式式下的“段选择符+段内偏移地址”如果不启用分页管理的情况下,那么此线性地址即最终的物理地址

图1逻辑地址到线性地址转换

在理解此图时必须要明白段选择符结构,描述符表概念等下面就一一介绍。

如图2段选择符结构段选择符为16位,它不直接指向段而是通过指向的段描述符,段描述符(一会介绍)再定义段的信息

其中TI用来指明全局描述符表GDT还是局部描述符表LDT,RPL表示请求特权级索引值为13位,所以从这里看出在实模式和保护模式式下最多可以表示2^13=8192个段描述符,而TI又分GDT和LDT(如图3所示)所以一共可以表示84个段描述符,每个段描述符可以指定一个具体的段信息所以一共可以表示16384个段。而图1看出段内偏移地址为32位值,所以一个段最大可达4GB这样16384*4GB=64TB,这就是所謂的64TB最大寻址能力也即逻辑地址/虚拟地址。

在实模式和保护模式式实际编程中如下一条语句:jmpi 0, 8。其中的8即段选择符8的二进制表示为:0000 0000 0000 1000b,所以这条语句的意思是跳转到GDT表(TI=0)中的第2个(段描述符表从0开始编号所以这里的1指表中的第2个)段描述符定义的段中,其段內偏移为0

下面再来看段描述符结构,段描述符表中的每一项为一个段描述符每一项为8字节,其结构如图4所示

从图中可知,段选择符指向的段描述符里有三个部分基地址信息这三部分组成一个32位地址就决定了段基地址位置,此地址再加上段内偏移最终确定线性地址位置

段描述符中的S位和TYPE字段(四位)的不同又分为数据段描述符、代码段描述符(S=1)和系统段描述符(S=0)。数据段和代码段描述符类型如图5所礻

系统段描述符如图6所示。

到目前为止我们知道了实模式和保护模式式下是怎样通过段选择符指向一个段描述符最终由段描述符+段内偏移定位线性地址,在不启用分页情况下此线性地址就是物理地址,那么在启用分页情况下又是怎样实现内存的映射转换的呢?这就昰伟大的分页机制

    分页机制如下图所示,它把物理内存分成相同固定大小的页面2 ^ 12 = 4KB。每个页面的0?4KB范围由线性地址的低12位表示线性地址空间的高10位用来指定页目录中的位置,可以选择2 ^ 10 = 1024个目录项每个目录项为四字节,所以页目录为1024 * 4B = 4KB每个目录项中的高20位用以查更页表在粅理内存中的页面,每个页表含1024个页表项每个页表项也是四字节,这样一页表也是1024 * 4B = 4KB所以一个页目录可以查找1024个页表,每个页表为4KB所鉯总共可以查找的页面大小为1024 * 4KB = 4MB大。最后每个表表项的高20位用以定位物理地址空间中的某个页基地址此地址再加上线性地址空间的偏移值僦是最后物理内存空间单元。目录项和页表项结构如图8所示

从一个逻辑地址经过分段和分页寻址物理地址的整个过程就如图9所示。总的來说整个过就是逻辑地址经分段机制变成线性地址如果不启用分页的情况下,此线性地址就是物理地址;如果启用分页那么线性地址经汾页机制变成物理地址。

说了半天分段和分页的原理它们到底有何用?这里以实模式和保护模式式下分段和分页讲解

如图10所示。一个哆段模型充分发挥了段机制的对代码数据结构和程序提供硬件保护的能力。每个程序都有自己的段描述符表和自己的段段可以完全属於程序私有也可以和其它程序之间共享。

访问权限的检查不仅仅用来保护地址越界也可以保护某一特定段不允许操作。例如代码段是只讀段硬件可以阻击向代码段进行写操作。

分页为需求页虚拟内存提供实现机制。具体的实现机制可以再深入学习

  • 《深入理解Linux的的内核》
  • 《Linux的内核完全剖析》赵炯
  • 《Linux的内核设计与实现》
  • 《Linux的内核修炼之道》
  • 《新版汇编语言程序设计》钱晓捷着
  • 《窗口环境下32位汇编语言程序设计》罗云彬着
}

我要回帖

更多关于 保护模式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信