我爱电脑技术论坛's Archiver

qh78560 发表于 2008-3-28 09:27

程序的内存结构-入门篇

标 题:程序的内存结构-入门篇  6RtDgRq;zy\%dNi hi
作者:xcode-}{2K3E2n!g7k
网站:[url]http://edu.teamsourcing.com.cn[/url]2` yf,r1RE'q"r

/H H*z&\,dk:c#O B:y 如果一个人自称为程序高手,却对内存一无所知,那么我可以告诉你,他一定在吹牛。用C或C++写程序,需要更多地关注内存,这不仅仅是因为内存的分配是否合理直接影响着程序的效率和性能,更为主要的是,当我们操作内存的时候一不小心就会出现问题,而且很多时候,这些问题都是不易发觉的,比如内存泄漏,比如悬挂指针。我们的就从内存开始吧,准备好了吗? Let’s go!
?{j^ us mUE
a[NC&P Win32的可执行文件在加载后,系统将为它建立一个它自己的虚拟内存空间,即进程空间,其容量达4G。这4G的空间划分为了几个区域,对于win98和win2000是不尽相同的。
OT#~ c[$V.L:A+T 内存大小的描述单位是:字节
{J%@ UFi _ f VuCn
1. NULL指针分区是NULL指针的地址范围。
*? H5nE[ [,_3S     对这个区域的读写企图都将引发访问违规。
Y+C;[-I|&OxZ 2. DOS/WIN16分区是98中专门用于16位的vL&W Pa i}
    DOS和windows程序运行的空间,所有的16
5W%sm9^(F:u)N I:Dx     位程序将共享这个4M的空间。Win2000中不
])Ms0]^.G_?q     存在这个分区,16位程序也会拥有自己独立的虚拟地址空间。有的文章中称win2000中不能运行16位程序,是不确切的。
0VMg$}2r!g 3.用户分区是进程的私有领域,Win2000中,程序的可执行代码和其它用户模块均加载在这里,内存映射文件也会加载在这里。Win98中的系统共享DLL和内存映射文件则加载在共享分区中。 eS.|.gMDzg r:Vuz
4.禁止访问分区只有在win2000中有。这个分区是用户分区和内核分区之间的一个隔离带,目的是为了防止用户程序违规访问内核分区。
}/OmB0S&TNc)| 5. MMF分区只有win98中有,所有的内存映射文件和系统共享DLL将加载在这个地址。而2000中则将其加载到用户分区。
b*N G+qza]7q 6. 内核方式分区对用户的程序来说是禁止访问的,操作系统的代码在此。内核对象也驻留在此。
U;u"OL[~ 另外要说明的是,win98中对于内核分区本也应该提供保护的,但遗憾的是并没有做到,因而98中程序可以访问内核分区的地址空间。
X1A]:q1O 对于用户分区,又可以细分成若干区域。(这些区域具体会在第四阶段详细剖析。因为这部分内容牵扯到PE文件结构,只有学习并理解了PE文件结构后,才能理解这部分内容,为了便于后面的讲解,在此讲这部分区域先大致分为4块:)
.vf1I Xk9Q(f Q
Z0Z6u#W!MV s2y'w(H&w2? J'y
更多精彩内容,关注网站:[url]http://edu.teamsourcing.com.cn[/url]

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.