进程地址空间(比特课总结)
一、进程地址空间
1. 环境变量
- 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环
- 境变量会⾃动传递给⼦进程。
- 本地变量限制:本地变量只在当前进程(bash)内有效,⽆法被⼦进程继承,如示例中
- 设置的hello=8888。
- 应⽤场景:
- PATH:帮助bash查找指令路径
- USER:⽤户⾝份认证
- PWD:当前⼯作⽬录信息
2)命令⾏参数
- 参数区分:
- argv[0]:程序名
- argv[1...]:⽤户输⼊的选项参数
- 实际应⽤:类似ls -a -l等命令,通过不同选项触发不同功能
3)环境变量与命令⾏参数的组织⽅式
- 三种获取⽅式:
- getenv()函数:最推荐的标准⽅法
- main()的第三个参数char* env[]
- 外部变量extern char ** environ
- 命令⾏参数表:指针数组存储选项字符串
- 环境变量表:独⽴指针数组存储环境变量
4)本地变量与环境变量对⽐
- 环境变量:可通过env命令查看,被⼦进程继承
- 本地变量:仅set命令可⻅,不被⼦进程继承
2. 虚拟地址空间
1)本地变量与环境变量的区别:
- 本地变量特性:
- 属于shell内部变量,不会被继承到⼦进程
- 通过echo命令可以访问,但env或grep等命令⽆法查看到
- 示例中hello=8888设置后,echo$hello能正确打印,但env grep hello查不到
2)地址空间现象观察
- 异常现象:
- ⽗⼦进程打印相同虚拟地址却得到不同值(⽗进程100/⼦进程300)
- 地址0x40405c和0x10405c显示相同内容但值不同
核⼼结论:
- 打印的地址不是物理地址,⽽是虚拟地址(线性地址/逻辑地址)
- 进程独⽴性通过虚拟地址空间实现,相同虚拟地址可映射不同物理内存
3)虚拟地址空间本质
4)地址空间管理机制
- 内核实现:
- 采⽤"先描述再组织"的管理⽅式
- 本质是内核数据结构mm_struct
- 类⽐员⼯管理:进程需要管理,其地址空间同样需要管理
5)关键结论
- 核⼼认知:
- 地址空间是操作系统给进程画的"⼤饼"
- 通过虚拟地址实现进程间的内存隔离
- 所有打印的地址都是虚拟地址,⾮物理地址
- 实现⽅式:
- 内核通过mm_struct结构体描述地址空间
- 采⽤类似PCB的管理⽅式(先描述再组织)
- 示例中的⽗⼦进程现象正是虚拟地址机制的体现
3. 进程地址空间
1)地址空间的本质
- 内核数据结构:地址空间本质是内核的⼀种数据结构,具体表现为struct mm_struct结
- 构体
- 进程关联性:每个进程都有⾃⼰的PCB和独⽴的地址空间,这是进程管理的基本要素
- 区域划分:地址空间包含代码区、已初始化数据区、未初始化数据区、堆区和栈区等
- 多个功能区域
2)地址空间的成员
- 管理模型:采⽤"先描述,再组织"的管理⽅式,通过数据结构描述地址空间特征
- 核⼼问题:需要明确struct mm_struct结构体包含哪些成员变量来表征不同内存区域
- 类⽐理解:类似于企业中的"画饼"⾏为,本质是在⼤脑中构建蓝图(数据结构对象)
3)32位计算机地址空间
- 基本单位:地址空间描述的基本单位是字节(byte)
- 地址数量:32位系统可产⽣2 32个不同地址(约42亿个)
- 空间范围:2 32 × 1字节 = 4GB地址空间范围
- 唯⼀性保证:每个字节都有唯⼀对应的地址标识
4)地址的唯⼀性
- 地址意义:地址的最⼤价值在于其唯⼀标识性,具体数值形式不重要
- 表示⽅法:⽤32位⼆进制数即可表示所有地址(2 32种组合)
- 编制原理:从全0(0x00000000)到全1(0xFFFFFFFF)连续排列
5)地址的表示
- ⼆进制表示:最低地址为32个0,最⾼地址为32个1
- ⼗六进制表示:地址范围从0x00000000到0xFFFFFFFF
- 递增规律:地址按1字节步⻓递增,如0x00000000→0x00000001→...→0xFFFFFFFF
6)地址空间的编制
- 连续分布:地址从低到⾼连续分布,形成完整的4GB地址空间
- 区域划分:在此连续空间上划分出代码区、数据区、堆栈区等功能区域
- 关键问题:需要区分虚拟地址(C语⾔地址)与实际物理内存地址的关系
4. 尺⼦图像
5. 桌⼦图像
6. 三⼋线划分区域
- 核⼼定义:区域划分即通过明确边界(如课桌的"三⼋线")将整体空间分割为互不⼲
- 扰的独⽴部分。
- 关键特征:
- 唯⼀性:每个⼦区域内的地址/位置必须唯⼀(如课桌刻度1-100每个数字对应唯
- ⼀位置)
- 隔离性:划分后双⽅不得越界使⽤对⽅区域
- 计算机类⽐:类似进程地址空间中stack/heap/code区的划分,每个区域有明确的起始
- 和结束地址。
3)三⼋线划分区域的简单性说明
- 本质理解:复杂的内存区域划分原理可简化为"画根三⼋线"的⾏为,核⼼是确定边界
- 值(如50/51)。
- 实现基础:只需要两个变量即可描述⼀个区域:
- 起始点(如男孩区start=1)
- 结束点(如男孩区end=50)
7. 描述区域
1)数据结构实现
2)技术要点
- 地址唯⼀性:如同课桌刻度需要唯⼀编号,内存中每个字节都必须有唯⼀地址(32位
- 系统为2 32个地址)
- 空间计算:
- 32位系统地址空间:2 32 × 1字节 = 4GB
- 区域⼤⼩公式:end_address − start_address + 1
- 数据类型:使⽤unsigned int保证地址值为⾮负数(类似课桌刻度从1开始编号)
8. 区域调整
1)区域调整的背景故事
2)区域调整的⽅法
struct Destop {
unsigned int nan_start; // 男⽣起始
unsigned int nan_end; // 男⽣结束
unsigned int nv_start; // ⼥⽣起始
unsigned int nv_end; // ⼥⽣结束
};
struct Destop fix = {1,45,55,100}; // 带缓冲区的调整⽅案
3)区域调整的本质
4)区域扩⼤
struct Destop new_d = {1,30,31,100}; // ⼥⽣占据70%空间
5)区域调整总结
- 实现⽅式:
- 缓冲区⽅案:双向让步(各让出部分空间)
- 单边扩张:直接修改⼀⽅边界值
- 编程启示:结构体成员变量的修改直接影响实际空间划分
9. 进程地址空间定义
- 基本概念:进程地址空间默认在32位系统下有2 32个地址,每个地址对应1字节空间,
- 总⼤⼩为4GB。
- 地址特性:
- 每个字节都有唯⼀地址标识
- 地址范围从0000....0000到FFFF FFFF
- 使⽤32位⽆符号整数(unsigned int)表示地址
- 操作系统为进程创建task_struct内核数据结构
- malloc申请struct mm_struct空间
- 设置各区域起始和结束地址
- 代码区:0x11111111 - 0x12111111
- 数据区:0x13000000 - 0x14000000
- 堆区:0x14000001 - 0x15000000
- 栈区:0x7FFFFFFF - 0x8FFFFFFF
- code区:存放可执⾏代码
- data区:包含已初始化数据
- heap区:动态内存分配区域
- stack区:函数调⽤栈空间
- 每个区域包含多个连续地址
- 区域间的地址称为虚拟地址
- 地址唯⼀性是最核⼼要求
- 区域起始和结束地址标记边界
- 区域内每个数字代表⼀个内存位置
- 如同桌⾯刻度标记物品位置
10. 虚拟地址总结
1)地址空间描述
- 基本单位:地址空间描述的基本空间⼤⼩是字节
- 地址数量:32位系统下有2 32个地址
- 空间范围:2 32 × 1字节=4GB空间范围
- 唯⼀性要求:每⼀个字节都要有唯⼀的地址
- 数据结构:通过struct mm_struct结构体管理地址空间
2)虚拟地址概念
- 本质特征:2 32个地址每⼀个都是虚拟地址
- 空间划分:通过code_start/code_end等变量设定虚拟地址空间范围
- 类⽐说明:类似给男⽣⼥⽣划分桌⾯区域(struct Destop d = (1,50,51,100))
3)代码区与数据区
- 固定特性:
- 代码区⼤⼩固定(加载后不会被调整)
- 全局数据区(已初始化/未初始化)⼤⼩固定
- 管理⽅式:通过mm_struct中的code_start/code_end和data_start/data_end管理
4)堆区与栈区
5)区域调整本质
6)扩⼤与缩⼩区域
11. 每个进程的地址空间
- 地址空间划分:32位系统中每个进程拥有4GB虚拟地址空间,由操作系统划分为代码
- 区、数据区、堆区、栈区等不同区域
- 区域描述⽅式:通过结构体struct Destop定义区域边界,包含
- code_start/end、data_start/end、heap_start/end、stack_start/end等字段
- 调整原理:区域调整本质是修改各区域的start或end值,如mm-
- >code_start=0x11111111,mm->code_end=0x12111111
- 内存管理结构:通过mm_struct指针与进程控制块(task_struct)关联,形成"进程-地址
- 空间"的映射关系
12. 任务控制块
1)基本结构
- 核⼼作⽤:操作系统管理进程的核⼼数据结构,包含进程所有运⾏时信息
- 关键字段:
- 进程标识:pid(进程ID)、tgid(线程组ID)
- 状态控制:state(-1不可运⾏/0可运⾏/>0停⽌)、exit_state(退出状态)
- 内存管理:mm指针指向进程地址空间描述结构mm_struct
- 调度信息:prio(动态优先级)、static_prio(静态优先级)、rt_priority(实时优先级)
2)地址空间管理
- mm_struct作⽤:描述进程的虚拟地址空间布局,通过task_struct->mm指针关联
- 关键组成:
- 内存映射:mmap指向虚拟内存区域(VMA)链表,mm_rb是VMA的红⿊树结构
- ⻚表管理:pgd指向⻚全局⽬录,⽤于地址转换
- 空间划分:task_size确定⽤户空间⼤⼩,mmap_base指定内存映射区域基址
- 引⽤计数:mm_users记录⽤户空间使⽤者数量,mm_count为结构体引⽤计数
3)进程关系
- 亲属关系:
- real_parent指向实际⽗进程
- children链表记录所有⼦进程
- sibling链接到⽗进程的⼦进程链表
- 线程组织:group_leader指向线程组主进程,thread_group链接同组线程
- 跟踪机制:ptraced链表记录被ptrace跟踪的进程,ptrace_entry链接到跟踪者的列
- 表
13. 进程的地址空间
1)地址空间的结构
- 内存统计字段:
- total_vm:总虚拟内存⼤⼩
- locked_vm:锁定的内存⼤⼩
- shared_vm:共享内存⼤⼩
- exec_vm:可执⾏内存⼤⼩
- stack_vm:栈区⼤⼩
2)mm_struct结构体
3)进程与地址空间的关系
- 管理关系:进程通过task_struct中的*mm指针关联地址空间
- 区域调整机制:
- 定义局部变量/malloc → 扩⼤栈区或堆区
- 函数返回/free → 缩⼩栈区或堆区
- 本质理解:地址空间是内核维护的数据结构,区域调整即修改各区域的start/end值
- 32位地址空间特点:
- 地址范围:2 32个地址(4GB)
- 每个字节有唯⼀地址
- 通过32位数据即可表示全部地址
4)地址空间与内存的关系
- 虚拟地址:进程视⻆的地址规范
- 物理地址:实际内存硬件地址
- 管理⽅式:通过⻚表建⽴虚拟地址到物理地址的映射关系
相关文章:
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...