14位内存地址如何访问?C语言中如何表示14位物理内存地址?
非8整数倍位宽地址的表示与寻址实现
不存在“地址位宽必须为8的整数倍才能使用字节寻址”的规则,地址位宽只决定可寻址的单元总数,和寻址单位、数值表示规则没有强制绑定。
地址的数值表示规则
- 十六进制表示的本质是二进制的简写,单十六进制位对应4位二进制,地址位宽不需要凑成4的整数倍、更不需要凑成8的整数倍,直接按二进制位的实际取值计算最大值即可:
- 14位地址的最大值为
2^14 - 1 = 16383 = 0x3FFF,对应16384个可寻址单元,你之前写的0xFFF是12位地址的最大值,属于位宽计算错误。
- 14位地址的最大值为
对照参考:16位地址最大值为
2^16 -1 = 0xFFFF,对应65536个可寻址单元,和你已知的规则一致。如果是字节寻址模式,这个值就对应64KiB内存空间。
- 实际硬件实现上,14位物理地址只会引出14根地址线,虚拟地址转换后高于14位的部分要么被硬件直接忽略,要么由内存管理单元做越界校验,不会参与物理内存的译码。
寻址机制说明
- 字节寻址的核心定义是每个唯一地址对应1字节(8bit)的存储单元,这个规则和地址总共有多少位完全无关。14位位宽的地址总线完全可以正常实现字节寻址,此时物理内存总容量为16KiB,每个地址对应1字节,访问逻辑和16位/32位/64位地址的字节寻址没有区别。
- 只有当寻址单位不是字节时(比如部分专用处理器采用16bit字寻址、位寻址),才需要调整地址和存储单元的映射关系,这类调整和地址位宽是否为8的整数倍没有关联。
C代码中的正确表示
不需要为了凑十六进制格式硬改地址值,直接按实际位宽计算宏定义即可,注意你原来的虚拟地址最大值写法有误:
// 16位虚拟地址,字节寻址,地址范围0~0xFFFF共65536个地址,对应64KiB空间 // 原写法((0xffff)-1)会漏掉最高地址0xFFFF,属于边界错误 #define MAX_VIRT_ADDR 0xFFFF // 14位物理地址,字节寻址,地址范围0~0x3FFF共16384个地址,对应16KiB空间 #define MAX_PHYS_ADDR 0x3FFF // 若要避免硬编码十六进制值提升可读性,也可以用位运算生成: // #define MAX_PHYS_ADDR ((1U << 14) - 1)
- 实现虚拟内存映射时,若虚拟地址高于
MAX_PHYS_ADDR,可直接触发越界访问异常,或通过高位地址位标记内存页的访问权限、缓存属性,是操作系统内存管理的常规实现方式。
内容的提问来源于stack exchange,提问作者Boyim Andresa
相关产品推荐
相关产品推荐

