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