Linux:进程地址空间的简易认识


全文约 2010 字,预计阅读时长: 7分钟


进程地址空间

验证地址空间的基本排布

在这里插入图片描述

  • 代码验证:
#include <stdio.h>
#include <stdlib.h>

int g_unval;
int g_val = 100;


int main(int argc, char *argv[], char *env[])
{
      printf("code addr         : %p\n", main);
    const char *p = "hello bit!";
    printf("read only         : %p\n", p);
    printf("global val        : %p\n", &g_val);
    printf("global uninit val : %p\n", &g_unval);
    char *q1 = (char *)malloc(10);
    char *q2 = (char *)malloc(10);
    char *q3 = (char *)malloc(10);
    char *q4 = (char *)malloc(10);
    printf("heap addr         : %p\n", q1);
    printf("heap addr         : %p\n", q2);
    printf("heap addr         : %p\n", q3);
    printf("heap addr         : %p\n", q4);

    int a = 0;
    static int b = 0;
    int c = 0;
    printf("stack addr        : %p\n", &p);
    printf("stack addr        : %p\n", &a);
    printf("b: stack addr        : %p\n", &b);
    printf("stack addr        : %p\n", &c);

    printf("args addr         : %p\n", argv[0]);
    printf("args addr         : %p\n", argv[argc-1]);

    printf("env  addr         : %p\n", env[0]);

    return 0;
}

址同值不同

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int g_val = 0;
int main()
{
	 pid_t id = fork();
	 if(id < 0){
	 perror("fork");
	 return 0;
	 }
 else if(id == 0){ //child
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
 }else{ //parent
		 printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
 }
		 sleep(1);
 return 0;
}
  • 得到,全局变量地址是相同的值,但看到的变量值是不一样的。

定义

  • 地址空间是进程看待内存的方式,抽象出来的一个概念,内核下是一个结构体。这样每个进程,都认为自己独占系统内存资源。
  • 区域划分:将线性的地址空间或分成位一个个的地址区间【start,end】
  • 虚拟地址:在【start,end】之间的各个地址。
  • 地址空间通过页表在物理内存上进行映射,通过各种倒腾,保证有那么多进程可以运行。相关工作由操作系统完成。
  • 假设某个进程越界访问,则可以通过页表查看该段的读写权限,进行报错中断程序运行。
  • 父子进程一个数据的虚拟地址一样,呈现的数值不一样;是因为子进程的大部分信息,继承自父进程;进程管理这一侧,映射关系没变;但在内存管理那一侧,在物理内存上又开辟了一块儿空间给子进程使用。
    在这里插入图片描述
  • 为什么存在地址空间?
  • 保护物理内存,不受到任何进程内的地址的直接访问,方便合法性校验。
  • 将内存管理和进程管理解耦,内存只需看这块儿空间有没有被人用,不需要关心是谁在用。
  • 让进程,以同样的方式,来看待代码和数据。这个区是代码区,这个区是数据区等等…
  • 因此,一个进程被创建时,都有独自的PCB,进程地址空间、和页表。
    在这里插入图片描述

可执行程序文件 vs 进程地址空间

  • 可执行程序本身,就已经被划分成了一个个的区域;方便模块化加载到内存和库文件的链接。

  • 两者的结构布局相呼应。
    在这里插入图片描述

  • 目标文件链接以后就是可执行;库代码的融合、库数据的融合等。

在这里插入图片描述
在这里插入图片描述


内存管理

在这里插入图片描述

  • 页框(page frame)是一个 内存管理 的概念定义。 是指 CPU 中添加了能自动把 虚拟内存 (即 逻辑地址 )地址转化为 物理内存 地址的电路,为了简化这种电路,就把 RAM 划分为 长度 为4KB或8KB的块。
    在这里插入图片描述

操作系统下的进程与内存管理

在这里插入图片描述
在这里插入图片描述


虚拟内存

在这里插入图片描述

  • 进程中的所有内存访问都是逻辑地址,这些逻辑地址会在运行时动态地转换为物理地址。 这意味着一个进程可被换入或换出内存,因此进程可在执行过程的不同时刻占据内存中的不同区域。
  • 一个进程可划分为许多块(页和段),在执行过程中,这些块不需要连续地位于内存中。动态运行时地址转换和页表或段表的使用使得这一点成为可能。
    在这里插入图片描述
    在这里插入图片描述

参考

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值