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 寻址读写。
链接视角:基址 + 程序内偏移(用来算出完整虚拟地址)
内存分页视角:页号 + 页内偏移(把算好的虚拟地址拆分,用来映射物理内存)
- 第一步:算出完整虚拟地址(编译 + 加载)
公式:
虚拟地址 = 加载基地址 + 编译链接出来的相对偏移
例子:
基地址0x400000 + 变量偏移0x200 = 0x400200
此时得到完整 32 位虚拟地址,属于进程 0~4GB 空间。 - 第二步:拆分这个虚拟地址做内存映射
页面大小 4KB=2 的12次方 byte,所以把上面算好的完整虚拟地址,按二进制高低位切开:
高 20 位:页号
低 12 位:页内偏移(范围 0~4095,只在单页内部寻址)
以 0x400200 举例:
完整虚拟地址:0x400200
右移 12 位 = 页号
和0xFFF按位与 = 页内偏移 0x200 - 两层用途分清
基址 + 程序偏移:凑出整个虚拟地址,解决「这个变量在进程 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 假地址,程序指针全是它
物理:内存条真实地址,系统底层才使用