进程地址空间 【Linux】

news2024/12/24 9:49:45

文章目录

  • 进程地址空间

进程地址空间

进程地址空间,本质是一个描述进程可视范围的大小,
地址空间内一定要存在各种区域划分,对线性地址进行start,和end即可

在每一个区的_start 到_end 范围内,这段连续的空间中,每一个最小单位都可以有地址,这个地址可以被进程直接使用

进程地址空间本质上是内存中的一种内核数据结构,在Linux当中进程地址空间具体由结构体mm_struct实现

struct mm_struct
{
unsigned int code_start; //代码区
unsigned int code_end;
unsigned int init_start;//初始化数据
unsigned int init_end
;unsigned int uninit_start//未初始化数据
;unsigned int uninit_end
;unsigned int heap _start//堆区
;unsigned int heap_end
;unsigned int stack _start//栈区
;unsigned int stack_end;
};

在这里插入图片描述

#include<stdio.h>
#include<stdlib.h>
int g_val_1; // 未初始化数据
int g_val_2 = 100; // 已初始化数据

int main() 
{
  printf( "code :  %p\n", main );    
    const char *str = "hello bit";
    printf("string: %p\n", str);
    printf("init global value: %p\n", &g_val_2);
    printf("uninit global value: %p\n", &g_val_1);
    
    char *mem = (char *)malloc(100);
    printf("heap: %p\n", mem);
    printf("stack: %p\n", &str); // 局部变量存放在栈区, str是局部变量

    return 0;
}

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

栈 是向下增长的 , 堆区是向上增长的
在这里插入图片描述
在这里插入图片描述

原因: 先定义的变量先入栈 ,后定义的变量后入栈 ,栈向地址减少的方向增长

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

从图中可以看出堆区是向上增长的

如果有一个局部变量前面加了static ,生命周期就会变成全局变量
原因:static修饰的局部变量,编译的时候已经被编译到全局数据区

在这里插入图片描述

在这里插入图片描述
同一个变量,同一个地址,同时读取,读到了不同的内容

结论:如果变量的地址,是物理地址,不可能存在上面的现象,也就是说变量的地址是虚拟地址(线性地址)

在这里插入图片描述

操作系统在创建父进程的同时,也创建了父进程的进程地址空间,父进程的PCB是有对应的指针指向该进程地址空间
系统还会为父进程创建页表 ,页表是一种kv式的映射关系 ,可以在页表通过虚拟地址来找到物理地址,通过物理地址找到物理内存
进程在访问虚拟地址时,操作系统会查页表,将虚拟地址转换为物理地址,就可以访问到物理地址里面的内容

当父进程开始创建子进程时,系统中创建一个子进程一定是系统中多了一个子进程,多的一个进程也需要被操作系统管理起来,所以操作系统也需要给子进程创建PCB结构,也会给子进程创建进程地址空间,子进程会将父进程的进程地址空间拷贝一份,子进程将父进程的页表结构也拷贝一份

只要父进程和子进程的页表内容一样,父进程和子进程的地址空间也是一样的,虚拟地址到物理地址之间的转换也是一样的,所以父进程和子进程可以共享代码

如果需要将g_val从100修改为200,操作系统会将0x60105c进行写入,在写入之前系统发现g_val这个变量是和父进程共享的,所以在写入之前,操作系统会在物理内存重新开辟一段空间,将0x60105c所对应的物理地址修改,假设修改成0x44332211(写时拷贝)
并将100改成200

为什么要有进程地址空间?
让进程以统一的视角看待内存

增加虚拟地址:
增加进程虚拟地址空间可以我们访问内存的时候,增加一个转换的过程,在这个转化的过程中,可以对我们的寻址请求进行审查,一旦异常访问,直接拦截,该请求不会到达物理内存,保护物理内存

补充页表:
在这里插入图片描述

cr3寄存器保存的是当前进程的页表的起始地址,也叫做当前进程正在运行的临时数据
,本质上属于进程的硬件上下文
如果此时进程被切换走了,操作系统会将cr3寄存器中的内容带走,当进程继续运行时,会将cr3寄存器中的页表地址恢复

字符常量区是只能读不能写,进程如何知道?
当操作系统需要访问字符常量区时,CPU读取到虚拟地址,CPU通过cr3寄存器找到页表,并查询页表,发现权限是只读不能写,如果你向该位置写入,操作系统会直接拦截

进程是可以被挂起的 ,但是Linux并没有挂起状态 ,操作系统如何知道进程的代码和数据在不在内存?
操作系统通过页表的标志位来判断对应的代码和数据是否已经被加载到内存
如果操作系统发现对应的代码和数据并没有加载到内存中,此时操作系统会出发缺页中断
然后操作系统就会找到可执行程序的代码,并在物理内存中重新申请一份空间,将可执行程序的代码和数据加载到刚刚重新申请一份空间中,再把这一份空间的地址填到页表当中,如果再访问就可以对应的代码和数据

进程在被创建的时候,是先创建内核数据结构?还是先加载对应的可执行程序呢?
先创建内核数据结构再加载对应的可执行程序

进程=内核数据结构(task_struct && mm_struct &&页表)+程序的代码和数据

因为有地址空间和页表的存在,将进程管理模块,和内存管理模块进行解耦合

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

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

相关文章

Swift - Playground

文章目录 Swift - Playground1. 新建Playground2. View3. 图片4. ViewController5. Playground - 多Page6. 注释6.1 Playground的注释支持markup语法&#xff08;与markdown相似&#xff09;6.1.1 语法 Swift - Playground Playground可以快速预览代码效果&#xff0c;是学习语…

前端计算机网络之网络模型

什么是网络模型 对于前端开发者而言&#xff0c;理解网络模型的概念是非常重要的。网络模型是描述数据如何在网络中传输和处理的框架和规则&#xff0c;它有助于前端开发者更好地理解和优化应用程序与服务器之间的通信过程。 常用的两类模型 前端开发者需要了解的网络模型主…

引入线程的贪吃蛇风骚走位

1.在main函数中分别引入线程t1 和线程 t2 一个线程用来刷新界面&#xff0c;一个线程用来改变方向 2.刷新界面函数&#xff0c;无限次刷新 3. 也是无限循环while(1) 定义key 从键盘获取输入方向&#xff0c;赋值给dir; 4.在初始化函数中确定蛇向有行走为方向 5.从改变方向的函数…

c++中的链表list的模拟实现

拖更了半个月&#xff0c;我终于来填c的坑啦。上次我们说的vetcor不知道小伙伴还记得多少呢&#xff1f;今天我们要讲list的模拟实现。 目录 架构结点list表的结构 构造函数尾插push_back()尾删pop_back()计算个数&#xff1a;size()判断空empty()※迭代器问题普通迭代器迭代器…

16. Spring 事务和事务传播机制

源码位置&#xff1a;transaction 1. 事务回顾 在数据库阶段&#xff0c;想必大家都已经学习过事务了。当多个操作要么一起成功&#xff0c;要么一起失败的时候就需要将多个操作放在同一个事务中。 举个例子&#xff1a;比如用户A给用户B转账100元的业务&#xff0c;需要把用…

英文文档阅读学习atoi

文档链接&#xff1a;atoi - C Reference (cplusplus.com) 如果可以看的懂英文的可以直接看这个图&#xff0c;看不明白也没关系&#xff0c;可以看一下下面的翻译&#xff1a; 这是一些c语言的相关单词意思&#xff1a; C-string——使用空字符 0 结尾的一维字符数组 as in i…

(学习日记)2024.04.28:UCOSIII第五十二节:User文件夹函数概览(uC-LIB文件夹)第二部分

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

重学java 24.面向对象 多态

下雨了&#xff0c;跑不跑衣服都会被淋湿&#xff0c;还不如慢慢地走&#xff0c;结局已定 —— 24.4.25 多态 1.面向对象三大特性&#xff1a;封装 继承 多态 2.怎么学&#xff1a; a、不要从字面意思上理解多态这两个字&#xff0c;要从使用形式上掌握 b、要知…

【Redis 开发】Redis哨兵

哨兵 作用和原理服务状态监控选举新的master 搭建哨兵集群RedisTemplate的哨兵模式 作用和原理 Redis提供了哨兵机制来实现主从集群中的自动故障恢复&#xff1a; 哨兵也是一个集群 监控&#xff1a;会不断检查master和slave是否按预期工作自动故障恢复&#xff1a;如果mast…

开发工具-pycharm的代码自动部署服务器以及服务端python配置、项目开发环境一键启动服务

文章目录 一、pycharm的ssh配置1.本地生成ssh密钥2.密钥配置到远端服务器(1-1) 有权限ssh访问到服务器(1-2) 无权限ssh访问到服务器(1-3) 没有办法通过以上形式上传到服务器(2) 配置到authorized_keys自动访问 3.pycharm中配置ssh(1) 选择File中的settings(1) 选择Tools中的SSH…

Github创建远程仓库(项目)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

StarBright染料--星光高亮抗体 助力多色方案

星光染料是一种独特的荧光纳米粒子&#xff0c;将它与 Bio-Rad 高度验证的抗体结合&#xff0c;专为流式细胞术开发&#xff0c;为您提供卓越染色效果。星光染料使稀有群体和低密度抗原易于分辨&#xff0c;同时保持适用于任何多色实验的灵活性。 本篇将帮助你了解高亮星光染料…

springboot权限验证学习-下

上篇讲了rbac对于菜单的权限&#xff0c;下面准备完成按钮权限以及行数据和列数据权限 权限控制(按钮权限) 权限控制 操作权限就是将操作视为资源&#xff0c;比如删除操作&#xff0c;有些人可以有些人不行。于后端来说&#xff0c;操作就是一个接口。于前端来说&#xff0…

vue2使用change事件监听不了回车事件的问题

在 vue2 项目中使用 el-input 的 change 监听&#xff0c;数据不发生变化时&#xff0c;回车事件和失去焦点不生效 输入框会一直显示 只有数据发生变化时才生效 <el-input v-model"editedText" change"endEditing" ref"input"></el-inp…

校园广播系统:智能化管理提升校园安全与效率

在现代教育环境中&#xff0c;校园广播系统不再仅仅是一个播放音乐和通知的工具&#xff0c;它已经成为学校基础设施中不可或缺的一部分。根据《义务教育阶段学校信息化设备配备标准》的第8条&#xff0c;校园广播系统在学校范围内的日常运用极为广泛&#xff0c;涵盖了升旗仪式…

基于 SpringCloud 的在线交易平台乐优商城的设计与实现(四)

第 4 章 数据库设计 4.1 数据库设计原则 4.2.数据库概念结构设计 4.3 数据库表设计 4.4.本章小结 前面内容请移步 基于 SpringCloud 的在线交易平台乐优商城的设计与实现&#xff08;三&#xff09; 相关免费源码资源 乐优商城 第 4 章 数据库设计 4.1 数据库设计原…

怎样把音频压缩?3种简单的音频压缩方法分享

怎样把音频压缩&#xff1f;在数字化时代&#xff0c;音频文件占据了大量的存储空间&#xff0c;因此音频压缩成为了许多人的需求。通过音频压缩&#xff0c;我们不仅可以减小文件大小&#xff0c;方便存储和传输&#xff0c;还可以节省设备空间&#xff0c;提升处理效率。因此…

人工智能|推荐系统——推荐大模型最新进展

近年来,大语言模型的兴起为推荐系统的发展带来了新的机遇。这些模型以其强大的自然语言处理能力和丰富的知识表示,为理解和生成复杂的用户-物品交互提供了新的视角。本篇文章介绍了当前利用大型语言模型进行推荐系统研究的几个关键方向,包括嵌入空间的解释性、个性化推荐的知…

电脑黑屏问题的4种解决方法,两分钟轻松掌握

电脑黑屏是一种让人不安的问题&#xff0c;这个问题可能是由多种原因引起的。在这个数字化的时代&#xff0c;电脑已经成为我们工作和娱乐中不可或缺的一部分。当电脑突然陷入黑屏状态&#xff0c;用户通常会感到困扰和焦虑。本文将介绍一些常见的电脑黑屏问题解决方法&#xf…

微服务之并行与分布式计算

一、概述 1.1集中式系统vs分布式系统 集中式系统 集中式系统完全依赖于一台大型的中心计算机的处理能力&#xff0c;这台中心计算机称为主机&#xff08;Host 或 mainframe &#xff09;&#xff0c;与中心计算机相连的终端设备具有各不相同非常低的计算能力。实际上大多数终…