C++ | 4G虚拟地址空间布局

最近复习到C++的虚拟地址空间布局,这是之前学习过的内容,但是有些忘记了。

画图了解一下吧,图像便于记忆!(这里借用舍友饭_团画的图,博主已经在小本本上画过了,大家也要自己画一下。)

虚拟内存,顾名思义,是虚拟的内存,不是真实存在的内存。操作系统给每个进程分配了4G的虚拟内存,而不是内存。也就是说程序运行时,操作系统先将相关的文件和数据从磁盘上读取,再通过地址映射到虚拟内存上,内存通过和虚拟内存与物理内存之间的映射关系获取当下进程需要的文件和数据。

4G的虚拟内存,分为3G的用户空间和1G的内核空间。这1G的内核空间实际是每个进程所共享的,但是在该进程自己看来,仿佛是独属于自己的。

3G的用户空间:

(1)在地址为 0x0000 0000 到 0x0804 8000 的位置称为保留区,大小为128M,是不可访问区。地址 0x0000 0000 不能访问,即不可读不可写。

(2).text 段存放指令,区域的大小在程序执行前已经确认,可能包含一些只读的常数变量,如字符串常量。

(3).data段存放已初始化数据段的全局变量和静态变量(static修饰的变量)。

(4).bss段存放未初始化以及初始化为0的全局变量和静态变量,在程序加载的时候由内核清0(.bss段实际上是不存在的,系统采用预留的方式以节省空间,因为它的值为0,给它分配空间没有实际意义)

(5)heap 为堆区,是由用户自己管理,先进先出,动态分配内存malloc、ralloc、calloc 是在堆区进行,通过 free() 函数释放空间。开辟内存:低地址 --> 高地址。 

(6)共享库:加载共享库和使用mmap共享内存。

(7)stack 为栈区,是由系统管理,先进后出,保存局部变量、函数形参、自动变量。开辟内存:高地址 --> 低地址

(8)命令行参数:C语言中的命令行参数涉及到程序的主函数 main(int argc,char *argv[]),argc表示命令行参数的个数,无需用户传递,自动确定;argv[] 指向命令行传递进来的参数,其中argv[0]指向的是可执行文件的文件名。

(9)环境变量:int execve(char *pathname,char *argv[],char *envp),其中char *envp 即环境变量,它包含一个或许多应用程序所使用到的配置信息

1G的内核空间:

从地址 0xc000 0000 到 0xFFFF FFFF 的系统区域是直接内存访问区,分为常用部分区域和高端内存区域。

DMA区(ZONE_DMA):(16M)直接内存访问区

普通区  (ZONE_NORMAL):(892M)常用区域,映射页目录、页表

高端内存区(ZONE_HIGHMEM):(128M)主要为大于1G文件作映射

内存分配方式:

(1) 从静态存储区域分配 。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量、static 变量 。

(2) 在栈区分配:相关代码执行时创建,执行结束时被自动释放。局部变量在此存储。栈内存分配运算内置于处理器的指令集中,效率高,但容量有限。

(3)在堆区分配:动态分配内存。用new/malloc时开辟,delete/free时释放。生存期由用户指定,灵活。但有内存泄露等问题。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值