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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章