详解实模式,保护模式,虚拟8086模式
- 格式:pdf
- 大小:1.65 MB
- 文档页数:20
内存寻址的三种模型1. 地址的种类首先明确一下逻辑地址和线性地址这两个概念:1. 逻辑地址2. 线性地址3. 物理地址1.1 逻辑地址:逻辑地址是编译器生成的,我们使用在linux环境下,使用C语言指针时,指针的值就是逻辑地址。
对于每个进程而言,他们都有一样的进程地址空间,类似的逻辑地址,甚至很可能相同。
1.2 线性地址:线性地址是由分段机制将逻辑地址转化而来的,如果没有分段机制作用,那么程序的逻辑地址就是线性地址了。
1.3 物理地址物理地址是CPU在地址总线上发出的电平信号,要得到物理地址,必须要将逻辑地址经过分段,分页等机制转化而来。
2. 三种寻址模型x86体系结构下,使用的较多的内存寻址模型主要有三种:1. 实模式扁平模型real mode flat model2. 实模式分段模型real mode segment model3. 保护模式扁平模型protected mode flat model下面是对这三种模型的描述实模式和保护模式相对,实模式运行于20位地址总线,保护模式则启用了32位地址总线,地址使用的是虚拟地址,引入了描述符表;虽然二者都引入了段这样一个概念,但是实模式的段是64KB固定大小,只有16KB个不同的段,CS,DS等存储的是段的序号(想想为什么?)。
保护模式则引入了GDT和LDT段描述符表的数据结构来定义每个段。
扁平模型和分段模型相对,区别在于程序的线性地址是共享一个地址空间还是需要分成多个段,即为多个程序同时运行在同一个CS,DS的范围内还是每个程序都拥有自己的CS,DS:前者(flat)指令的逻辑地址要形成线性地址,不需要切换CS,DS;后者的逻辑地址,必须要经过段选择子去查找段描述符,切换CS,DS,才能形成线性地址。
3. 实模式扁平模型该模式只有在386及更高的处理器中才能出现!80386的实模式,就是指CPU可用的地址线只有20位,能寻址0~1MB的地址空间。
简述x86cpu运行的4个级别x86CPU是一种基于Intel架构的CPU,它是目前世界上最广泛使用的CPU之一。
x86 CPU运行时会经过4个不同的级别,这些级别分别是用户态、内核态、超级用户态和虚拟8086模式。
本文将详细介绍这4个级别的含义和作用。
一、用户态用户态是指CPU在执行用户程序时所处的状态。
在用户态下,CPU 只能访问用户程序所占用的内存空间,不能访问操作系统内核的内存空间。
这是为了保护操作系统内核不受用户程序的干扰。
用户程序可以使用CPU提供的一些指令和功能,但是不能直接访问硬件资源,必须通过操作系统提供的系统调用来实现。
在用户态下,CPU的权限较低,只能执行受限制的指令和操作。
二、内核态内核态是指CPU在执行操作系统内核代码时所处的状态。
在内核态下,CPU可以访问系统的所有资源,可以执行所有指令和操作。
操作系统内核可以直接访问硬件资源,控制系统的各种设备和资源。
在内核态下,CPU的权限最高,可以执行任何指令和操作。
操作系统内核通常使用特权级别0来表示内核态。
三、超级用户态超级用户态是指CPU在执行特权级别大于0但小于3的代码时所处的状态。
在超级用户态下,CPU可以访问一些受保护的资源,如I/O 端口和DMA控制器等。
超级用户态通常用于执行一些需要较高权限的操作,如设备驱动程序的编写和调试等。
超级用户态的权限介于用户态和内核态之间,不同的操作系统有不同的实现方式。
四、虚拟8086模式虚拟8086模式是一种特殊的模式,它允许在保护模式下运行16位的MS-DOS应用程序。
在虚拟8086模式下,CPU会将当前的代码段和数据段设置为16位模式,并且可以访问整个1MB的内存空间。
虚拟8086模式可以通过软件模拟来实现,也可以通过硬件支持来实现。
总结以上就是x86 CPU运行的4个级别,它们分别是用户态、内核态、超级用户态和虚拟8086模式。
每个级别都有不同的权限和作用,它们共同构成了x86 CPU的运行机制。
微机原理之保护模式和虚拟内存学了半年的微机原理,对CPU的设计理论即思路有了一定的了解,深刻的体会到了这些最初设计者的高明之处先说说CPU的工作模式一般来说,80x86(80386及其后的各代CPU)可在实模式,保护模式和V86模式三种模式下运转。
实模式就是古老的MS-DOS的运行环境。
Windows 9x只利用了保护模式和V86模式。
在保护模式下程序可以利用更多的内存(4GB),而运行在实模式下的16位程序最多只能取1MB的内存(看出差别了吧,O(∩_∩)O)。
如果你有一台128MB内存的机器运行在实模式下,那么只能利用1MB内存,其余的全部浪费了。
在这种情况下,你的386/486/586/PII/PIII只能相当于一个跑的快的8086。
v86则类似于实模式,可以调用BIOS, 但他能否调DOS功能,要看操作系统有没有模拟DOS. 比如说,NT里面16位程序可以正常使用DOS功能,因为NT提供了DOS模拟。
可Linux里面16位程序只能用BIOS,没有DOS给他用。
理论上,在保护模式下,一个程序可以寻址4096(4GB)的内存。
这就是说,只需要把程序编译成32为的可执行程序(当然要借助32为编译器),你就可以在程序中充分利用内存了。
从硬件结构上说,386由三个寄存器CR0,CR1,CR2控制着CPU的运转。
比如说,CR0的第0位就是用来判断当前CPU的工作模式还是实模式。
我们知道8086/8088中有8个通用寄存器AX 、BX、CX、DX、SI、DI、SP、BP这些寄存器都是16位的;在80386中这些寄存器都被扩展到了32为,即EAX、EBX、ECX、EDX、ESI、EDI、ESP、EBP,段寄存器增加了两个FS和GS; 如果CPU运转在实模式下,只能利用这些32为寄存器的前(低)16位,而后(高)16位就浪费了。
段的概念是理解保护模式的关键所在。
在实模式下,段寄存器中存放16位的段地址,这时段地址是参与寻址的;把段地址左移4位,加上偏移地址,就是20为的物理地址(嘿嘿,我们计算时就是把段地址加上个0,如CS:IP=1030:0010 则计算方法就是1030H--->10300H,加上偏移地址0010H,结果就是10310H就是20位物理地址)。
什么叫实模式,什么叫保护模式?概念……没背过特点……DOS就是实模式的,现在的Winows、Unix之类东西都是保护模式的。
实模式下只能访问那可怜的1M内存,要想突破这个限制,麻烦得很,你还记得DOS下那一堆什么XMS (扩充内存)、EMS(扩展内存)吧?本来是连续的64M内存,在DOS下访问,还得调用什么中断,好麻烦。
Watcom C++之所以当时有些名气就是占了这个便宜,说集成开发环境,那和BC是没法比,但就因为它提供了DOS4GW支持,可以很方便的是你的程序在DOS访问4G 内存,写32位的程序。
至于保护模式,特性挺多,如线性地址、虚拟内存、权限保护之类的东西都是CPU提供的功能,为开发现代操作系统提供了很多便利。
x86CPU在初始化的时候都是先进入实模式,然后操作系统再切换到保护模式。
详情你找本书看看吧。
有一本《386保护模式编程》你可以看看,写得挺多。
dos下内存是很简单的,指针指向的几乎就是实际的物理地址。
实模式的指针是16bit的,就是直接访问的内存是640k,640k~1M之间的内存是通过中断把页切换到640k里读写完之后又Move到640k以外的。
Dos4GW又提供了别的中断来访问1M~8M以外的内存。
你理解在操作系统限制的时候做这些突破是多么“技巧”的一个年代吧。
其实386已经支持32位指针了,这时又引入了GDT,LDT等概念。
怎么说呢....靠,这样吧,比如你有一大衣柜(GDT),有无数的小抽屉(LDT)。
这个抽屉是你的,那个是你MM的,你MM翻你的抽屉就会发现套套,你翻你MM的抽屉会发现情书...所以要保护!《386保护模式编程》书我看问题的追溯到8086/8088在80866/88时代,地址线只有20条,只能寻址到1M8086采用段式存储管理,每个段最多寻址64k ,原因:指针是16bit的到80286是地址线达到32条,可以寻址到4G的虚拟空间此时提出了保护模式可采用分页式存储管理,以寻址到4G的空间现在的操作系统都是基于80286的保护模式区别与8086提供的实地址方式简介(转)这篇文章将会着重介绍内存寻址的不同方法。
80386学习(⼀)80386CPU介绍⼀.80386CPU介绍 Inter80386CPU是Inter公司于1985年推出的第⼀款32位80x86系列的微处理器。
80386的数据总线是32位的,其地址总线也是32位,因⽽最⼤可寻址4GB的存储空间。
80386作为x86系列CPU的⼀员,保持着对更早⽣产的x86CPU的向前兼容。
80386在当时主要为⽀持⾼性能的应⽤领域和多⽤户、多任务操作系统⽽设计,提供了硬件级的特权级保护、多任务切换、内存分页等功能。
80386有三种运⾏模式:实模式、保护模式和虚拟8086模式。
在实模式下,80386和8086的⾏为保持⼀致,只能访问20位(1M)的地址空间,内部实际32位的寄存器也只有低16位有效。
实模式主要是为了兼容运⾏在8086CPU上的程序,所以80386加电后,默认就运⾏在实模式下。
要想充分发挥80386的对于多任务的⽀持功能,需要使80386进⼊保护模式。
保护模式是80286以及后续的x86CPU都具有的⼀种⼯作模式。
保护模式下的80386内存寻址范围达到了硬件设计的上限:2^32byte,即4GB。
保护模式提供了诸如内存保护、内存分页机制以及硬件虚拟存储管理等功能,为多⽤户。
多任务的⾼效、可靠、安全的操作系统实现提供了良好的⽀持。
因此,主流的现代操作系统例如Linux、Windows(Windows95及以后)其内核均运⾏在x86的保护模式之上。
虚拟8086模式的⼯作模式介于实模式和保护模式之间,虚拟8086⽀持多任务、内存分页等功能。
但运⾏的每⼀个独⽴任务均处于实模式之下。
虚拟8086这⼀模式由于其中庸性,应⽤范围相对较⼩。
⼆.80386对于8086的主要改进 80386能够兼容的运⾏之前在8086、80286CPU上运⾏的程序,但80386⽐起16位的8086CPU⽆论是性能还是功能上都有质的提升。
性能⽅⾯的主要改进:更宽的数据总线和地址总线 扩展到32位的地址总线使得80386能够访问更⼤的地址空间,同时32位的数据总线⽐起8086的16位也增加了数据的传输速度。
CPU的主频,即CPU内核工作的时钟频率(CPU Clock Speed)。
通常所说的某某CPU是多少兆赫的,而这个多少兆赫就是“CPU的主频”。
很多人认为CPU的主频就是其运行速度,其实不然。
CPU的主频表示在CPU内数字脉冲信号震荡的速度,与CPU实际的运算能力并没有直接关系。
主频和实际的运算速度存在一定的关系,但目前还没有一个确定的公式能够定量两者的数值关系,因为CPU的运算速度还要看CPU的流水线的各方面的性能指标(缓存、指令集,CPU的位数等等)。
由于主频并不直接代表运算速度,所以在一定情况下,很可能会出现主频较高的CPU实际运算速度较低的现象。
比如AMD公司的AthlonXP系列CPU大多都能以较低的主频,达到英特尔公司的Pentium 4系列CPU较高主频的CPU性能,所以AthlonXP系列CPU才以PR值的方式来命名。
因此主频仅是CPU性能表现的一个方面,而不代表CPU的整体性能。
CPU的主频不代表CPU的速度,但提高主频对于提高CPU运算速度却是至关重要的。
举个例子来说,假设某个CPU在一个时钟周期内执行一条运算指令,那么当CPU运行在100MHz 主频时,将比它运行在50MHz主频时速度快一倍。
因为100MHz的时钟周期比50MHz的时钟周期占用时间减少了一半,也就是工作在100MHz主频的CPU执行一条运算指令所需时间仅为10ns比工作在50MHz主频时的20ns缩短了一半,自然运算速度也就快了一倍。
只不过电脑的整体运行速度不仅取决于CPU运算速度,还与其它各分系统的运行情况有关,只有在提高主频的同时,各分系统运行速度和各分系统之间的数据传输速度都能得到提高后,电脑整体的运行速度才能真正得到提高。
提高CPU工作主频主要受到生产工艺的限制。
由于CPU是在半导体硅片上制造的,在硅片上的元件之间需要导线进行联接,由于在高频状态下要求导线越细越短越好,这样才能减小导线分布电容等杂散干扰以保证CPU运算正确。