Linux 第十八章

news2024/11/18 2:04:45

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

❤️‍🔥专栏系列:线性代数,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从虚拟地址空间中访问内存时,会首先将虚拟地址通过分页机制翻译为物理地址,而这个翻译过程需要使用到页表。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#】基础知识

0.参考 C#语言入门详解 1.几种打印hello_world的方式 1.1 console控制台 新建一个console&#xff0c;直接打印&#xff1a; Console.WriteLine("Hello_world");启动一闪而过&#xff0c;在vs调试中选择开始执行不调试&#xff08;without debug&#xff09;。 …

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

5.C++动态内存管理(超全)

目录 1 .C/C 内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 3.3 operator new函数 3.4 定位new表达式(placement-new) &#xff08;了解&#xff09; 4. 常…

开发一个语音聊天社交app小程序H5需要多少钱?

社交&#xff0c;即时通讯APP系统。如何开发一个社交App||开发一个即时通信应用是一项复杂而充满挑战的任务&#xff0c;需要考虑多个技术、开发时间和功能方面的因素。以下是一个概要&#xff0c;描述了从技术、开发时间和功能角度如何开发这样的应用&#xff1a; 1. 技术要点…

Centos7.9系统MySQL5.7.32升级为5.7.44(生成环境操作)

1.背景 由于客户进行等保漏扫和渗透&#xff0c;生成环境mysql数据库被扫描出了 高危漏洞。 如图&#xff1a;部分漏洞 查看漏洞详细信息&#xff0c;建议升级到指定版本解决&#xff1a; 说明&#xff1a; 本文仅适合使用当前数据库为 RPM 安装方式 2.升级前准备 查看环…

STM32-HAL库12-STM32F407VGT6的PWM主从定时器,发送指定数量脉冲

STM32-HAL库12-STM32F407VGT6的PWM主从定时器&#xff0c;发送指定数量脉冲 一、所用材料 STM32F407VGT6自制双伺服电机控制板&#xff1b; 一川A1系列伺服电机驱动器&#xff08;电0.73KW电机&#xff09;&#xff1b; 二、所学内容 实现PWM发送指定个数脉冲&#xff0c;以…

Noisy:一款功能强大的DNS和HTTPS网络流量噪声生成工具

关于Noisy Noisy是一款功能强大的DNS和HTTP/S网络流量噪音生成工具&#xff0c;该工具基于Python开发&#xff0c;可以帮助广大研究人员在进行常规网络浏览时&#xff0c;在后台生成随机的HTTP/DNS网络流量噪声&#xff0c;并以此来提升网络通信数据的安全性和隐蔽性。 支持的…

Hikyuu-教程-如何利用 FINANCE 指标计算市盈率

本篇主要讲解如何利用 FINANCE 指标计算市盈率&#xff0c;其他市净率等指标可以参考此文实现。 获取历史财务字段信息 调用 sm.get_history_finance_all_fields() 方法获取历史财务信息对应字段的索引号和名称 In [2]: sm.get_history_finance_all_fields() Out[2]: [(0, 基…

Bert基础(二十一)--Bert实战:文本摘要

一、介绍 1.1 文本摘要简介 文本摘要&#xff08;Text Summarization&#xff09;&#xff0c;作为自然语言处理&#xff08;NLP&#xff09;领域的一个分支&#xff0c;其核心目标是从长篇文档中提取关键信息&#xff0c;并生成简短的摘要&#xff0c;以提供对原始内容的高度…

Rust中的并发性:Sync 和 Send Traits

在并发的世界中&#xff0c;最常见的并发安全问题就是数据竞争&#xff0c;也就是两个线程同时对一个变量进行读写操作。但当你在 Safe Rust 中写出有数据竞争的代码时&#xff0c;编译器会直接拒绝编译。那么它是靠什么魔法做到的呢&#xff1f; 这就不得不谈 Send 和 Sync 这…

Apache SeaTunnel k8s 集群模式 Zeta 引擎部署指南

SeaTunnel提供了一种运行Zeta引擎(cluster-mode)的方法&#xff0c;可以让Kubernetes在本地运行Zeta引擎&#xff0c;实现更高效的应用程序部署和管理。在本文中&#xff0c;我们将探索SeaTunnel k8s运行zeta引擎(cluster-mode模式)的更多信息&#xff0c;了解如何更好地利用Ze…

大数据技术就业和发展前景怎么样

大数据技术的就业和发展前景极为乐观&#xff0c;具有行业需求旺盛、就业多样性、可持续发展潜力等特点&#xff0c; 上大学网 &#xff08;www.sdaxue.com&#xff09;整理出了大数据技术的就业和发展前景以下几个关键趋势&#xff0c;供大家参考&#xff01; 行业需求旺盛&…

[华为OD] C卷 5G网络 现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站 200

题目 现需要在某城市进行5G网络建设&#xff0c;已经选取N个地点设置5G基站&#xff0c;编号固定为1到N,接 下来需要各个基站之间使用光纤进行连接以确保基站能互联互通&#xff0c;不同基站之间架设光纤的成 本各不相同&#xff0c;且有些节点之间已经存在光纤相连&#…

数据仓库Data Warehouse

数据仓库Data Warehouse 数仓是一种思想,数仓是一种规范,数仓是一种解决方案 1. 数据处理方式 数据处理大致可以分成两大类: 联机事务处理OLTP(on-line transaction processing)联机分析处理OLAP(On-Line Analytical Processing)1.1. OLTP OLTP的全称是On-line Transa…

Unity添加证件

目录 1.问题描述&#xff1a;2.解决方法&#xff1a;小结&#xff1a; 1.问题描述&#xff1a; 2.解决方法&#xff1a; 登录后跳转打开 添加证件 选择个人证件 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职||…

基于 React 的图形验证码插件

react-captcha-code NPM 地址 &#xff1a; react-captcha-code - npm npm install react-captcha-code --save 如下我自己的封装&#xff1a; import Captcha from "react-captcha-code";type CaptchaType {captchaChange: (captchaInfo: string) > void;code…

利用大型语言模型提升数字产品创新:提示,微调,检索增强生成和代理的应用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【漏洞复现】科达 MTS转码服务器 任意文件读取漏洞

0x01 产品简介 科达 MTS转码服务器是一款专业的视频转码设备&#xff0c;采用了高性能的硬件配置和先进的转码技术&#xff0c;能够实现高效、高质量的视频转码。 0x02 漏洞概述 科达 MTS转码服务器存在任意文件读取漏洞&#xff0c;攻击可以通过该漏洞读取服务器任意敏感信…

ChatGPT向付费用户推“记忆”功能,可记住用户喜好 | 最新快讯

4月30日消息&#xff0c;人工智能巨头OpenAI宣布&#xff0c;其开发的聊天机器人ChatGPT将在除欧洲和韩国以外的市场全面上线“记忆”功能。这使得聊天机器人能够“记住”ChatGPT Plus付费订阅用户的详细信息&#xff0c;从而提供更个性化的服务。 OpenAI早在今年2月就已经宣布…

java同步大量数据到本地数据库方法总结

最近在做一个需求&#xff0c;就是我需要对三方接口调用的数据存放到本地的数据库里的数据表里面。那么一开始我就是直接一条一条save&#xff0c;结果发现耗时非常严重&#xff0c;后面我就进行了改进。就是分批次去同步或者分批次去异步。 现在我直接贴出我写的代码&#xf…