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

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

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

相关推荐
小则又沐风a1 小时前
深入了解进程概念 第二章
java·linux·服务器·前端
程序猿进阶1 小时前
OpenClaw Mac 安装教程
java·macos·ai·架构·agent·openclaw
凯瑟琳.奥古斯特1 小时前
信号分类与特性解析
java·开发语言·职场和发展
JAVA面经实录9171 小时前
JVM 性能监控 + 全链路分析实战 + 性能优化(完整版)
java·jvm
号码认证服务1 小时前
小米、OPPO、VIVO手机支持号码认证显示公司名吗?
java·服务器·网络·经验分享·智能手机·云计算·php
ChoSeitaku2 小时前
06_可变参数_递归_类和对象_封装
java·数据结构·算法
Full Stack Developme2 小时前
Spring Context 解析
java·spring·rpc
爱棋笑谦2 小时前
热部署简述
java
敲代码的瓦龙2 小时前
Android?广播!!!
android·java·开发语言·android-studio