【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.hqwc.cn/news/415988.html

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

相关文章

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子&#xff0c; 借用在rand()函数中&#xff0c;我们可以通过设置随机数种子来影响随机数的生成。例如&#xff0c;在rand()函数中加入了随机数种子编码后&#xff0c;每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

Redis实战之-分布式锁-redission

一、分布式锁-redission功能介绍 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程可以再次进入到相同的锁的代码块中&#xff0c;可重入锁的意义在于防止死锁&#xff0c;比如HashTable这样的代码中&#xff0c;他的方法都…

计算机网络编程

网络编程 文章目录 网络编程1 计算机网络1.1 什么是网络1.2 什么是计算机网络1.3 计算机网络发展的四个阶段 2 常用名词2.1 网络模型2.1.1 OSI模型2.1.2 TCP/IP模型 2.2 网络协议2.2.1 TCP/UDP2.2.2 IP 2.3 Port: 端口号 3 计算机网络编程3.1 InetAddress类3.2 基于TCP的Socket…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法&#xff1a;data() 和 c_str()&#xff0c;都是返回该字符串的const char类型&#xff0c;那如何转换成非const的char呢&#xff1f; 下面展示三种方法&#xff1a; 强转&#xff1a;char* char_test (char*)test.c_str();使用string的地址&#xff…

Kubernetes的minikube

文章目录 环境概述准备安装启动和集群交互dashboard创建deployment创建service启用addon清理参考 环境 RHEL 9.3Docker Community 24.0.7miniKube v1.32.0 概述 minikube可以快速的在macOS、Linux和Windows上搭建本地的Kubernetes集群&#xff0c;帮助Kubernetes小白快速上手…

cv 不能正常读取中文路径

之前一直以为是PyQT的getOpenFileNames方法不能读取中文路径的。多次尝试后发现不是&#xff0c;是OpenCV的问题。 self.selected_imgPaths, _ QtWidgets.QFileDialog.getOpenFileNames(self, "打开图片", "./pending_images", "*.jpg;;*.JPG;;*.png…

【SQL】SQL语法小结

相关资料 参考链接1&#xff1a;SQL 语法&#xff08;超级详细&#xff09; 参考链接2&#xff1a;史上超强最常用SQL语句大全 SQL练习网站&#xff1a;CSDN、牛客、LeetCode、LintCode SQL相关视频&#xff1a; 推荐书籍&#xff1a; 文章目录 数据分析对SQL的要求SQL语法简介…

一文吃透计算机组成原理面试八股文

第一章 计算机系统概述 “较简单&#xff0c;不做过多赘述&#xff0c;后面会详细学到” 第一节 计算机系统层次结构 1.计算机系统的基本组成&#xff1a;硬件软件 2.计算机硬件的基本组成&#xff1a;运算器存储器控制器输入设备输出设备 3.系统软件和应用软件 系统软件…

JIRA工作流设置解决弹框

1、2、、找到要配置工作流&#xff0c;编辑状态下&#xff0c;选择要配置的状态 2、点击“编辑”按钮 3、配置转为视图 4、更新后&#xff0c;发布工作流&#xff0c;完成。

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…

LabVIEW振动筛螺栓松动故障诊断

LabVIEW振动筛螺栓松动故障诊断 概述&#xff1a;利用LabVIEW解决振动筛螺栓松动的故障诊断问题。通过集成的方法&#xff0c;不仅提高了故障检测的准确性&#xff0c;还优化了维护流程&#xff0c;为类似的机械设备故障提供了可靠的解决方案。 由于工作条件复杂&#xff0c;…

如何做标准化?| 京东云技术团队

在现代信息化的市场环境和社会中&#xff0c;标准化已经成为了各种行业的一个重要的标志。标准化不仅可以提升生产效率&#xff0c;减轻质量问题&#xff0c;还可以增加产品的可靠性和互通性。在这篇文章中&#xff0c;我们将探讨如何做标准化&#xff0c;为您提供详细的指导和…