程序的内存布局篇

声明:此文是博主拜读《程序员自我修养》一书的笔记,一切版权属于原作者。

链接:http://blog.csdn.net/ningxialieri/article/details/8836570

    对于一个32 bits的操作系统来说,其内存空间拥有4G(2的32次方)的寻址能力。假如说,这个内存空间是一个统一的地址空间,用户可以使用一个32位的指针访问任意内存位置。例如:

    int  *p = (int *)0x12345678;

    ++*p;

    这段代码使用指针直接读写指定地址的内存数据。但是,实际上内存仍然在不同的地址区间上有着不同的地位,例如,大部分操作系统都会把4G的内存空间中的一部分挪给内核使用,应用程序就无法使用分配给内核的内存。这部分属于内核的内存地址被称为内核空间。Linux默认情况下将高地址的1G空间分配给内核。用户使用的剩下的3G内存空间称为用户空间。在用户空间里,也有许多地址区间有特殊地位。主要有————栈、堆(平时说的堆栈就是指堆)、可执行文件映像、保留区。


栈————栈用于维护函数调用的上下文,离开了栈函数就没法实现。栈通常在用户空间的最高地址处分配,通常有数兆字节的大小。一般来说,程序员不能主动来操作栈,是系统自己分配访问的。


堆————堆是用来容纳应用程序动态分配的内存区域,当程序使用malloc或new分配内存时,得到的内存来自堆里。堆通常存在于栈的下方(低地址方向),在某些时候,堆也可能没有固定统一的存储区域。堆一般比栈大很多,可以有几十兆或者几百兆字节的容量。一般来说,程序员就可以用系统函(如malloc()/new)来手动分配。


可执行文件映像————这里存储着可执行文件在内存里的映像,由装载器在装载时将可执行文件的内存读取或映射到这里。


保留区————保留区并不是一个单一的存储区域,而是对在内存中受到保护而禁止访问的内存区域的总称。例如,大多数操作系统里,,极小的地址通常都是不允许访问的,如NULL。通常C语言将无效指针赋值为0也是出于这个考虑,因为0地址上正常情况下不可能有有效的可访问数据。

 

                                                                                                                          

                                                                                        



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值