【Linux系统编程】程序地址空间

进程地址空间

        进程地址空间是指每个进程在计算机内存中所占用的地址空间。地址空间是指能被访问的内存地址范围,它由若干个连续的内存块组成。每个进程都有自己的地址空间,这意味着每个进程都有自己的内存地址范围,不会与其他进程冲突。进程地址空间通常被划分为几个部分,包括代码段、数据段、堆和栈等,它是一种特定的数据结构,进程task_struct内部指向其结构,次结构在系统中叫做mm_struct。具体的结构分布如下图:

下面是在Linux下运用代码演示其地址:

[zhujunhao@bogon code]$ cat test.cpp
#include <iostream>
#include <unistd.h>
#include <cstdio>
using namespace std;
int main()
{
    char* s = new char[5];
    cout << "&s: " << &s << endl;
    int n = 8;
    cout << "&n: " << &n << endl;
    return 0;
}
[zhujunhao@bogon code]$ ./test.exe

//可看出堆区地址高,对应上面进程地址空间
&s: 0x7fff23280dc8
&n: 0x7fff23280dc4

        在vs下的测试可能还不一样,数据可能会出现异常,在Linux下可以测试出。这时因为Windows下出于安全的考虑,可能会对齐做出调整,Linux下也会做出安全考虑,只不过比Windows较为“ 优雅 ”。


物理地址与虚拟地址

        物理地址是系统内存中真正意义上存储数据所对应的一种地址,虚拟地址是模拟来的一种地址,通常与物理地址建立联系,然后从物理地址中对数据做出改变。我们平常使用C/C++中的地址都是虚拟地址。我们先来观察以下代码。

[zhujunhao@bogon code]$ cat code.cpp
#include <iostream>
#include <cstdio>
#include <unistd.h>
using namespace std;
int a = 100;
int main()
{
    pid_t p = fork();
    if (p == 0) {
        cout << "Child:" << endl;
        a = 200;
        cout << "   a = " << a << "  " << "&a = " << &a << endl; 
    }
    else {
        cout << "Father:" << endl;
        cout << "   a = " << a << "  " << "&a = " << &a << endl;
    }
    return 0;
}
[zhujunhao@bogon code]$ g++ -o code.exe code.cpp
[zhujunhao@bogon code]$ ./code.exe

//发现地址一样,但数据不一样
Father:
   a = 100  &a = 0x601074
Child:
   a = 200  &a = 0x601074

        注意,由于数据明显不一样,所以以上的地址不是物理地址,是虚拟地址/线性地址。也就是说,我们所用到的所有地址,全都不是物理地址,是虚拟或线性地址,而物理地址,用户一概看不到,由OS统一管理,其中,OS必须负责将虚拟地址转化成物理地址。

        在以上代码中,当子进程修改变量时,系统将会找到从子进程所对应的进程地址空间中的虚拟地址对应的物理地址,在物理地址内部开辟一块自己存储数据的空间,修改数据时将会修改从虚拟地址到物理地址的眏射表,眏射表将会修改那块存储数据的空间中的数据并重新建立两地址转换间的眏射关系,原本的数据不会被影响,所以,父子进程虽然虚拟地址一样,但数据不一样。

        系统之所以这样设计原因有以下三点:

        1,将物理内存从无序变有序。如果让让进程直接访问内存的话,那么每个进程存在内存中的位置都是不一样的,将会增加操作系统管理的成本。

        2,将内存管理和进程管理进行耦合。虚拟地址负责管理进程,物理地址负责管理内存。

        3,虚拟地址的设计间接保护了内存安全。如若直接访问物理地址,当用户胡乱操作时,将会造成不可逆转的损坏,虚拟地址的使用对其做出了拦截,保证了系统安全。

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

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

相关文章

品牌如何做好有效推广?真诚是关键

品牌推广是一项长期的任务&#xff0c;为了让推广内容达到理想效果&#xff0c;媒介盒子认为需要掌握一定的技巧&#xff0c;今天媒介盒子就从几个方面和大家聊聊品牌如何做好有效推广。 一、 深入了解消费者的需求和偏好 品牌只有真正了解消费者的需求&#xff0c;才有可能提…

C++_Lambda表达式的完整介绍

目录 1. 什么是Lambda表达式 1.1 四种表达式的含义 1.2 lambda表达式各个成员的解释 2. 捕获列表 3. 编译器如何看待Lambda表达式 参考文章 参考: C Lambda表达式的完整介绍 - 知乎 c在c11标准中引入了lambda表达式&#xff0c;一般用于定义匿名函数&#xff0c;使得代码…

云HIS为连锁医院机构提供统一医院管理解决方案

云HIS重建统一的信息架构体系&#xff0c;重构管理服务流程&#xff0c;重造病人服务环境&#xff0c;向不同类型的医疗机构提供SaaS化HIS服务解决方案。 云HIS优势 1、云端数据优势 在传统的HIS模式里&#xff0c;数据存于医院本身的服务器机组&#xff0c;一旦发生故障&…

Redis--Geo指令的语法和使用场景举例(附近的人功能)

文章目录 前言Geo介绍Geo指令使用使用场景&#xff1a;附近的人参考文献 前言 Redis除了常见的五种数据类型之外&#xff0c;其实还有一些少见的数据结构&#xff0c;如Geo&#xff0c;HyperLogLog等。虽然它们少见&#xff0c;但是作用却不容小觑。本文将介绍Geo指令的语法和…

竞赛保研 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

Nestjs 图片下载

一、download直接下载 1、添加下载代码 uploadController.ts import { Controller, Get, Post, Body, Patch, Param, Delete, UseInterceptors, UploadedFile, Res } from nestjs/common; import { UploadService } from ./upload.service; import { CreateUploadDto } from…

【面试突击】硬件级别可见性问题面试实战(上)

&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308;&#x1f308; 欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (56) | 卷积神经网络

前言 &#x1f4da; 笔记专栏&#xff1a;斯坦福CS231N&#xff1a;面向视觉识别的卷积神经网络&#xff08;23&#xff09;&#x1f517; 课程链接&#xff1a;https://www.bilibili.com/video/BV1xV411R7i5&#x1f4bb; CS231n: 深度学习计算机视觉&#xff08;2017&#xf…

谷达冠楠科技:抖音开网店新手小白可以卖的产品

随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的店铺。而抖音作为目前最火的短视频平台&#xff0c;也提供了开店的功能。那么&#xff0c;对于新手小白来说&#xff0c;抖音开网店可以卖哪些产品呢? 我们可以考虑的是服装类商品。抖音上有很多时尚博主&#x…

java httpclient Post

一、Maven引用httpclient <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.3</version> </dependency> 二、直接上代码 private void PostData(){CloseableHt…

基于Qt/C++的体质监测系统,体重秤,体脂秤,身体质量指数系统,Qt语音播报

目录导览 一、前言二、项目功能介绍三、源程序四、总结 一、前言 可以通过该项目练习的c、qt的知识&#xff0c;提高自己的项目实战经验。同时需要其他管理系统的&#xff0c;如超市购物系统&#xff0c;图书管理系统、实验设备管理系统、超市管理系统、学生管理系统、教师管理…

开发企业微信中的内嵌h5时如何开发与调试

前言&#xff1a; 在我们的项目中&#xff0c;开发企业微信内部的项目的话&#xff0c;分为两种&#xff0c;1种是直接开发企业微信的小程序&#xff0c;另一种则是企业微信内嵌我们的H5界面&#xff0c;我们这里讲一讲企业微信内嵌h5的方法与注意点。 1、开发h5项目 这点没有…

BGP最通俗易懂的讲解——路由反射器防环机制

路由反射器防环机制&#xff1a;Originator ID与Cluster List 一、Originator ID 该属性属于BGP的可选非过渡属性&#xff1b;Originator ID由RR产生&#xff0c;使用的Router ID的值标识路由的发送者&#xff0c;用于防止集群内产生路由环路&#xff1b;当一条路由第一次被RR…

【从零开始学习Java重要知识 | 第三篇】暴打ReentrantLock底层源码

目录 前言&#xff1a; 前置知识&#xff1a; 什么是公平锁与非公平锁&#xff1f; 尝试自己构造一把锁&#xff1a; ReentrantLock源码&#xff1a; 加锁&#xff1a; 解锁&#xff1a; 总结&#xff1a; 前言&#xff1a; 在并发编程中&#xff0c;线程安全是一个重…

大数据工作岗位需求分析

前言&#xff1a;随着大数据需求的增多&#xff0c;许多中小公司和团队也新增或扩展了大数据工作岗位&#xff1b;但是却对大数据要做什么和能做什么&#xff0c;没有深入的认识&#xff1b;往往是招了大数据岗位&#xff0c;搭建起基础能力后&#xff0c;就一直处于重复开发和…

鉴源实验室|自动驾驶仿真测试技术分析

01 引言 随着科技的不断发展&#xff0c;自动驾驶技术逐渐成为汽车行业的热门话题。然而&#xff0c;要将自动驾驶车辆投放到真实道路上之前&#xff0c;必须进行广泛的测试&#xff0c;以确保其在各种情况下都能安全可靠地运行。自动驾驶车辆的测试是一个复杂而昂贵的过程。…

细说CubeIDE——之建立一个工程

博主今天给大家带来新的一个软件&#xff0c;由于公司要上市&#xff0c;盗版软件不让装&#xff0c;IAR&#xff0c;KEIL律师函争相投递&#xff0c;博主只能老老实实把软件卸掉&#xff0c;苦逼工作还得干&#xff0c;怎么办&#xff1f; 你说怎么办&#xff1f;怎么办&#…

常用中间件漏洞

IIS6 IIS7 安装 控制面板-----打开关闭windows功能 添加角色-----添加IIS 启动之后访问localhost 复现 服务器换成IIS7 访问报错 大概就是缺少CGI模块 问题解决 添加php-cgi的路径 添加脚本映射 修改php.ini文件 将 cgi.fix_pathinfo1 然后设置一个图片 访问 在后缀加上/.…

如何使用JS逆向爬取网站数据

引言&#xff1a; JS逆向是指利用编程技术对网站上的JavaScript代码进行逆向分析&#xff0c;从而实现对网站数据的抓取和分析。这种技术在网络数据采集和分析中具有重要的应用价值&#xff0c;能够帮助程序员获取网站上的有用信息&#xff0c;并进行进一步的处理和分析。 基…

Linux第29步_安装“Notepad++”软件

STM32CubeProgrammer脚本文件的后缀为“.tsv”&#xff0c;ST公司官方也叫做FlashLayout。在烧写“TF-A固件”之前&#xff0c;我们需要用“Notepad”软件打开“后缀为.tsv”的脚本文件&#xff0c;根据需求决定哪些文件需要更新&#xff0c;设置好这个脚本文件。 .tsv是文本格…