Linux - 进程的虚拟地址空间

Linux - 进程的虚拟地址空间:
在这里插入图片描述

进程的概念

进程: 就是正在执行的程序代码的实时结果。
按照自己的理解的话就是:
它是一次程序的执行过程,包含但不局限于可执行的程序代码以及其他程序执行所需的资源。

进程与程序

程序:静态 预先编译好的指令和数据的集合 # 菜谱
进程:动态 程序运行的过程 # 炒菜的过程

虚拟地址空间

  • 当创建一个进程时,操作系统(Linux)会为该进程分配一个4GB大小的虚拟地址空间。
  • 之所以是 4GB,是因为在32位的操作系统上,一个指针的长度是 4字节,而 4字节指针的寻址能力是从0x00000000 ~ 0xFFFFFFFF,最大值 0xFFFFFFFF 表示的即是4GB的大小。

分布如下:
在这里插入图片描述

相关部分的解释:

  • 1、内核空间:
    • 内核空间在内存中,是操作系统的一部分,内核空间为内核所留,他不允许应用程序读写该区域或者直接调用内核代码的函数。
  • 2、命令行参数和环境变量
    • 环境变量和命令行参数都是一组字符串,环境变量是操作系统传递给进程的一组字符串信息。命令行参数列表是由 char **argv 指向,字符串个数由 int argc 指明,它们就是 main 函数的两个参数,还有一个全局变量 char **envp 它指向环境表(环境字符串的集合)并以NULL空串结尾,只是我们习惯省略这些,所以我们常写的 int main() 其实是:int main(int argc,char *argv[ ],char *envp[ ])
  • 3、
    • 栈,又称堆栈,由编译器自动分配释放,行为类似于数据结构中的栈,有先进后出的特性。栈的三个用途:
    • (1)为函数内部的非静态局部变量开辟存储空间。
    • (2)记录函数调用过程中相关信息,包括函数返回地址,不适合装入寄存器的函数参数和一些寄存器的保存。
    • (3)保存程序的当前状态。
  • 4、
    • 堆是由程序员手动完成申请和释放的,像 malloc()new(),如果在程序结束之后程序员没有手动释放,将由系统进行回收释放,当然,这只是以防万一的情况,如果用 malloc 申请空间,就用 free 释放, 如果用 new 申请,就用 delete 释放。其实堆方式并不像数据结构中的堆的实现方式,更像数据结构中的链表的实现方式。堆的特点就是动态分配内存,它是从低地址向高地址申请空间,是不连续的内存区域,可读可写可执行,堆的大小受限于计算机的虚拟内存,一般在开头的一字节存放的是堆的大小。
    • malloc 底层的实现中,当我们申请128K以下的内存是用 brk 来申请,由 malloc 来管理,所以当我们 free 之后,他并不会把内存交回给内核而不是 malloc,所以我们还是通过指针访问到这块内存。这样效率就会比较高。
  • 5、加载共享库(动态链接库)
    • Linux下叫共享库;Windows下叫做动态库。
    • *.dll 是Windows上动态库的形式;
    • ==*.so==是Linux上动态库的形式。
  • 6、.bss
    • 存储 未经初始化 或者 初始化的值为0 的数据(全局变量和静态变量)。
  • 7、.data
    • 存储 已经初始化且初始化的值不为0 的数据(非零静态局部变量和全局变量)。
    • 它的属性是可读可写不可执行。在data段上面有一个rodata段(rodata段的位置在.o文件时去观察它是在.bss段的下方),它的属性是只可读。
      data可分为读写(RW)区域和只读(RO)区域。
      RW—只读数据段是程序使用的一些不会被更改的数据,因此只需要放置在只读存储器中即可。
      RO—已初始化数据是在程序中声明,并且具有初值的变量,这些变量需要占用存储器的空间,在程序执行时它们需要位于可读写的内存区域内,并具有初值,以供程序运行时读写。
  • 8、.text
    • text段也被称为代码段,里边保存的是程序文本(程序执行代码),同时也可能会包含一些常量(如一些字符串常量等),指令指针EIP就是指向代码段,它的权限是刻度可执行不可写。该段内存为静态分配,这些内存同时也是共享的,比如说有多个相同进程存在时,公用一个text段。

参考资料

【1】Robert Love . Linux内核设计与实现 . 北京:机械工业出版社,2011:3.
【2】Hi—zkr . 虚拟地址空间 . CSDN . 2018 . 03 . 07
【3】岳飞刺秦王 . 进程的虚拟地址空间 . CSDN . 2019 . 08 . 05

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值