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

1|0引言

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

2|0内存分布

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

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

可以看到,Windows 的地址空间被分配给了各种 exe、dll 文件、堆、栈。其中 exe 文件一般位于 0x00400000 起始的地址;一部分 DLL 位于 0x10000000 起始的地址,如运行库 dll;还有一部分 DLL 位于接近 0x80000000 的位置,如系统 dll,Ntdll.dll、Kernel32.dll。 ### 栈 栈的位置则在 0x00030000 和 exe 文件后面都有分布,可能有读者奇怪为什么 Windows 需要这么多栈呢?我们知道,每个线程的栈都是独立的,所以一个进程中有多少个线程,就有多少个对应的栈,对于 Windows 来说,每个线程默认的栈大小是 1MB。

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

3|0地址空间分布

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

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

4|0结束语

当然还是找到了相关资料,不过暂时还是先搞清楚linux平台的
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/kernel/managing-memory-for-drivers


__EOF__

本文作者漫漫程序之路
本文链接https://www.cnblogs.com/still-smile/p/14900474.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Smah  阅读(1366)  评论(0)    收藏  举报
编辑推荐:
· 理解 C# 中的各类指针
· C#多线程编程精要:从用户线程到线程池的效能进化论
· 如何反向绘制出 .NET程序 异步方法调用栈
· 领域驱动设计实战:聚合根设计与领域模型实现
· 突破Excel百万数据导出瓶颈:全链路优化实战指南
阅读排行:
· DeepSeek+Coze实战:从0到1搭建小红书图文改写智能体(喂饭级教程)
· 【SQL周周练】一千条数据需要做一天,怎么用 SQL 处理电表数据(如何动态构造自然月)
· 如何医治一条慢SQL?
· springAI实现一个MCP-Server
· trae开发的win10端口占用检测工具
点击右上角即可分享
微信分享提示