Linux内存管理 一

1.Linux内核为每个进程提供了一个独立的虚拟地址空间,这个虚拟地址空间是连续的。

虚拟地址空间被分为内核空间和用户空间,在32位系统中,虚拟地址空间一共有4GB的大小。内核空间占1G(位于最高处),用户空间占3G。

进程在用户态时只可以访问用户空间,在进入内核态之后才可以访问内核空间内存。每个进程的虚拟地址空间都包含了内核空间,他们对应的是同一块物理内存。

 

一个可执行程序在没用调入内存时存储时分为代码段(.text)、数据段(.data)、为初始化数据段(.bss)

  • .text段  是存放cpu执行的指令代码。通常.text段是共享的,会把局部变量的定义存放在.text中,可执行可读不可写。
  • .data段 存放初始化不为0 的全局变量和静态的局部变量,可读可写不可执行,rodata段也属于data段,存放着常量字符串,只可读不可写  即char *p = "hello"; 修改 *p 会报错。
  • .bss段  存放的数据是为初始化或初始化为0的全局变量和局部变量,可读可写不可执行,在bss存放的数据在程序开始执行以前被初始化为0或NULL

代码区所在的地址空间最低,往上依次是.data,.bss

可执行的程序在运行的时候多出来了两个区域:栈段(Stack) 和  堆段(Heap)

  • Stack 由系统进行开辟和释放,存放函数的参数值和局部变量、临时变量,函数调用的上下文,栈的大小是固定的连续的内存区域从高地址向低地址增长 一般是8MB。
  • Heap 进程运行的时候被动态分配出来的内存,由用户自己管理 申请 malloc() 或者 mmap() 与 释放 free(),由低地址像高地址增长
  • 文件映射段 包括动态库、共享内存。  从高地址像低地址增长
 
#include<stdio.h>
 
int gdata1 = 10;  //.data  
int gdata2 = 0;   //.bss   
int gdata3;       //.bss
static int gdata4 = 20;  //.data
static int gdata5 = 0;   //.bss
static int gdata6;       //.bss
 
int main()
{
    //普通局部变量是指令
	int data7 = 30;  //.text
	int data8 = 0;  //.text
	int data9;      //.text

	static int data10 = 40; //.data
	static int data11 = 0;  //.bss
	static int data12;      //.bss
 
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值