Linux 第十八章

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,linux

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

程序地址空间

区间的地址分布

真正理解同一个地址进行读取不同内容

地址空间

虚拟地址和物理地址

虚拟地址:

物理地址:

struct mm_struct

页表


程序地址空间

区间的地址分布

[BCH@hcss-ecs-6176 10_21]$ cat test.c
#include<stdio.h>
#include<stdlib.h>
int un_gval;
int init_gval=100;
int main(int argc,char* argv[],char* env[])
{
        printf("code addr:%p\n",main);//代表代码区的地址
        const char *str="hello linux";
        printf("read only char addr:%p\n",str);//代表字符常量取得地址
        printf("init global value addr:%p\n",&init_gval);//代表初始化全局数据区
        printf("uninit global value addr:%p\n",&un_gval);//代表未初始化全局数据区
        char* heap1=(char*)malloc(100);
        printf("heap addr:%p\n",heap1);//代表堆区的地址
        printf("stack addr:%p\n",&str);//代表栈区的地址


        int i=0;
        for(;argv[i];i++)
        {
                printf("argv[%d]:%p\n",i,argv[i]);
        }


        for(i=0;env[i];i++)
        {
                printf("env[%d]:%p\n",i,env[i]);
        }
        return 0;
}

结果:
[BCH@hcss-ecs-6176 10_21]$ ./mytest
code addr:0x40057d
read only char addr:0x40077e
init global value addr:0x60103c
uninit global value addr:0x601044
heap addr:0x1c9d010
stack addr:0x7ffdc6730228
argv[0]:0x7ffdc67307fd
env[0]:0x7ffdc6730806
env[1]:0x7ffdc6730819
env[2]:0x7ffdc6730830
env[3]:0x7ffdc673083b
env[4]:0x7ffdc673084b
env[5]:0x7ffdc673085a
env[6]:0x7ffdc673087e
env[7]:0x7ffdc673088f
env[8]:0x7ffdc673089c
env[9]:0x7ffdc67308af
env[10]:0x7ffdc67308b8
env[11]:0x7ffdc6730e54
env[12]:0x7ffdc6730e82
env[13]:0x7ffdc6730e9b
env[14]:0x7ffdc6730ef5
env[15]:0x7ffdc6730f09
env[16]:0x7ffdc6730f1a
env[17]:0x7ffdc6730f31
env[18]:0x7ffdc6730f39
env[19]:0x7ffdc6730f48
env[20]:0x7ffdc6730f54
env[21]:0x7ffdc6730f88
env[22]:0x7ffdc6730fab
env[23]:0x7ffdc6730fca
env[24]:0x7ffdc6730fe4

真正理解同一个地址进行读取不同内容

[BCH@hcss-ecs-6176 10_21]$ cat test.c
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int g_val=100;
int main()
{
        pid_t id =fork();//创建子进程
        if(id==0)
        {
                //child
                int cnt=5;
                while(1)
                {
                        printf("pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
                        sleep(1);
                        if(cnt==0)
                        {
                                g_val=200;
                                printf("child change g_val:100->200\n");
                        }
                        cnt--;
                }
        }
        else
        {
                //parent
                while(1)
                {
                        printf("pid:%d,ppid:%d,g_val:%d,&g_val:%p\n",getpid(),getppid(),g_val,&g_val);
                        sleep(1);
                }
        }
        return 0;
}




[BCH@hcss-ecs-6176 10_21]$ ./mytest
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
pid:29920,ppid:29919,g_val:100,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c
child change g_val:100->200
pid:29920,ppid:29919,g_val:200,&g_val:0x60105c//子进程的值是200,地址0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c//父进程的是100,地址0x60105c
pid:29920,ppid:29919,g_val:200,&g_val:0x60105c
pid:29919,ppid:7584,g_val:100,&g_val:0x60105c

得出的结论是:我们C/C++看到的地址,绝对不是物理地址!!!

我们平时用的地址都是虚拟地址/线性地址!!

地址空间

每一个进程运行之后,都会有一个进程地址空间存在!!

就可以解释fork之后形成了父进程和子进程

返回给父进程的id是子进程的pid,返回给子进程的是0

因为,父进程有自己的虚拟地址空间,给id在栈区开辟一个空间,然后通过页表实现虚拟地址映射物理地址,id的存储在内存中

子进程继承父进程,拷贝父进程的地址空间和页表,但是页表上虚拟地址映射物理地址不同,id在子进程虚拟地址和id在父进程虚拟地址是相同的,而映射的物理地址是不同的,所以内存中又会开辟空间去存储在子进程中的id

虚拟地址和物理地址

在 Linux 中,虚拟地址和物理地址是计算机系统中重要的概念,特别是在操作系统和硬件之间的交互中。

虚拟地址:

虚拟地址是由 CPU 生成的地址空间中的地址,它是进程所见到的地址。每个进程都有自己的虚拟地址空间,通常是连续的地址空间,从 0 开始。
虚拟地址提供了一种抽象机制,使得每个进程都认为它在独占系统资源,而不必担心与其他进程的冲突。
虚拟地址的转换是由硬件中的内存管理单元(MMU)来完成的。MMU 根据页面表(Page Table)将虚拟地址映射到物理地址。

物理地址:

物理地址是实际存在于计算机系统中的内存单元的地址,它是 RAM 中存储数据的位置。
物理地址是实际用于访问计算机系统中内存模块的地址。
虚拟地址通过地址映射机制转换为物理地址,然后在物理地址上进行访问和操作。
在 Linux 中,虚拟地址和物理地址的管理是由操作系统负责的。操作系统通过分页机制将进程的虚拟地址映射到物理地址,从而实现了内存管理和进程间的隔离。

struct mm_struct

虚拟地址空间也要被OS管理起来!!每一个进程都要有地址空间,系统中,一定要对地址空间做管理!!,地址空间最终一定是一个内核的数据结构对象!

在linux中,这个进程/虚拟地址空间的东西,叫做:struct mm_struct

Struct mm_struct
{
    Long code_start;
    Long code_end;
    Long data_start;
    Long data_end;
    Long heap_start;
    Long heap_end;
    Long stack_start;
    Long stack_end;
    …...
}

页表

总结:

1)每一个进程都是有页表的

2)如何理解切换:只要把上下文数据保存好,pcb、地址空间、页表就保存好了

3)让进程以统一的视角看待内存,所以一个进程,可以通过地址空间+页表可以将乱序的内存数据,变成有序,分门别类的规划好!无序变有序

4)页表还有访问权限字段这就是为什么常量字符串,不可被修改,就是由于对应的内存访问权限是只读的

5)存在虚拟地址空间,可以有效的进行进程内存的安全检查!

6)将进程管理和内存管理进行结耦,通过页表,让进程映射到不同的物理内存处,从而实现进程独立性

CPU中的CR3寄存器

存储当前进程的页目录表物理地址。当CPU从虚拟地址空间中访问内存时,会首先将虚拟地址通过分页机制翻译为物理地址,而这个翻译过程需要使用到页表。

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/589349.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一周零碎时间练习微服务(nacos,rq,springcloud,es等)内容

目录 1 总览1.1 技术架构1.2 其他1.2.1 数据库1.2.2 后端部分1.2.2.1 复习feign1.2.2.2 复习下网关网关的核心功能特性&#xff1a;网关路由的流程断言工厂过滤器工厂全局过滤器 过滤器执行顺序解决跨域问题 1.2.2.3 es部分复习 1.2.3 前端部分 2 day1 配置网关2.1 任务2.2 网关…

UI-Diffuser——使用生成性人工智能的UI原型设计

概述。 移动UI是影响参与度的一个重要因素&#xff0c;例如用户对应用的熟悉程度和使用的便利性。如果你有一个类似的应用程序&#xff0c;你可能会选择一个具有现代、好看的设计的应用程序&#xff0c;而不是一个旧的设计。然而&#xff0c;要从头开始研究什么样的UI最适合应…

JavaEE >> Spring MVC(1)

MVC MVC&#xff1a;Model View Controller 的缩写&#xff0c;是一种软件架构模式&#xff0c;将软件系统分为模型、视图和控制器三个部分。 Mode&#xff08;模型&#xff09;&#xff1a;是应⽤程序中⽤于处理应⽤程序数据逻辑的部分。通常模型对象负责在数据库中存取数据…

【通信中间件】Fdbus HelloWorld实例

Fdbus实例教程 Fdbus简介 Fdbus 全称 Fast Distributed Bus&#xff08;高速分布式总线&#xff09;&#xff0c;提供IPCRPC功能。适用于多种OS&#xff1a; LinuxQNXAnroidOSWindow Fdbus本质是Socket&#xff0c;IPC基于Unix domain socket&#xff0c;RPC基于TCP。使用G…

CAMEL:大型语言模型社会的“心智”探索沟通代理

英文名称: CAMEL: Communicative Agents for “Mind” Exploration of Large Language Model Society 中文名称: CAMEL&#xff1a;大型语言模型社会的“心智”探索沟通代理 链接: https://arxiv.org/pdf/2303.17760.pdf 代码: https://github.com/camel-ai/camel 4.4K Star 作…

Scala应用 —— JDBC的创建

文章目录 Scala应用 —— JDBC的创建前言一、JDBC的创建过程1.初始化连接1.1 配置驱动1.2 创建连接对象 2. 初始化执行器2.1 创建执行器对象2.2 初始化执行器参数 3. 执行操作并返回结果 二、Scala JDBC的基本设计思路1. 操作步骤设计2. 解决结果差异化3.实现jdbc方法并输出结果…

53.HarmonyOS鸿蒙系统 App(ArkTS) socket套接字连接失败无效参数--invalid argument

ark ts socket套接字连接失败无效参数--invalid argument 绑定本机真实连接的WIFI的IP&#xff0c;不要绑定127.0.0.1

云原生Kubernetes: K8S 1.29版本 部署Harbor

目录 一、实验 1.环境 2.Linux 部署docker compose 3.证书秘钥配置 4.K8S 1.29版本 部署Harbor 5.K8S 1.29版本 使用Harbor 二、问题 1.docker 登录harbor失败 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构版本IP备注masterK8S master节点1.2…

Debian操作系统的常用指令介绍

Debian是一个流行的Linux操作系统&#xff0c;以其稳定性和安全性而闻名。对于Debian用户来说&#xff0c;掌握一些基本的命令行指令是非常重要的&#xff0c;因为它们可以帮助你更高效地管理系统。在这篇博客中&#xff0c;我们将介绍一些在Debian系统中常用的指令及其功能。 …

79、贪心-跳跃游戏II

思路&#xff1a; 首先理解题意&#xff1a;从首位置跳最少多少次到达末尾。 第一种&#xff1a;使用递归&#xff0c;将所有跳转路径都获取到进行求出最小值。 第二种&#xff1a;使用动态规划&#xff0c;下一次最优取决上一次的最优解 第三针&#xff1a;贪心&#xff…

区块链 | IPFS 工作原理入门

&#x1f98a;原文&#xff1a;What is the InterPlanetary File System (IPFS), and how does it work? &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 去中心化互联网 尽管万维网是一个全球性的网络&#xff0c;但在数据存储方面&#…

智能消费记账|基于SSM+vue的大学生智能消费记账系统(源码+数据库+文档)

智能消费记账目录 基于SSMvue的大学生智能消费记账系统 一、前言 二、系统设计 三、系统功能设计 1 用户列表 2 预算信息管理 3 预算类型管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1…

R语言的学习—5—多元数据直观表示

1、数据读取 ## 数据整理 d3.1read.xlsx(adstats.xlsx,d3.1,rowNamesT);d3.1 #读取adstats.xlsx表格d3.1数据 barplot(apply(d3.1,1,mean)) #按行做均值条形图 barplot(apply(d3.1,1,mean),las3) barplot(apply(d3.1,2,mean)) #按列做均值图条形图 barplot(a…

Web,Sip,Rtsp,Rtmp,WebRtc,专业MCU融屏视频混流会议直播方案分析

随着万物互联&#xff0c;视频会议直播互动深入业务各方面&#xff0c;主流SFU并不适合管理&#xff0c;很多业务需要各种监控终端&#xff0c;互动SIP硬件设备&#xff0c;Web在线业务平台能相互融合&#xff0c;互联互通&#xff0c; 视频混流直播&#xff0c;录存直播推广&a…

手撕C语言题典——合并两个有序数组(顺序表)

搭配食用更佳哦~~ 数据结构之顺顺顺——顺序表-CSDN博客 数据结构之顺序表的基本操作-CSDN博客 继续来做一下关于顺序表的经典算法题叭~ 前言 88. 合并两个有序数组 - 力扣&#xff08;LeetCode&#xff09; 合并数组也是力扣上关于顺序表的一道简单题&#xff0c;继续来加深…

字节缓冲流

BufferedInputStream() 该类实现缓冲流输出对象&#xff08;可以向底层输出流写入字节而不必为写入的每一个字节导致底层系统的调用&#xff09; BufferedOutputStream() 创建BufferedOutputStream()将创建一个内部缓冲数组 当从流中读取或跳过字节时&#xff0c;内部缓冲区根…

Kubernetes学习笔记06

第十六章、Kubernetes容器交付介绍 如何在k8s集群中部署Java项目 容器交付流程 开发代码阶段 编写代码编写Dockerfile【打镜像做准备】持续交付/集成 代码编译打包制作镜像上传镜像仓库应用部署 环境准备PodServiceIngress运维 监控故障排查应用升级 k8s部署Java项目流程 …

云服务器+ASF实现全天挂卡挂时长

目录 前言正文1.安装下载2.编辑配置文件3.设置Steam社区证书4.启动ASF5.给游戏挂时长6.进阶-ASF自动启动且后台保活 前言 我遇到的最大的问题是&#xff0c;网络问题 其实不然&#xff0c;各大厂商的云服务器后台都有流量监控&#xff0c;意味着依靠一般方法是不能正常访问St…

高手的黑箱:AI时代学习、思考与创作

课程目录 01 不要错过这个时代的巨大红利&#xff0c;AI时代竞争力养成指南.mp4 02 解密高手的黑箱——那些创作高手不告诉你的事.mp4 03 创作&#xff1a;人生发展中最重要的事.mp4 04 创作中最重要的事&#xff08;1&#xff09;&#xff1a;对过程的掌控力.mp4 05 创作…

更深层次理解传输层两协议【UDP | TCP】【UDP 缓冲区 | TCP 8种策略 | 三次握手四次挥手】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 再谈端口号 端口号的返回…