ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

(C语言内存十)Windows下C语言程序的内存布局(内存模型)

2021-06-18 17:34:14  阅读:289  来源: 互联网

标签:Windows 程序 地址 dll 2GB 内存 C语言


在32位环境下,Windows 默认会将高地址的 2GB 空间分配给内核(也可以配置为1GB),而将剩下的 2GB 空间分配给用户程序。

不像 Linux,Windows 是闭源的,有版权保护,资料较少,不好深入研究每一个细节,至今仍有一些内部原理不被大家知晓。关于 Windows 地址空间的内存分布,官网上只给出了简单的说明:
对于32位程序,内核占用较高的 2GB,剩下的 2GB 分配给用户程序;
对于64位程序,内核占用最高的 248TB,用户程序占用最低的 8TB。

下图是一个典型的 Windows 32位程序的内存分布:

image
可以看到,Windows 的地址空间被分配给了各种 exe、dll 文件、堆、栈。其中 exe 文件一般位于 0x00400000 起始的地址;一部分 DLL 位于 0x10000000 起始的地址,如运行库 dll;还有一部分 DLL 位于接近 0x80000000 的位置,如系统 dll,Ntdll.dll、Kernel32.dll。

栈的位置则在 0x00030000 和 exe 文件后面都有分布,可能有读者奇怪为什么 Windows 需要这么多栈呢?我们知道,每个线程的栈都是独立的,所以一个进程中有多少个线程,就有多少个对应的栈,对于 Windows 来说,每个线程默认的栈大小是 1MB。

在分配完上面这些地址以后,Windows 的地址空间已经是支离破碎了。当程序向系统申请堆空间时,只好从这些剩下的还有没被占用的地址上分配。

Windows 64位程序的地址空间分布情况如下图所示:

image
由于官方资料不足,我们不再深入讲解 Windows 64 位程序的具体内存分布。

标签:Windows,程序,地址,dll,2GB,内存,C语言
来源: https://www.cnblogs.com/still-smile/p/14900474.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有