【lesson12】理解进程地址空间
文章目录
- 什么是进程地址空间?
- 进程地址空间的作用
- 扩展内容
- 初步理解
- 深入理解
什么是进程地址空间?
故事:
背景:有一个大富豪,家里的存款有10亿美元,他有三个私生子三个人之间彼此互不相识,只有富豪知道他们的存在。
人物介绍:

有一天富豪分别找他们谈话:



从谈话中我们可以看出,富豪分别对他三个儿子画了个大饼。而三个儿子之间也不知道彼此的存在,所以他们就相信了。
我们类比到今天到学习的内容:


那么饼要不要管理呢?
要!
例子:公司的老板给所有人都画过大饼,这天老板给张三说表现不错下次给你升经理。第二天老板又说张三干的不错,昨天我跟你说过干的好升部长没忘记吧。这时候张三懵了,不是经理吗,怎么又变部长了。
所以我们就会明白饼也是要管理的。
如何管理:
先描述,再组织。
内核中的地址空间,本质将来也一定是一种数据结构。将来一定要和特定的进程关联起来
进程地址空间的作用
历史计算机是直接访问物理内存的。

物理内存本身是随时可以被读写的。
而这就导致了一个问题:特别不安全。
如果进程A内的代码要跳转到进程B,这如果进程A崩溃可能也会导致进程B的崩溃,这样进程间就没有独立性了。
现代计算机提出了一下的方式

这是可能就会有人有疑问这不还是要访问物理地址码?
万一虚拟地址是非法的呢?
举故事说明:
背景:过年了张三收到了每个亲戚的压岁钱,加起来一共有五百块。妈妈不放心于是找张三商量。

于是接下来小明有需要的时候,就找妈妈拿钱。


我们可以看到妈妈是可以拒绝我们非法的请求的。

这里我们可以推广到今天讲的内容
张三:虚拟内存
妈妈:映射机制
超市:物理内存
如果地址非法,映射机制禁止映射也变向的保护了物理内存。
虚拟地址究竟是什么?
映射关系的维护究竟是谁做的?
这两个问题之后再讲解。
我们都知道进程地址空间有区域划分,区域被划分为了:代码区、堆区、栈区等等区域,那么如何理解区域划分。
故事理解:
假设小胖和小美是同桌他们共用一张桌子。

而小胖不注意卫生每天脏兮兮的,于是小美就在桌子上画了一条线,让小胖不能越界。

假设桌子长100cm
[0,50]属于小胖
[51,100]属于小美
而小美划分桌子的本质就是在做区域划分。
那么是如何用代码实现区域划分的呢?

每个进程都有地址空间,地址空间是一种内核数据结构,它里面至少要有各个区域的划分。

所以所谓的区域划分本质就是在一个范围里定义start和end,而所谓的范围变化本质就是对end和start进行加或者减一个特定的范围值。
Linux具体的区域划分:



只要做到每个进程的页表,映射的是物理内存的不同区域,就能做到进程直接不会互相干扰,保证进程独立性。
解释初识地址空间博客中的一个现象:
同一地址的g_val有不同的值。

我们可以看到当父进程和子进程分别进行映射的时候,他们各自的页表分别把它们映射到不同的物理地址,所以一个g_val才会有两个值。
而两个进程直接g_val的虚拟地址可以是一样的。
同时也发生了写时拷贝。
这也回答了我们之前学进程的时候fork有两个返回值的问题。

return会被执行两次,return的本质就是对id进行写入,此时就发生了写时拷贝,所以父子进程各自在物理内存中有属于自己的id变量空间。只不过在用户程用同一个变量(虚拟地址)来标识。
扩展内容
初步理解
当我们程序在编译的形成可执行程序,没有被加载到内存中的时候。
请问我们程序内部有地址吗?

我们看到我们并没有运行可执行程序,就已经有地址VMA了,而VAM就是虚拟地址空间。
所以可执行程序编译的时候内部其实已经有地址了!
所以地址空间不仅仅是OS内部要遵守,其实编译器也要遵守!
即编译器编译代码的时候,就已经给我们形成了各个区域:代码区,数据区等等。并且采用和Linux内核中一样的编址方式,给每个变量,每一行代码都进行了编址。故程序在编译的时候,每一个字段早已经具有了一个虚拟地址!!!

程序内部的地址依旧用的是编译器编译好的虚拟地址。
当程序加载到内存的时候,每行代码,每个变量具有了一个物理内存地址。
当CPU读到指令的时候指令内部有地址,这个地址就是虚拟地址。
深入理解

这里就有问题地址空间和业表最开始的时候数据是从哪里来的?
当数据要被加载到内存的时候,可执行程序要用编译好的虚拟地址填充进入其中。
每一个函数和变量都有地址->编译器给的
同样的也一定被加载带物理内存中。
相关文章:
【lesson12】理解进程地址空间
文章目录 什么是进程地址空间?进程地址空间的作用扩展内容初步理解深入理解 什么是进程地址空间? 故事: 背景:有一个大富豪,家里的存款有10亿美元,他有三个私生子三个人之间彼此互不相识,只有富…...
计算机里的神灵(SCIP)
计算机程序的构造和解释 我找到计算机里的神灵了,开心一刻 下面是从MIT官网下载的 SCIP求值器(解释器)的代码,这个官网是个宝藏库 还有其他视频课程和 SCIP的问题答案和可运行代码 链接:https://ocw.mit.edu/courses/6…...
基于微信小程序的公交信息在线查询系统小程序设计与实现(源码+lw+部署文档+讲解等)
文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…...
【STM32】IAP升级01 bootloader实现以及APP配置(主要)
APP程序以及中断向量表的偏移设置 前言 通过之前的了解 之前的了解,我们知道实现IAP升级需要两个条件: 1.APP程序必须在 IAP 程序之后的某个偏移量为 x 的地址开始; 2.APP程序的中断向量表相应的移动,移动的偏移量为 xÿ…...
ruoyi(若依)接口拦截路径配置,接口访问要授权,放开授权直接访问
1.找到文件SecurityConfig.java文件,里面配置相应的放行路径...
Ctfshow web入门 XSS篇 web316-web333 详细题解 全
CTFshow XSS web316 是反射型 XSS 法一: 利用现成平台 法二: 自己搭服务器 先在服务器上面放一个接受Cookie的文件。 文件内容: <?php$cookie $_GET[cookie];$time date(Y-m-d h:i:s, time());$log fopen("cookie.txt"…...
watch()监听vue2项目角色权限变化更新挂载
<template><div><el-form:model"updateRole"ref"roleForm"label-width"100px"label-position"right"style"width: 400px":rules"roleRules"><el-form-item label"角色名称" prop&…...
轻量化设计、佩戴更舒适——轻律 Umelody U1头戴式蓝牙耳机
头戴式耳机不像以前那么笨重,身边很多人都在用,而且拍照还巨出片,拍照累了还能听歌放松,何乐而不为,国庆节即将来临,秋冬季节也就快要到了,棕色在合适不过了,最近有一款高颜值的复古…...
嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作
嵌入式Linux应用开发-基础知识-第三章 LED原理图-GPIO及操作 第三章 硬件知识_LED 原理图3.1 先来讲讲怎么看原理图 第四章 普适的 GPIO 引脚操作方法4.1 GPIO 模块一般结构4.2 GPIO 寄存器操作4.3 GPIO 的其他功能:防抖动、中断、唤醒 第五章 具体单板的 GPIO 操作…...
外贸人员如何选择适合的邮箱服务
随着互联网和数字技术的快速发展,电子邮件已经成为商务沟通的主要方式之一。对于外贸人员来说,选择一个合适且高效的邮箱服务至关重要。本文将探讨外贸人员在选择外贸邮箱时应考虑的因素,以便找到最适合自己的解决方案。 “外贸人员如何选择合…...
pt29django教程
文件上传 文件上传必须为POST提交方式, 表单<form>中文件上传时必须有带有enctype"multipart/form-data" 时才会包含文件内容数据。 表单中用<input type"file" name"xxx">标签上传文件 名字xxx对应request.FILES[xx…...
【操作系统笔记七】进程和线程
进程的组成 进程要读取 ELF 文件,那么: ① 要知道文件系统的信息,fs_struct② 要知道打开的文件的信息,files_struct 一个进程除了需要读取 ELF 文件外,还可以读取其他的文件中的数据。 进程中肯定有一个 mm_struct…...
Kakfa高效读写数据
1.概述 无论 kafka 作为 MQ 也好,作为存储层也罢,无非就是两个功能:一是 Producer 生产的数据存到 broker,二是 Consumer 从 broker 读取数据。那 Kafka 的快也就体现在读写两个方面了,本文也是从这两个方面去剖析Kafk…...
C++ 类和对象(4)构造函数
C的目标之一是让使用类对象就像使用标准类型一样,但是常规的初始化语法不适用于类似类型Stock: int year 2001; struct thing {char * pn;int m; }; thing amabob {"wodget",-23}; //有效初始化 Stock hot {"Sukies Autos…...
数据结构————广度寻路算法 Breadth First Search(广度优先算法)
(一)基础补充 二叉树的基本定义 1)二叉树就是度不超过2的树,其每个结点最多有两个子结点 2)二叉树的结点分为左结点和右结点 代码实现二叉树 #include <stdio.h> #include <stdlib.h> struct Node {int data;struct Node* pLeft;struct Node* pRight; }…...
安卓桌面记事本便签软件哪个好用?
日常生活及工作中,很多人常常会遇到一些一闪而现的灵感,这时候拿出手机想要记录时,却找不到记录的软件。在这个快节奏的时代,安卓手机是我们日常生活不可或缺的伙伴。然而,正因为我们的生活如此忙碌,记事变…...
河北吉力宝以步力宝健康鞋引发的全新生活生态商
在当今瞬息万变的商业世界中,成功企业通常都是那些不拘泥于传统、勇于创新的先锋之选。河北吉力宝正是这样一家企业,通过打造一双步力宝健康鞋,他们以功能性智能科技穿戴品为核心,成功创造了一种结合智能康养与时尚潮流的独特产品…...
反射获取Constructor、Field、Method对象
1、获取构造器 Constructor [ ] getConstructor s ( ) 获取全部的构造器:只能获取 public 修饰的构造器 package com.csdn.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.junit.Test; import jav…...
【Netty】 ByteBuf的常用API总结
目录 一、ByteBuf介绍 二、ByteBuf创建 1.池化创建 ByteBufAllocator 2.Unpooled (非池化)创建ByteBuf 3.ByteBufUtil 操作ByteBuf 三、读取ByteBuf数据 1.get方法 2.read方法 3.set方法 4.write方法 5.索引管理 6.索引查找 7.索引查找 8.其…...
热门敏捷开发管理工具
敏捷管理研发工具可以协助团队更好地进行敏捷开发和管理。以下是几种流行的敏捷管理研发工具: Leangoo:Leangoo领歌一款永久免费的专业敏捷研发管理工具,它覆盖了敏捷项目研发全流程,包括小型团队敏捷开发,规模化敏捷…...
扶摇速记:眼前流水,曲折前向
英语单词 went,意为【走】或走【去】,它是动词 go 的过去式。 went v. (go过去式) 去,走 我们可以这样去理解,其中 -t,表动词,是构词语法形式,含义主要来自wen-,而went 或 wen-的首字…...
从魔方到算法:用Python一步步实现Kociemba二阶段算法(附完整代码)
从魔方到算法:用Python实现Kociemba二阶段求解器 魔方作为经典的智力玩具,其求解算法一直是计算机科学和数学交叉领域的研究热点。本文将带你从零开始,用Python实现经典的Kociemba二阶段算法,不仅理解其数学原理,更能获…...
基于三菱PLC和组态王的恒温控制系统:加热炉温度控制设计-含梯形图程序、接线图原理图及IO分配...
基于三菱PLC和组态王恒温控制系统的设计加热炉温度控制 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面三伏天里给车间加热炉做恒温控制,那酸爽就跟抱着暖气片吃火锅似的。今天咱们来聊聊基于三菱FX3U PLC和组态王的温度控…...
从MATLAB到Python:我如何把那个课程大作业的OCR算法“移植”并优化了一遍
从MATLAB到Python:OCR算法迁移与优化的实战指南 第一次用Python重写那个折磨我两周的MATLAB大作业时,我盯着屏幕上完全不同的函数名发愣——原来imbinarize在OpenCV里要拆成threshold加THRESH_OTSU,而曾经熟悉的形态学操作现在要面对getStruc…...
MPR121电容触摸传感器驱动与抗干扰工程实践
1. MPR121电容式接近/触摸传感器控制器深度技术解析 MPR121是由NXP Semiconductors(原Freescale)推出的12通道电容式触摸与接近感应专用协处理器芯片,广泛应用于STM32、ESP32、nRF52等主流MCU平台的嵌入式人机交互系统中。该器件并非通用IC外…...
og3x-shtc3:ESP32/ESP8266平台SHTC3温湿度传感器驱动库
1. 项目概述og3x-shtc3是一个面向 ESP32/ESP8266 平台、专为og3(Open Gateway 3)固件生态设计的轻量级传感器驱动扩展库,核心目标是为 SHTC3 数字温湿度传感器提供完整、可靠且低功耗的 Arduino 框架兼容支持。该库并非独立运行的传感器 SDK&…...
9. C++14新特性-std::tuple 的按类型寻址 (Type-based Tuple Addressing)
一、引言在现代 C 中,当我们想要在一个函数中返回多个不同类型的值,或者临时打包几个数据时,std::tuple(元组)是最标准的容器。然而,C11 提供的基于索引的元组访问方式,在工程实践中暴露出严重的…...
FreeRADIUS配置踩坑记:当LDAP用户遇上Google Authenticator,如何解决PAM模块的那些‘坑’?
FreeRADIUS与LDAP集成Google Authenticator的实战避坑指南 当企业安全团队决定为远程访问系统部署双因素认证时,FreeRADIUS与LDAP集成Google Authenticator的方案常被列为优选。但真正实施时,技术细节中的"魔鬼"往往让工程师们夜不能寐。本文将…...
怎样高效激活Windows和Office:KMS_VL_ALL_AIO智能激活脚本完整指南
怎样高效激活Windows和Office:KMS_VL_ALL_AIO智能激活脚本完整指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO KMS_VL_ALL_AIO是一款强大的智能激活脚本,专门用于Win…...
SSN在LiDAR目标检测环境配置、SSN在LiDAR目标检测模型代跑训练、SSN在LiDAR目标检测模型改进创新SSN在LiDAR目标检测环境配置:Windows、Ubuntu、Centos、
SSN在LiDAR目标检测环境配置、 SSN在LiDAR目标检测模型代跑训练、 SSN在LiDAR目标检测模型改进创新 SSN在LiDAR目标检测环境配置:Windows、Ubuntu、Centos、Macos等系统环境,如果电脑拥有显卡,可配置GPU版本的SSN在LiDAR环境。 SSN在LiDAR目标…...
