进程虚拟地址空间的分配以及内容

环境:linux,32位操作系统

首先虚拟空间的作用:为了防止恶意的程序修改其它程序的内存数据,因此引入了虚拟空间。

大家可以这样理解:如果我们把一个进程也就是一个程序直接引入内存,那么别的恶意程序可以通过指针的偏移来恶意修改别的程序,这就造成了不安全,引入虚拟地址空间后每个程序有属于自己的虚拟地址空间,那么偏移也不会影响其它的程序。

虚拟地址空间的大小:每当一个进程运行就会开辟一个2^32次方(也就是4G)的虚拟地址空间。

所谓的虚拟和物理可以这样解释:

这个东西存在,你也看得见就是物理的。

这个东西存在,但你看不见的就是透明的。

这个东西不存在,你却能看见的就是虚拟的。

这个东西不存在,你也看不见那就是被删除了。

综上所述,所以这个虚拟地址空间是不存在的,不要把它想成真实存在的物理地址空间。

下面看一下虚拟地址空间的分布:

大家可以看到User Space也就是用户空间它占3G的大小,Kernel Space内核空间它占的大小是1G,所以用户和内核的所占比重就是3:1,这是默认的,我们也可以通过修改操作系统配置来改变这个比例。

每个进程的用户空间是私有的,但是内核空间是共有的。

先给大家介绍用户空间User Space(从上向下介绍):

首先就是0x00000000到0x08048000总共有128M大小的保留区,这个保留区是无法访问的,里面存放的是库文件

.txt段:这里面存放的是一些指令

.data:存放的是数据,是已经初始化,但是初始化不为0的数据。

.bss:存放的也是数据,是没有初始化的数据。当我们只定义一个变量没有给他初始化,当代码执行时内核会将这里面的数据全部初始化为0。也就是经常说的0初始化

.heap(堆):经常用力动态开辟内存的区域。调用new和malloc才会分配堆内存。

共享库:程序运行后会加载共享库,在windows里面是.dll文件,linux下是.so文件

.stack(栈):函数运行时每个线程独有的一个栈空间。每个进程独有的,先进后出,从下往上增长。

命令行参数和环境变量:包含程序运行时搜索头文件和库文件的路径和命令。

以上就是用户空间的划分和内容,然后介绍一下内核空间的划分和内容:

ZONE_DMA:直接访问内存区,即获得数据不经过寄存器。

ZONE_NORMAL:常用访问区,内核空间的线程,栈空间,PCB块,虚拟空间的映射关系,大小为了892M。

ZONE_HIGHMEM:高端内存区,常用来访问大文件(超过1G)使用

以上就是针对虚拟地址空间的解释已经划分

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值