当前位置: 首页 > news >正文

进程地址空间(比特课总结)

一、进程地址空间 

1. 环境变量 

1 )⽤户级环境变量与系统级环境变量  
  • 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环
  • 境变量会⾃动传递给⼦进程。
  • 本地变量限制:本地变量只在当前进程(bash)内有效,⽆法被⼦进程继承,如示例中
  • 设置的hello=8888
  • 应⽤场景
  • PATH:帮助bash查找指令路径
  • USER:⽤户⾝份认证
  • PWD:当前⼯作⽬录信息

2)命令⾏参数 

  1. 参数区分
  2. argv[0]:程序名
  3. argv[1...]:⽤户输⼊的选项参数
  4. 实际应⽤:类似ls -a -l等命令,通过不同选项触发不同功能

3)环境变量与命令⾏参数的组织⽅式

  1. 三种获取⽅式
  2. getenv()函数:最推荐的标准⽅法
  3. main()的第三个参数char* env[]
  4. 外部变量extern char ** environ
  • 命令⾏参数表:指针数组存储选项字符串
  • 环境变量表:独⽴指针数组存储环境变量

4)本地变量与环境变量对⽐

  • 环境变量:可通过env命令查看,被⼦进程继承
  • 本地变量:仅set命令可⻅,不被⼦进程继承

2. 虚拟地址空间

1)本地变量与环境变量的区别:

  • 本地变量特性
  • 属于shell内部变量,不会被继承到⼦进程
  • 通过echo命令可以访问,但envgrep等命令⽆法查看到
  • 示例中hello=8888设置后,echo$hello能正确打印,但env grep hello查不到

2)地址空间现象观察

  • 异常现象
  • ⽗⼦进程打印相同虚拟地址却得到不同值(⽗进程100/⼦进程300
  • 地址0x40405c0x10405c显示相同内容但值不同

核⼼结论

  1. 打印的地址不是物理地址,⽽是虚拟地址(线性地址/逻辑地址)
  2. 进程独⽴性通过虚拟地址空间实现,相同虚拟地址可映射不同物理内存

3)虚拟地址空间本质

感性理解
进程认为⾃⼰独占系统资源(实际是操作系统制造的假象)
类⽐⼤富翁Peter给三个⼉⼦各画"⼗个亿美⾦"的蓝图
操作系统实现:
为每个进程创建独⽴的虚拟地址空间"⼤饼"
进程如同"私⽣⼦"彼此不知对⽅存在

4)地址空间管理机制

画饼原理:
需要记录所有画过的"饼"(维护蓝图数据结构)
示例:⽼板需要记住给500个员⼯画过的不同饼
  • 内核实现
  • 采⽤"先描述再组织"的管理⽅式
  • 本质是内核数据结构mm_struct
  • 类⽐员⼯管理:进程需要管理,其地址空间同样需要管理

5)关键结论

  • 核⼼认知
  • 地址空间是操作系统给进程画的"⼤饼"
  • 通过虚拟地址实现进程间的内存隔离
  • 所有打印的地址都是虚拟地址,⾮物理地址
  • 实现⽅式
  • 内核通过mm_struct结构体描述地址空间
  • 采⽤类似PCB的管理⽅式(先描述再组织)
  • 示例中的⽗⼦进程现象正是虚拟地址机制的体现

3. 进程地址空间 

1)地址空间的本质 

  • 内核数据结构:地址空间本质是内核的⼀种数据结构,具体表现为struct mm_struct
  • 构体
  • 进程关联性:每个进程都有⾃⼰的PCB和独⽴的地址空间,这是进程管理的基本要素
  • 区域划分:地址空间包含代码区、已初始化数据区、未初始化数据区、堆区和栈区等
  • 多个功能区域

2)地址空间的成员 

  • 管理模型:采⽤"先描述,再组织"的管理⽅式,通过数据结构描述地址空间特征
  • 核⼼问题:需要明确struct mm_struct结构体包含哪些成员变量来表征不同内存区域
  • 类⽐理解:类似于企业中的"画饼"⾏为,本质是在⼤脑中构建蓝图(数据结构对象)

332位计算机地址空间 

  • 基本单位:地址空间描述的基本单位是字节(byte
  • 地址数量32位系统可产⽣2 32个不同地址(约42亿个)
  • 空间范围2 32 × 1字节 = 4GB地址空间范围
  • 唯⼀性保证:每个字节都有唯⼀对应的地址标识

4)地址的唯⼀性 

  • 地址意义:地址的最⼤价值在于其唯⼀标识性,具体数值形式不重要
  • 表示⽅法:⽤32位⼆进制数即可表示所有地址(2 32种组合)
  • 编制原理:从全00x00000000)到全10xFFFFFFFF)连续排列

5)地址的表示 

  • ⼆进制表示:最低地址为320,最⾼地址为321
  • ⼗六进制表示:地址范围从0x000000000xFFFFFFFF
  • 递增规律:地址按1字节步⻓递增,如0x000000000x00000001...0xFFFFFFFF

6)地址空间的编制 

  • 连续分布:地址从低到⾼连续分布,形成完整的4GB地址空间
  • 区域划分:在此连续空间上划分出代码区、数据区、堆栈区等功能区域
  • 关键问题:需要区分虚拟地址(C语⾔地址)与实际物理内存地址的关系

4. 尺⼦图像

教学⽤途 : 尺⼦在此处仅作为形象化的教学⼯具使⽤,具体刻度等细节并不重要
使⽤说明 : 教师强调只需保留尺⼦的基本外形特征即可满⾜教学演示需求

5. 桌⼦图像

选取标准 : 选择桌⾯部分作为主要演示对象,其他结构特征可以简化
教学作⽤ : 与尺⼦图像配合使⽤,共同构建教学所需的视觉化场景

6. 三⼋线划分区域 

1 )三⼋线划分区域的⼩故事引⼊  
⽣活实例 :通过⼩学同桌划分课桌的案例,⽣动说明区域划分的概念。⼥孩因男孩邋
遢且欺负她,在 100 厘⽶宽的课桌中间画线( 1-50 归男孩, 51-100 归⼥孩),并警告越
界后果。
⾏为映射:该⾏为本质上是通过物理界限明确双⽅使⽤范围,类似计算机内存管理中
划分不同程序的内存区域。
2 三⼋线划分区域的概念  
  • 核⼼定义:区域划分即通过明确边界(如课桌的"三⼋线")将整体空间分割为互不⼲
  • 扰的独⽴部分。
  • 关键特征:
  • 唯⼀性:每个⼦区域内的地址/位置必须唯⼀(如课桌刻度1-100每个数字对应唯
  • ⼀位置)
  • 隔离性:划分后双⽅不得越界使⽤对⽅区域
  • 计算机类⽐:类似进程地址空间中stack/heap/code区的划分,每个区域有明确的起始
  • 和结束地址。

3)三⼋线划分区域的简单性说明 

  • 本质理解:复杂的内存区域划分原理可简化为"画根三⼋线"的⾏为,核⼼是确定边界
  • 值(如50/51)。
  • 实现基础:只需要两个变量即可描述⼀个区域:
  • 起始点(如男孩区start=1
  • 结束点(如男孩区end=50

7. 描述区域 

1)数据结构实现

结构体设计
赋值示例
男孩区: [ 1 , 50 ]
⼥孩区: [ 51 , 100 ]
扩展应⽤ :该模式可直接迁移到内存管理中的 mm_struct 结构体设计,通过 start/end
段描述不同内存区域范围。

2)技术要点

  • 地址唯⼀性:如同课桌刻度需要唯⼀编号,内存中每个字节都必须有唯⼀地址(32
  • 系统为2 32个地址)
  • 空间计算
  • 32位系统地址空间:2 32 × 1字节 = 4GB
  • 区域⼤⼩公式:end_address start_address + 1
  • 数据类型:使⽤unsigned int保证地址值为⾮负数(类似课桌刻度从1开始编号)

8. 区域调整 

1)区域调整的背景故事

冲突背景 :男孩和⼥孩共⽤⼀张桌⼦,原划分区域为男孩 [ 1 , 50 ] ,⼥孩 [ 51 , 100 ] ,但
男孩经常⽆意越界
初始解决⽅案 :⼥孩提出设置 10 厘⽶缓冲带(男孩让出 5 厘⽶,⼥孩让出 5 厘⽶),调
整后男孩 [ 1 , 45 ] ,⼥孩 [ 55 , 100 ]

2)区域调整的⽅法 

数据结构 :使⽤ struct Destop 定义区域边界
代码示例:
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)区域调整的本质 

核⼼操作:通过修改区域的start和end值实现调整
技术要点
减⼩⼀个区域的end
增⼤另⼀个区域的start
两者配合形成缓冲区

4)区域扩⼤ 

极端调整 :⼥孩⽣⽓后取消缓冲区,直接重新划分
struct Destop new_d = {1,30,31,100}; // ⼥⽣占据70%空间

调整特点
男⽣区域从 45 缩减到 30
⼥⽣区域从 45 扩⼤到 70
完全取消中间缓冲带

5)区域调整总结 

核⼼思想:通过修改边界值实现空间重新分配
  • 实现⽅式
  • 缓冲区⽅案:双向让步(各让出部分空间)
  • 单边扩张:直接修改⼀⽅边界值
  • 编程启示:结构体成员变量的修改直接影响实际空间划分

9. 进程地址空间定义 

  • 基本概念:进程地址空间默认在32位系统下有2 32个地址,每个地址对应1字节空间,
  • 总⼤⼩为4GB
  • 地址特性:
  • 每个字节都有唯⼀地址标识
  • 地址范围从0000....0000FFFF FFFF
  • 使⽤32位⽆符号整数(unsigned int)表示地址
结构体表示
1)创建地质空间时的⼯作 
初始化过程
  1. 操作系统为进程创建task_struct内核数据结构
  2. malloc申请struct mm_struct空间
  3. 设置各区域起始和结束地址
  4. 代码区:0x11111111 - 0x12111111
  5. 数据区:0x13000000 - 0x14000000
  6. 堆区:0x14000001 - 0x15000000
  7. 栈区:0x7FFFFFFF - 0x8FFFFFFF
类⽐说明 :如同将 100 厘⽶的桌⼦划分区域,每个厘⽶刻度对应⼀个地址
2)任务结构体分析
关键字段:
  1. code区:存放可执⾏代码
  2. data区:包含已初始化数据
  3. heap区:动态内存分配区域
  4. stack区:函数调⽤栈空间
区域特性:
  1. 每个区域包含多个连续地址
  2. 区域间的地址称为虚拟地址
  3. 地址唯⼀性是最核⼼要求
调整机制:
虚拟地址本质:
  1. 区域起始和结束地址标记边界
  2. 区域内每个数字代表⼀个内存位置
  3. 如同桌⾯刻度标记物品位置
重要说明
32位系统默认使⽤32位地址空间
区域划分是逻辑概念,实际物理内存可能不同
地址空间管理是操作系统核⼼功能之⼀

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_enddata_start/data_end管理

4)堆区与栈区

动态特性:
堆区可通过malloc/new动态调整⼤⼩
栈区随函数调⽤/局部变量定义动态变化
调整⽅式:通过修改heap_start/heap_end和stack_start/stack_end实现

5)区域调整本质

核⼼机制:修改各区域的startend
具体操作:
扩⼤栈区:增加stack_end值(如加40字节)
扩⼤堆区:增加heap_end
类⽐说明:类似调整桌⾯区域划分(struct Destop new_d = (1,30,31,100)

6)扩⼤与缩⼩区域 

扩⼤场景
函数调⽤ / 定义局部变量(栈区)
malloc/new 操作(堆区)
缩⼩场景
函数调⽤结束(栈区)
free 操作(堆区)
本质操作 :改写 mm_struct 中的对应数值变量
类⽐理解 :类似调整 " 三⼋线 " 划分区域

11. 每个进程的地址空间 

  • 地址空间划分32位系统中每个进程拥有4GB虚拟地址空间,由操作系统划分为代码
  • 区、数据区、堆区、栈区等不同区域
  • 区域描述⽅式:通过结构体struct Destop定义区域边界,包含
  • code_start/enddata_start/endheap_start/endstack_start/end等字段
  • 调整原理:区域调整本质是修改各区域的startend值,如mm-
  • >code_start=0x11111111mm->code_end=0x12111111
  • 内存管理结构:通过mm_struct指针与进程控制块(task_struct)关联,形成"进程-地址
  • 空间"的映射关系

12. 任务控制块 

1)基本结构

  1. 核⼼作⽤:操作系统管理进程的核⼼数据结构,包含进程所有运⾏时信息
  2. 关键字段
  3. 进程标识pid(进程ID)tgid(线程组ID)
  4. 状态控制state(-1不可运⾏/0可运⾏/>0停⽌)exit_state(退出状态)
  5. 内存管理mm指针指向进程地址空间描述结构mm_struct
  6. 调度信息prio(动态优先级)static_prio(静态优先级)rt_priority(实时优先)

2)地址空间管理

  1. mm_struct作⽤:描述进程的虚拟地址空间布局,通过task_struct->mm指针关联
  2. 关键组成
  3. 内存映射mmap指向虚拟内存区域(VMA)链表,mm_rbVMA的红⿊树结构
  4. ⻚表管理pgd指向⻚全局⽬录,⽤于地址转换
  5. 空间划分task_size确定⽤户空间⼤⼩,mmap_base指定内存映射区域基址
  6. 引⽤计数mm_users记录⽤户空间使⽤者数量,mm_count为结构体引⽤计数

3)进程关系

  • 亲属关系:
  • real_parent指向实际⽗进程
  • children链表记录所有⼦进程
  • sibling链接到⽗进程的⼦进程链表
  • 线程组织group_leader指向线程组主进程,thread_group链接同组线程
  • 跟踪机制ptraced链表记录被ptrace跟踪的进程,ptrace_entry链接到跟踪者的列

13. 进程的地址空间 

1)地址空间的结构 

核⼼数据结构:进程地址空间由内核数据结构mm_struct描述,包含多个关键字段
  • 内存统计字段
  • total_vm:总虚拟内存⼤⼩
  • locked_vm:锁定的内存⼤⼩
  • shared_vm:共享内存⼤⼩
  • exec_vm:可执⾏内存⼤⼩
  • stack_vm:栈区⼤⼩
区域边界字段:
start_code/end_code:代码区起⽌地址
start_data/end_data:数据区起⽌地址
start_brk/brk:堆区当前和结束地址
start_stack:栈区起始地址
arg_start/arg_end:命令⾏参数区
env_start/env_end:环境变量区

2mm_struct结构体 

内存管理单元
*mmap:指向VMA链表头
mm_rbVMA红⿊树根节点o
mmap_cache:最近使⽤的VMA缓存
地址分配相关
get_unmapped_area:获取未映射区域函数指针
mmap_basemmap区域基地址
task_size:任务虚拟内存空间⼤⼩
引⽤计数
mm_users:⽤户空间计数
mm_count:结构体引⽤计数
同步机制
mmap_sem:内存映射读写信号量
page_table_lock:⻚表⾃旋锁

3)进程与地址空间的关系

  • 管理关系:进程通过task_struct中的*mm指针关联地址空间
  • 区域调整机制
  • 定义局部变量/malloc → 扩⼤栈区或堆区
  • 函数返回/free → 缩⼩栈区或堆区
  • 本质理解:地址空间是内核维护的数据结构,区域调整即修改各区域的start/end
  • 32位地址空间特点
  • 地址范围:2 32个地址(4GB
  • 每个字节有唯⼀地址
  • 通过32位数据即可表示全部地址

4)地址空间与内存的关系

关键问题:同⼀虚拟地址在不同进程中可能指向不同物理内存
现象解释
⽗⼦进程读取相同地址得到不同值
证明地址空间是虚拟的抽象层
  • 虚拟地址:进程视⻆的地址规范
  • 物理地址:实际内存硬件地址
  • 管理⽅式:通过⻚表建⽴虚拟地址到物理地址的映射关系

相关文章:

  • python如何将word的doc另存为docx
  • 保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
  • 提取目标区域的Argo剖面数据(nc)
  • 如何做接口测试(详解)
  • 亚马逊测评,采购环境安全需要解决哪些问题,提高成功率
  • el-select下拉框 添加 el-checkbox 多选框
  • 无人机侦测与反制技术的进展与应用
  • 第一季度过程
  • 微服务商城-商品微服务
  • (原创改进)73-CEEMDAN-VMD-SSA-LSSVM功率/风速时间序列预测!
  • matlab自控仿真【第一弹】❀传递函数和输出时域表达式
  • 设计模式作业
  • 分布式系统简述
  • 03_跨域问题解决
  • [尚庭公寓]01-项目概述
  • PKIX path building failed问题小结
  • 向量几何的二元性:叉乘模长与内积投影的深层联系
  • Flutter状态管理框架RiverPod入门
  • rk3506上移植lvgl应用
  • ui框架-文件列表展示
  • 手机端网站建设的注意事项/百度风云榜游戏
  • 高端网站建设 j磐石网络/seo哪家公司好
  • 受欢迎的邢台做网站/腾讯域名注册官网
  • 泰安哪家做网站好/快速网站seo效果
  • 怎么弄网站/优化模型数学建模
  • 济南企业建站系统/a5站长网