四类地址 逻辑地址 线性地址 虚拟地址 物理地址

32 位系统 地址总线 & 数据总线 标准位数
1. 地址总线

32 根地址线(32 位地址总线)

作用:发字节编号

寻址能力:2 的32次方个字节 = 4GB 字节空间

只能定位到第几个字节,到不了字节内部 bit

2. 数据总线

32 根数据线(32 位数据总线)
一次能并行传输 32 bit

等价:一次最少传 1 字节,常态一次传 4 字节

不能单独只传 1 个 bit,最小传输粒度硬件层面就是整字节

极简对应

地址总线 32 位 → 给字节编门牌号,定位置

数据总线 32 位 → 批量搬运字节里的二进制比特

想抠单个 bit:只能 CPU 拿到整段数据后,软件移位运算拆分

32 位地址能编号 2 的32次方个字节byte,所以总空间是 4GB 字节

地址只管定位到哪个字节,不管字节内部 8 个比特

寻址最小单位 = 1 字节

每个内存地址,唯一对应1 个字节,不能单独给某一个 bit 分配地址,没法直接定位第几位。

数据存储最小单位 = 1 比特 bit

1 字节 = 8bit,存数据拆成 bit,但不能按 bit 寻址读写。

链接视角:基址 + 程序内偏移(用来算出完整虚拟地址)

内存分页视角:页号 + 页内偏移(把算好的虚拟地址拆分,用来映射物理内存)

  1. 第一步:算出完整虚拟地址(编译 + 加载)
    公式:
    虚拟地址 = 加载基地址 + 编译链接出来的相对偏移
    例子:
    基地址0x400000 + 变量偏移0x200 = 0x400200
    此时得到完整 32 位虚拟地址,属于进程 0~4GB 空间。
  2. 第二步:拆分这个虚拟地址做内存映射
    页面大小 4KB=2 的12次方 byte,所以把上面算好的完整虚拟地址,按二进制高低位切开:
    高 20 位:页号
    低 12 位:页内偏移(范围 0~4095,只在单页内部寻址)
    以 0x400200 举例:
    完整虚拟地址:0x400200
    右移 12 位 = 页号
    和0xFFF按位与 = 页内偏移 0x200
  3. 两层用途分清
    基址 + 程序偏移:凑出整个虚拟地址,解决「这个变量在进程 4GB 空间里第几号地址」
    页号 + 页内偏移:拆分已有的虚拟地址,交给 MMU 硬件查页表,翻译成物理地址

编译:只生成代码 / 变量相对文件头偏移

链接:合并成整个程序统一内部偏移

运行加载:OS 分配虚拟加载基址,相加得到最终虚拟地址

现代系统段基址置 0 → 虚拟地址 = 线性地址

CPU 自动把该地址拆成页号 + 12 位页内偏移

页表查询 → 拼接出物理地址

先靠「基址 + 偏移」造出虚拟地址,

再用「页号 + 页内偏移」拆解虚拟地址做硬件地址翻译

32 位地址 = 最多能编址 4GB

2的32次方 =4294967296字节 = 4GB

地址编号就这么多,理论上限就是 4GB。

OS 直接把完整 0~4GB 地址区间,单独划分给每一个进程

进程写代码、用指针,只能看见这 4GB 范围,天然以为整片都是自己的。

进程视角:我坐拥整整 4GB 内存,随便用

系统视角:靠页表映射,把多个进程的 4GB 虚拟地址,挤在实际很小的物理内存里

不是真给每个进程 4GB 物理内存,只是地址编号上限是 4GB,拿来做虚拟空间而已

精简总结

32 位地址最多只能表示 4GB 地址 → 操作系统就拿这个最大范围,当成每个进程独立的虚拟地址空间,所以进程都以为自己独占 4GB。

四类地址总结

一、基础换算

32 位地址:2 的32次方= 4GB,进程虚拟地址空间上限固定 4GB。

4GB/4KB=1024*1024=2的20次方 表示页号

页内偏移量:2 的12次方=4KB,虚拟地址低 12 位为页内偏移。

二、四类地址定义 + 转换流程

完整流程:

逻辑地址 → 分段 → 线性地址 → 分页 → 物理地址
1. 逻辑地址

格式:段基址:段内偏移

老式 16 位 / 早期保护模式用法,把地址拆成两部分;

现代操作系统废弃实用分段,仅保留概念

2. 线性地址

段基址 + 段内偏移 计算得出;

位置:分段结束,分页还没开始;

因合并后是连续一维直线地址,故称线性地址。

3. 虚拟地址

编译器:只生成相对偏移

操作系统:加载时分配虚拟地址

虚拟地址:运行时才有,进程独有 4GB

编译只出偏移量,运行时操作系统给程序定一个虚拟起始基地址,两者相加,直接算出最终使用的虚拟地址

现代系统统一把所有段基址设为 0

所以:段内偏移 = 线性地址 = 虚拟地址

范围:0 ~ 4GB,每个进程独立拥有一整套

进程视角:以为自己独占整块 4GB 内存

系统视角:只是虚拟编号,不占用真实物理内存

拆分:虚拟地址 = 高位页号 + 低 12 位页内偏移(4KB 内)

两个偏移不冲突:

全局段内偏移= 整个 4GB 虚拟地址;

低位页内偏移= 单页 4KB 内部地址。
4. 物理地址

内存条上真实硬件地址;
由操作系统通过页表,把虚拟 / 线性地址映射转换而来;

所有进程虚拟空间,最终复用同一片物理内存。

三、最简等价关系(32 位现代 OS)

逻辑地址(废弃)→ 段基址置 0 → 线性地址 = 虚拟地址 → 页表映射 → 物理地址

四、一句话记忆

逻辑:拆分两段的老式地址

线性:分段合并后的连续直线地址

虚拟:进程独享 0~4GB 假地址,程序指针全是它

物理:内存条真实地址,系统底层才使用

相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java
莫逸风13 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
z1234567898614 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
yaoxin52112314 小时前
470. Java 反射 - Member 接口与 AccessFlag
java·开发语言·python
做个文艺程序员14 小时前
Linux第24篇:Java应用监控体系搭建:Prometheus+Grafana可视化运维
java·grafana·prometheus