Linux进程地址空间

本文探讨了Linux系统中程序和进程的地址空间。程序地址空间包括栈、堆、静态区和代码段,而进程地址空间引入了虚拟地址,用于保护物理内存和数据安全。通过实验展示了父子进程对同一变量的操作,揭示了虚拟地址与物理地址的区别,以及页表在映射中的作用。进程地址空间的存在使得每个进程认为自己独占4GB内存,并简化了内存管理。
摘要由CSDN通过智能技术生成

目录

一、程序地址空间

二、进程地址空间 


一、程序地址空间

        在前面C语言的学习当中,我们理解的内存空间分布如下图所示:

 对该内存空间分布加以说明:

1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行
结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但
是分配的内存容量有限。 栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、
返回地址等。


2. 堆区(heap):一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。分配方式类似于链表。随着区域分配的进行,区域不断从低地址向高地址方向延伸。


3. 数据段(静态区)(static):存放全局变量、静态数据。程序结束后由系统释放。


4. 代码段:运行程序时,代码会加载到该位置,存放函数体(类成员函数和全局函数)的二进制代码。

通过运行如下代码,验证以下上面地址空间的分布:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 int un_init;
  5 int init=10;
  6 
  7 int main()           
  8 {                    
  9   printf("code:%p\n", main);
 10   // 打印正文代码区地址
 11   printf("init:%p\n", &init);
 12   // 初始化数据      
 13   printf("un_init:%p\n", &un_init);
 14   // 未初始化数据    
 15   int *heap1 = (int*)malloc(10);
 16   int *heap2 = (int*)malloc(10);
 17   int *heap3 = (int*)malloc(10);
 18   printf("heap1:%p\n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值