进程内存组织

进程内存组织

对32位操作系统而言,寻址空间(或者叫线性地址空间)为4G(2的32次方),也就是说一个进程的最大地址空间为4G。为了保证内核的安全,现在的操作系统一般都强制用户进程不能直接操作内核。具体的实现方式基本都是由操作系统将虚拟地址空间划分为两部分,一部分为内核空间,另一部分为用户空间。针对Linux操作系统而言,最高的1G字节(从虚拟地址0xC000 0000到0xFFFF FFFF)由内核使用,称为内核空间。而较低的3G字节(从虚拟地址0x0000 0000到0xBFFF FFFF)由各个进程使用,称为用户空间。

在高级语言中,面对的是变量、函数、表达式和语句等语言元素,而在进程的内存空间中,所有的高级语言信息都转化成二进制形式。
用户空间:
在32位的Linux系统中,进程拥有4GB的线性空间。其中高1GB的地址空间分配给操作系统的内核,剩余的3G地址空间称为用户空间,用于存放进程的用户级代码和数据。在用户空间中,最关键的部分为代码段、数据段、堆和栈。
在这里插入图片描述
代码段:
代码段是用来存放可执行文件的操作指令,是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只准许读取操作,而不允许写入修改操作。代码段通常是指用来存放程序执行代码的一块内存区域。代码段(.text)保存进程的二进制代码,其中CPU的程序计数器pc指针就是指向代码段区的某条指令的起始地址。程序执行时,pc指针在代码段内移动。
数据段:
数据段用来存放可执行文件中已初始化的全局变量,即存放程序静态分配的变量和全局变量,数据段(.data)保存进程的静态数据,比如全局变量、常量字符串等。
进程空间中的堆:
堆是用于存放进程运行中被动态分配的内存段,大小不固定,可动态扩张或收缩。保存程序运行时状态分配的数据所在的地址空间。C语言的malloc和free操作的内存便是堆的内存。当堆空间不足时,操作系统会自动增加堆的大小,堆的地址空间是向高地址方向增长的(它不是数据结构中的意义上的堆)。堆的内存空间是由程序申请的,并由程序负责释放。
进程空间中的栈:
栈又称堆栈,栈是用户存方程序临时创建的局部变量,也就是括弧"{}"中定义的变量,不包括static声明的变量。进程空间的栈由操作系统分配,内存的申请与回收都由OS管理。栈是用户和数据结构理论的栈原理相似,满足先进后出的原则。CPU的栈指针寄存器esp总是指向栈顶位置。当数据入栈时,esp减小,但数据出栈时,esp增加。

相关链接:
https://www.cnblogs.com/xingmuxin/p/10967548.html

参考资料:
范志东 张琼声《自己动手构造编译系统》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值