微机原理之保护模式 和虚拟内存

学了半年的微机原理,对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位物理地址)。 然而在保护模式下,段寄存器中存放着16位的段选择器(Segment Selector),这个值不是直接的参与寻址的,而只是一个指向段描述表(Segment Descriptor Table)的索引。段描述表中存放着段描述符(Segment Descriptor)。段描述符中有关于段的描述,比如段在内存中的位置,段的大小,段的类型(是数据段还是代码段)等。

在此顺便说一下虚拟内存

虚拟内存(Virtual Memory)顾名思义不是真正的内存,它只是通过映射(Map)的方法,使用的虚拟地址(Virtual Address),能达到4GB(2的32次方,呵呵,结合上面介绍的知道为什么在386中会有更大的‘内存’空间了吧)。而每个程序都可以被分配2GB的虚拟地址,剩下的2GB也就留给了操作系统使用(而这些空间是不允许用户程序去访问,使用的从而保证了系统的安全性)。在Windows NT中,应用程序可有3GB的Virtual Address。

简单的说说虚拟内存的实现方法和过程:

(1)、当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配2GB的Virtual Address(not Memory);

(2)、虚拟内存管理器(Virtual Memory Manager)应将程序的代码(code)映射(map) 到那个应用程序的虚拟地址中的某个位置,把当前所需要的代码读到物理地址中(注意:虚拟地址和应用程序代码在物理内存中的位置是没有关系的);

(3)、如果使用动态链接库(Dynamic-Link Library,即DLL),DLL也被映射到进程的虚拟地址空间,在需要时才被读入物理内存。(而根据动态链接库的调用方式,即静态调用,动态调用的方式不同,他们被映射的方式也不尽相同。静态调用时每一个动态调用都会被当做程序的部分代码而映射在代码区,占用空间较大;而动态调用只是被映射一次,只是在需要时才进行调用);

(4)、其他项目(如数据,堆栈等)的空间是从物理内存中分配的,并被映射到虚拟地址空间中;

(5)、应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理位置;

呵呵,对于虚拟内存应该有个大体了解了吧,O(∩_∩)O 总之有这么两点:

一是应用程序是不会直接访问物理地址的;

二是虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问。

虚拟内存的使用,简化了内存的管理,并可弥补物理内存的不足;可以防止多任务(Multitasking)环境下各个应用程序之间的冲突。

你可能感兴趣的:(内存)