Chinaunix首页 | 论坛 | 博客
  • 博客访问: 607723
  • 博文数量: 72
  • 博客积分: 1177
  • 博客等级: 少尉
  • 技术积分: 856
  • 用 户 组: 普通用户
  • 注册时间: 2011-12-23 23:03
文章分类

全部博文(72)

文章存档

2015年(13)

2014年(5)

2013年(7)

2012年(39)

2011年(8)

分类: WINDOWS

2012-10-12 15:54:27

在保护模式下,cpu寻址与实模式下不同。
实模式下的寻址方式是“段基址+段偏移”,段默认大小为64K,所有段可读/写,唯有代码段是可执行的,段的特权级为0.
而保护模式下内存地址是线性的,段寄存器里面存的不再是段基地址,而是段选择子,此值不直接参加寻址,只是全局描述符(GDT)或本地描述符(LDT)的一个指针,不同段寄存器有不同的属性(读、写、执行、特权级等)。
Win32的平坦内存模式使每个进程拥有赋予自己的虚拟空间,对于32位进程来说,这个地址空间是4GB,因为32位指针可以拥有从0x00000000~0xffffffff之间的任何一个值,此时,程序的代码和数据都放在同一地址空间,不必区分代码段和数据段。
虚拟内存不是真正的内存,它通过映射(Map)的方法,使可用的虚拟地址达到4GB。每个应用程序可以被分配2GB的虚拟地址,剩下2GB留给操作系统自己用。在WindowsNT 应用程序可以有3GB的虚拟地址。
虚拟内存实现方法和过程:
1 当一个应用程序被启动时,操作系统就创建一个新进程,并给每个进程分配2GB的虚拟地址(不是内存,是地址);
2 虚拟内存管理器将应用程序的代码映射到那个应用程序的虚拟地址中的某一个位置,并把当前需要的代码读取到物理地址中,虚拟地址和应用程序代码在物理内存的位置是没有关系的;
3 如果使用动态链接库DLL,DLL也被映射到进程的虚拟地址空间,在需要的时候才被读入物理内存;
4 其他项目(例如数据、堆栈等)的空间是从物理内存中分配的,并映射到虚拟地址空间中;
5 应用程序通过使用它的虚拟地址空间中的地址开始执行,然后虚拟内存管理器把每次的内存访问映射到物理地址。
总的来说,要明白以下几点:
1 应用程序是不会直接访问物理内存的
2 虚拟内存管理器通过虚拟地址的访问请求,控制所有的物理地址访问
3 每个应用程序都有互相独立的4GB的寻址空间,不同应用程序的地址空间是隔离的
4 DLL程序米有自己的“私有”空间,他们总被映射到其他应用程序的地址空间中,作为其他应用程序的一部分运行。
阅读(916) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~