【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系

这篇具有很好参考价值的文章主要介绍了【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

=========================================================================

个人主页点击直达:小白不是程序媛

Linux专栏:Linux系统化学习

代码仓库:Gitee

=========================================================================

目录

虚拟地址和物理地址

页表

进程地址空间

进程地址空间存在的意义


虚拟地址和物理地址

我们在学习C/C++的时候肯定都见过下面这张有关于内存分布的图片:

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间

在来段代码理解感受下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 //未初始化常量
  4 int un_gval;
  5 //初始化常量
  6 int init_gval=100;
  7 int main()
  8 {
  9     //代码区地址
 10     printf("code addr: %p\n",main);
 11     //字符常量
 12    const char *str="hellolinux!";
 13 
 14     //常量区地址
 15     printf("read only char addr : %p\n",str);
 16     //已初始化全局数据区
 17     printf("init global value addr: %p\n",&init_gval);
 18     //未初始化全局数据区
 19     printf("uninit global value addr: %p\n",&un_gval);
 20 
 21     char *heap1=(char*)malloc(100);
 22     char *heap2=(char*)malloc(100);
 23     char *heap3=(char*)malloc(100);
 24     char *heap4=(char*)malloc(100);
 25     static int a=0;
 26     printf("heap1 addr:%p\n",heap1);                                                                                                                                                                    
 27     printf("heap2 addr:%p\n",heap2);
 28     printf("heap3 addr:%p\n",heap3);
 29     printf("heap4 addr:%p\n",heap4);
 30 
 31     printf("stack addr:%p\n",&str);
 32     printf("stack addr:%p\n",&heap1);
 33     printf("stack addr:%p\n",&heap2);
 34     printf("stack addr:%p\n",&heap3);
 35     printf("stack addr:%p\n",&heap4);
 36     printf("a addr:%p\n",&a);
 37 
 38     return 0;
 39 }

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间

通过上面这段代码,我们好像不仅验证了上面的空间分布图片,而且还发现了栈区和堆区相向而生的内存开辟特点。

上两篇文章我们介绍了命令行参数和环境变量,其实这两个就储存在栈区之上的空间,来段代码验证下:

    1 #include<stdio.h>
W>  2 int main(int argc , char *argv[], char *env[])
    3 {
    4     int i=0;
    5     printf("i addr:%p\n",&i);                              
    6     for(;argv[i];i++)
    7     {
    8         printf("argv[%d]:%p\n",i,argv[i]);
    9     }
   10     for(i=0;env[i];i++)
   11     {
   12         printf("env[%d]:%p\n",i,env[i]);
   13     }
   14     return 0;
   15 }
  ~

 【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间

验证完这些,话说回来其实我们之前学的对内存的概念就上面所介绍的内容其实都不是真正意义上的内存是虚拟内存,不是我们真正意义上的内存物理地址。

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<stdlib.h>                                                                                                                                                                     
  4 int g_val = 100;
  5 
  6 int main()
  7 {
  8     pid_t id = fork();
  9     if(id == 0)
 10     {
 11         //child
 12         int cnt = 5;
 13         while(1)
 14         {
 15             printf("child, Pid: %d, Ppid: %d, g_val: %d, &g_val=%p\n", getpid(), getppid(), g_val, &g_val);
 16             sleep(1);
 17             if(cnt == 0)
 18             {
 19                 g_val=200;
 20                printf("child change g_val: 100->200\n");
 21             }
 22             cnt--;
 23         }
 24     }
 25     else
 26     {
 27         //father
 28         while(1)
 29         {
 30             printf("father, Pid: %d, Ppid: %d, g_val: %d, &g_val=%p\n", getpid(), getppid(), g_val, &g_val);
 31             sleep(1);
 32         }
 33     }
 34 
 35     sleep(100);
 36     return 0;
 37 }

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间

我们发现,父子进程,输出地址是一致的,但是变量内容不一样!能得出如下结论:

  • 变量内容不一样,所以父子进程输出的变量绝对不是同一个变量 
  • 但地址值是一样的,说明,该地址绝对不是物理地址!
  • 在Linux地址下,这种地址叫做 虚拟地址
  • 我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理OS必须负责将 虚拟地址 转化成 物理地址 

我们再将同一个可执行程序同时运行也会发现两个进程的获取到的地址竟然也是一样的。

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间 话又说回来,我们的可执行程序运行时肯定会加载到内存中,因此虚拟地址和物理地址一定有关联,这个关联就是页表


页表

页表就是将虚拟地址和物理地址联系起来的一种模型,其中还包括变量是否可以被修改,进程的状态等诸多信息。

【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系,Linux系统化学习,学习,linux,运维,服务器,进程,进程地址空间

上面的图就足矣说名问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址!

每个进程的页表的物理地址存在与CPU中CR3的寄存器中


进程地址空间

进程地址空间其实我们可以使用内存大小的一个范围,以我们32位总线的机器为例:它的范围为0000 0000 -> ffff ffff ,也就是0到2^32次方(我们所谓的4GB)。模拟其物理空间大小进行区域划分后形成栈区、堆区等等的虚拟地址,操作系统通过结构体将每个区域的起始和结束统计记录起来,进程的PCB中含有指向这个结构体的指针。

因此,每当新的进程创建时会形成对应的PCB,PCB和PCB中的虚拟地址结构体指针和页表关联起来,对真正上的物理地址进行使用。 


进程地址空间存在的意义

  • 让进程以统一的视角看待内存,所以任意一个进程,可以通过地址空间和页表可以将乱序的内存数据,变成有序,分门别类的规划好
  • 存在虚拟地址空间,可以有效的进行进程访问内存的安全检查
  • 将进程管理和内存管理进行解耦,通过页表让进程映射到不同的物理内存处,从而实现进程的独立性。

今天对Linux下进程地址空间的介绍分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法。您三连的支持就是我前进的动力,感谢大家的支持!!!文章来源地址https://www.toymoban.com/news/detail-752820.html

到了这里,关于【Linux系统化学习】进程地址空间 | 虚拟地址和物理地址的关系的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 不碎片化学习,尽量用整块的时间系统化学习

    从高中毕业之后,我们好像就很难再继续那种系统化的学习,甚至失去了自我知识构建的能力。然而,真正的理解和掌握知识需要深入和连贯,这正是系统化学习的优势所在。 系统化学习的重要性 全面理解 :系统化学习能够帮助我们全面理解知识的来龙去脉,而不仅仅是零

    2024年04月25日
    浏览(32)
  • 【软件测试】测试经验:IT 软件测试技术系统化学习方法

    目录 一、IT 软件测试技术的介绍 (1)相关职称证书 ① 「中级」软件评测师 ②「高级」项目管理师 (2)背景 (3)作用  (4)行业应用  (5)技术概况  二、系统化学习的前置准备 (1)学习目标 (2)学习计划  (3)学习工具 (4)学习资料 三、系统化学习软件测试技

    2024年02月11日
    浏览(56)
  • 【Linux从入门到精通】进程地址空间(虚拟地址 vs 物理地址)

         本篇文章会围绕 三个问题(什么是地址空间?地址空间是如何设计的?为什么要有地址空间?) 进行展开讲述。其中主要是了解虚拟地址和物理地址的区别。希望本篇文章会对你有所帮助。 文章目录 一、什么是地址空间? 1、1 验证地址空间 1、2 地址空间是指的物理

    2024年02月10日
    浏览(96)
  • 【Linux-14】进程地址空间&虚拟空间&页表——原理&知识点详解

    前言 大家好吖,欢迎来到 YY 滴 系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁 主要内容含: 欢迎订阅 YY 滴C++专栏!更多干货持续更新!以下是传送门! YY的《C++》专栏 YY的《C++11》专栏 YY的《Linux》专栏 YY的《数据结构》专栏 YY的《C语言基础》专栏 YY的《初学者易

    2024年04月29日
    浏览(51)
  • 【看表情包学Linux】进程地址空间 | 区域和页表 | 虚拟地址空间 | 初识写时拷贝

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 💭 写在前面: 本章核心主题为 \\\"进程地址空间\\\",会通过验证 Linux 进程的地址空间来开头,抛出 \\\"同一个值能有不同内容\\\" 的现象,通过该现象去推导出 \\\"虚拟地址\\\" 的概念。然后带着大家理解为什么虚拟地

    2024年01月20日
    浏览(61)
  • [Linux]环境变量 进程地址空间(虚拟内存与物理内存的关系)

    hello,大家好,这里是bang_bang,今天我们来讲一下语言层级上的程序地址空间和系统层级上的进程地址空间的区别,在下面中我举的例子会设计到环境变量,所以开篇我先讲讲环境变量。 目录 1️⃣环境变量 🍙 基本概念 🍙环境变量相关命令 🍥查看环境变量echo 🍥添加全局环

    2024年02月15日
    浏览(55)
  • 为什么要学中文编程?它能有哪些益处?免费版编程工具怎么下载?系统化的编程教程课程怎么学习

    图下图是编程工具界面,其构件板构件非常丰富。想学编程,可以点击最下方卡片—— 软件下载——免费自由版软件下载及教程,了解详细资讯。  编程系统化教程视频课程总目录 链接,点击下方链接进入 https://jywxz.blog.csdn.net/article/details/134073098?spm=1001.2014.3001.5502 https://

    2024年02月05日
    浏览(63)
  • 【Linux】进程理解与学习Ⅳ-进程地址空间

    环境:centos7.6,腾讯云服务器 Linux文章都放在了专栏:【 Linux 】欢迎支持订阅 🌹 相关文章推荐: 【Linux】冯.诺依曼体系结构与操作系统 【Linux】进程理解与学习Ⅰ-进程概念 浅谈Linux下的shell--BASH 【Linux】进程理解与学习Ⅱ-进程状态 【Linux】进程理解与学习Ⅲ-环境变量 在

    2023年04月14日
    浏览(80)
  • 【C语言】函数的系统化精讲(一)

    🔍个人主页 : @啊森要自信的主页 🌈作者寄语 🌈: 小菜鸟的力量不在于它的体型,而在于它内心的勇气和无限的潜能,只要你有决心,就没有什么事情是不可能的。 欢迎大家关注🔍点赞👍收藏⭐️留言📝希望看完我的文章对你有小小的帮助,如有错误,可以指出,让我

    2024年02月05日
    浏览(56)
  • C语言系统化精讲(一):编程基础

    本文是正式进入C语言学习的一道「开胃小菜」,并没有涉及具体的语法,目的是让读者对编程的基本知识有所了解,并且告诉读者如何少走弯路。大家在阅读本文教程的时候请放松心情,不用死记硬背,理解即可。 参考文章:https://blog.csdn.net/xw1680/article/details/132596122 我们平

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包