Linux_进程地址空间

我们用c语言写的程序,经过编译后形成可执行程序存放在硬盘。当运行该程序时,操作系统将该程序加载到内存中,创建进程控制块,变为进程,然后开始执行该程序。大家是否想过,操作系统是如何加载的呢;我们在程序中使用的地址,是否是内存地址呢;当程序所占空间大于内存时,又该如何,比如游戏100G,内存只有16G;这一切的答案都在进程地址空间中,下面我拿c/c++的程序地址空间来举例。

一.为什么要有程序地址空间呢?

如果没有进程地址空间,程序直接载入内存,这样就无法保证进程独立性。因为c语言的野指针问题,当内存暴露于程序当中,这样程序员就可以用指针随意访问内存,这样造成的危害是巨大的。故此,产生了进程地址空间。此时,程序看到的空间不是内存,使用的地址也不是内存地址,而是虚拟地址。于是,也就不存在访问其他进程的情况,保证了进程间独立性。
image.png

二.什么是进程地址空间?

2.1 进程地址空间概念

进程地址空间,即虚拟地址空间。一个进程运行时,它所认为自己管理的空间就是虚拟地址空间,一个进程地址空间的大小取决于计算机系统架构,比如32位机,进程地址空间为4GB。

2.2 c/c++进程地址空间的区域划分

在这里插入图片描述

2.3 进程地址空间的管理

在Linux中,需要对每个进程的进程地址空间进行管理,怎么管理?先描述再组织。进程地址空间本质Linux内核中的一个数据结构struct mm_struct{},对于每一个进程,都有自己的mm_struct,且其大小都一样,32位下都是4GB,4GB是进程可管理空间的大小。Linux中进程控制块task_struct中有一个成员指针,指向自己的进程地址空间。

//内核中大致是这样描述进程地址空间的
struct mm_struct()
{
    long code_start;
    long code_end;
    long brk_start;
    long brk_end;
    long init_start;
    long init_end;
    //.....
}

image.png

1.4 虚拟地址到物理地址

我们的程序在编译时,编译器就按照程序地址空间的方式对程序进行划分,为代码和数据分配好了空间,这种文件的格式就是ELF格式。在程序中的每一条指令都有自己的地址,这个地址就是虚拟地址,在Linux中可以使用objdump -S file 进行反汇编查看。
当操作系统加载程序时,要为每一个程序创建task_struct,mm_struct ,页表…,而页表可以实现从虚拟地址转换为物理地址。每一个进程的入口地址(虚拟地址)是规定的,cpu通过入口地址经过页表转换为访问物理地址,同时读取物理地址空间的内容,即第一条指令。下面的页表只是一种简化情况,真实页表还有许多字段,比如权限位等等。
image.png

三.进程地址空间的作用

  1. 防止一个进程内部的指针随意访问,保护物理内存和其他进程。

如果没有虚拟地址空间,那么我们每个进程都是直接访问物理内存的,如果一个进程中出现了错误,导致访问了别的进程中的数据,这样就无法保证进程之间的独立性

  1. 将进程管理和内存管理进行解耦合

使程序员只需要关心自己程序而不用关心内存方面,可以大大增加开发的效率。因为程序员看到的是虚拟地址,而不是内存地址。

  1. 不用将一个大型程序一次载入内存,只要载入用到的部分即可

100G游戏,可能只会用到一部分功能,而其他功能的代码和数据不用载入内存,可以更好的利用内存。

  1. malloc相关

malloc之后,操作系统并不会立即分配空间,因为操作系统追求高效,当你使用该块空间的时候,继而为你开辟空间,怎么实现这样机制呢?使用的是缺页中断,即:将页表中只分配虚拟内存,等程序用该块空间的时候,分配物理内存,并且填充页表,建立完整映射关系。而这种方式得益于虚拟地址空间。

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

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

相关文章

有状态DHCPv6快速模式配置及EUI-64介绍

正文共:1024 字 15 图,预估阅读时间:3 分钟 我们现在已经熟悉了IPv6的地址架构(IPv6地址架构一本通),掌握了IPv6地址的手工配置方式(IPv6从入门到精通)和DHCPv6有状态地址配置&#…

01.数据结构篇-链表

1.找出两个链表的交点 160. Intersection of Two Linked Lists (Easy) Leetcode / 力扣 例如以下示例中 A 和 B 两个链表相交于 c1: A: a1 → a2↘c1 → c2 → c3↗ B: b1 → b2 → b3 但是不会出现以下相交的情况,因为每个节点只有一个…

Peter算法小课堂—区间模型(2)

上次咋们讲了前两个区间模型:1.最大不重叠区间数 2.不重叠区间最少分组数。今天我们就学习:最小区间覆盖问题、区间重叠最厚层数! 最小区间覆盖 先看三道题 那么,第1题,它是浮点数的题,也就要求首尾相同。…

通过增加缓存优化斐波那契递归的冗余计算

一、python 斐波那契数列的递归实现存在大量的冗余计算。例如,为了计算fib(n),我们需要计算fib(n-1)和fib(n-2),但是在计算fib(n-1)的过程中,我们又会重复计算fib(n-2)。当n的值很大时,这种冗余计算会消耗大量的计算资…

机器学习:ROC曲线笔记

ROC曲线(Receiver Operating Characteristic Curve)是一种用于评估二分类模型性能的图形化工具,主要用于展示在不同阈值(Threshold)下模型的真阳性率(True Positive Rate,TPR)和假阳…

最新在线看4K高清电影网站推荐

随着互联网技术的发展,观看高清电影已经不再是难事。这里我为大家分享几个最新的在线看4K高清电影网站,让您在家就能享受到极致观影体验。 通过下面这个即可 1. 【超清影视】 【超清影视】是国内新兴的4K高清电影网站,拥有海量的影片资源&a…

【送书福利-第三十一期】《区块链安全理论与实践(安全技术经典译丛)》

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主、前后端开发、人工智能研究生。公粽号:程序员洲洲。 🎈 本文专栏:本文…

幻兽帕鲁游戏官方更新了版本,联机时提示版本不适用,无法加入,怎么办?

如果你在登录游戏的时候提示:您正在尝试加入的比赛正在运行不兼容的游戏版本。请尝试升级游戏版本。此时就说明你需要更新部署在服务器内的幻兽帕鲁了。 1、如果你使用幻兽帕鲁应用模板部署游戏,那么可以选择使用游戏配置面板一键更新。 2、如果你使用一…

使用Xcode 真机无线调试

1.iPhone和Xcode连在同一WIFI下 2.打开Xcode 顶部菜单 选中Window -> Device and Simulators 3.选中Connect via network (注意:勾选前还要用数据线连接,测试机要设置密码,出弹窗的话要点击信任) 真机设备旁边出现小地球 就代表成功了

【ES】--ES集成热更新自定义词库(字典)

目录 一、问题描述二、具体实施1、Tomcat实现远程扩展字典2、验证生效3、ES配置远程扩展字典4、为何不重启ES能实现热更新 一、问题描述 问题现象: 前面完成了自定义分词器词库集成到ES中。在实际项目中词库是时刻在变更的,但又不希望重启ES,对此我们应…

书生·浦语大模型第四课作业

基础作业: 构建数据集,使用 XTuner 微调 InternLM-Chat-7B 模型, 让模型学习到它是你的智能小助手,效果如下图所示,本作业训练出来的模型的输出需要将不要葱姜蒜大佬替换成自己名字或昵称! 1.安装 # 如果你是在 Int…

备战蓝桥杯---组合数学基础1

让我们来几道高中的组合题吧: 1.我们一定有n个向下,为 2.我们挑最大的两个,条件是他们奇偶性相同,为2*A10,2; 3.用捆绑法即可。 4.我们用隔板法,为 5.问题等价于23个相同的球放到3个盒子里,每个盒子至少…

如何使用ProcessStomping在可执行程序的字段部分执行Shellcode

关于ProcessStomping ProcessStomping是一款功能强大的Shellcode代码执行工具,该工具允许广大研究人员在目标可执行程序的指定字段部分执行Shellcode代码。 ProcessStomping实际上是Process Overwriting项目的一个升级版本,并且能够向目标应用程序的指…

2000-2021年县域指标统计数据库

2000-2021年县域统计数据库 1、时间:2000-2021年 2、来源:县域统计年鉴 3、范围:2500县 5、指标: 地区名称、年份、行政区域代码、所属城市、所属省份、行政区域土地面积平方公里、乡及镇个数个、乡个数个、镇个数个、街道办…

【Java程序设计】【C00253】基于Springboot的在线考试管理系统(有论文)

基于Springboot的在线考试管理系统(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的在线考试系统 本系统分为系统功能模块、管理员功能模块以及用户功能模块。 系统功能模块:系统登录,管理…

二层交换机配置以太网通道

实验大纲 二层聚合端口配置 1.构建网络拓扑结构图 2.修改交换机名字 3.创建聚合组进入聚合接口模式 4.将端口绑定到聚合端口(接口模式) 5.聚合接口下端口配置(聚合接口模式) 6.具体配置 7.验证端口通道1的状态 8.配置ip 9.测试连通…

Learn LaTeX 017 - LaTex Multicolumn 分栏

在科学排版中进行分栏操作,能够有效的利用页面中的空间,避免空白位置的浪费。 好的分栏设计能对你的排版增色不少! https://www.ixigua.com/7298100920137548288?id7307237715659981346&logTag949adb699806392430bb

centos中docker操作+安装配置django并使用simpleui美化管理后台

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

Android的常用Drawable讲解

今天来讲讲Android开发中水都绕不开的东西----drawable。最常使用的莫过于通过XML所声明的Drawable作为View背景,通过代码创建的应用场景则较少。其有着使用简单,比自定义view的成本要低的特点。同时,非图片类型的drawable占用空间较小&#…

Github 2024-02-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-02-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目3Python项目3JavaScript项目1TypeScript项目1C项目1C项目1PowerShell项目1非开发语言项目1 SubQuery…