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

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 假地址,程序指针全是它

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

相关推荐
李白的天不白22 分钟前
docker ps
java
NE_STOP1 小时前
Docker--Docker Swarm集群
java
两年半的个人练习生^_^1 小时前
JMM 进阶:彻底理解 CAS 实现原理
java·开发语言
wuminyu1 小时前
Java锁机制之park和unpark源码剖析
java·linux·c语言·jvm·c++
W_LuYi1851 小时前
手撸极简zkEVM验证器:RISC-V电路实践
java·risc-v
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题 第102题】【并发篇】第2题:volatile 能否保证线程安全?
java·安全·面试
KobeSacre2 小时前
JUC 概述
java·开发语言
小bo波2 小时前
形式化方法 × UML
java·软件工程·uml·面向对象·形式化方法·tla+
就叫_这个吧2 小时前
IDEA中Javaweb项目创建+servlet,实现简单的信息录入获取
java·servlet·intellij-idea·web
程序员Jelena3 小时前
接口调用的代码实现:从入门到实战
java