当前位置:网站首页>进程虚拟地址空间区域划分
进程虚拟地址空间区域划分
2022-04-23 12:44:00 【刚入门的代码spa技师】
进程虚拟地址空间区域划分
在我们用一门语言写一个程序,会产生两种东西:指令和数据。在我们进行编译链接后,生成一个可执行文件存放在我们的磁盘上,运行这个程序时,会把这个程序加载到内存中。
而在加载的过程中,把可执行文件的哪些内容加载到了内存?加载到内存当中是如何存放的?分为哪些区域?具体如何划分?
在此之前我们需要知道,程序不可能直接加载到物理内存!
下面以X86 32位Linux环境下为例进行分析。
在程序执行时,Linux系统会给当前进程分配一个2^32(4G)大小的一块空间,这块空间就是进程的虚拟地址空间,其中拥有进程要用的所有资源,所有资源构成了状态的划分。
这块空间默认被划分成两个部分:用户空间和内核空间,用户空间默认占3G大小的空间,内核空间默认大小为1G。
系统中所有进程都有一个地址空间。
在用户空间中,系统并不是从0地址(0x00000000)开始存放资源,在0x00000000 到 0x08048000 这段内存是不能被访问的,所以在对空指针解引用时程序会崩溃。
接下来的内存段存放的是 .text 段和 .rodata 段。.text 段存放的是指令,.rodata 段存放的是只读数据,例如程序中定义的字符串常量 char* str = "hello world";
,这两段的资源都是只读资源,在我们试图修改这两段的数据时,程序会直接崩掉。
接下来存放的是 .data 段和 .bss 段,.data 段存放的是已初始化且值不为0的全局变量和静态变量,而 .bss 段存放的是未初始化或初始化为0的全局变量和静态变量。
紧跟着的是 .heap堆内存段,程序动态申请的空间都在这段内存。
如果程序链接了动态库,在堆内存后的这段内存用于加载共享库。
再往下就是函数运行、或开辟线程时的 stack 栈空间,和其他内存段不一样,栈空间的增长方向和其他段是相反的,从高地址向低地址增长。
最后的内存段存放的是命令行参数和环境变量。
截取自《深入了解计算机系统》。
每个进程的用户空间是私有的,但内核空间是共享的!
版权声明
本文为[刚入门的代码spa技师]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_43973403/article/details/124356715
边栏推荐
- Redis deployment of cloud native kubesphere
- uni-app 原生APP-云打包集成极光推送(JG-JPUSH)详细教程
- QT one process runs another
- Lesson 26 static member functions of classes
- A graphic designer's fantasy world | ones characters
- A graphic designer's fantasy world | ones characters
- 标签与路径
- 31岁才转行程序员,目前34了,我来说说我的经历和一些感受吧...
- box-sizing
- Web17——EL与JSTL的使用
猜你喜欢
风尚云网学习-input属性总结
QT draw text
Try the server for one month for free, and attach the tutorial
【vulnhub靶场】-dc2
Qt绘制文字
免费试用一个月的服务器,并附上教程
How to solve the computer system card?
Fashion cloud learning - input attribute summary
Please help me see what this is, mysql5 5. Thanks
NPDP | how can product managers not be excluded by programmers?
随机推荐
实现一个盒子在父盒子中水平垂直居中的几种“姿势”
BUUCTF WEB [GXYCTF2019]禁止套娃
PHP generates JSON to process Chinese
No idle servers? Import OVF image to quickly experience smartx super fusion community version
在线计算过往日期天数,计算活了多少天
Object. The disorder of key value array after keys
【蓝桥杯】4月17日省赛刷题训练(前3道题)
Keyword interpretation and some APIs in RT thread
Stm32cubeprogrammer basic instructions
STM32CubeProgrammer基础使用说明
Uni app native app local packaging integrated Aurora push (jg-jpush) detailed tutorial
传统企业如何应对数字化转型?这些书给你答案
Hard core parsing promise object (do you know these seven common APIs and seven key questions?)
How does sqlserver insert or update the number of weeks of the day instead of text
Please help me see what this is, mysql5 5. Thanks
I changed to a programmer at the age of 31. Now I'm 34. Let me talk about my experience and some feelings
Qt绘制文字
bert-base-chinese下载(智取)
消息队列概述
21 天学习MongoDB笔记