x86环境下内存边界多字节请求及越界访问会产生什么结果?
问题1:实模式下访问1MB末尾的2字节数据的行为
- 实模式本身没有内存访问越界的异常触发机制,该操作不会触发CPU异常
- 具体行为取决于A20地址线的启用状态:
- 若A20地址线未开启(兼容8086的默认状态),20位以上地址位会被截断,访问
0xFFFFF的2字节会返回0xFFFFF地址的1字节 +0x00000地址的1字节(地址回绕) - 若A20地址线已开启,会正常读取
0xFFFFF和0x100000两个物理地址的内容,不存在回绕
- 若A20地址线未开启(兼容8086的默认状态),20位以上地址位会被截断,访问
问题2:保护模式下分页开启/关闭时的对应行为
- 分页关闭的保护模式:
- 首先检查访问地址是否落在当前操作段的段界限内,若超出段界限直接触发
#GP(通用保护异常) - 若段权限、段界限校验通过,线性地址直接等于物理地址,后续行为和实模式开启A20的情况一致,不会额外触发CPU异常
- 首先检查访问地址是否落在当前操作段的段界限内,若超出段界限直接触发
- 分页开启的保护模式:
- 同样先做段权限、段界限校验,不通过则触发
#GP异常 - 校验通过后会先查询页表完成线性地址到物理地址的转换:如果对应线性地址的页表项不存在、或者当前权限不满足访问要求,直接触发
#PF(页错误)异常 - 若页表映射有效,后续行为和分页关闭的保护模式一致
- 同样先做段权限、段界限校验,不通过则触发
问题3:裸机非分页环境访问超物理内存容量地址的行为
- 该行为由主板硬件逻辑决定,不属于x86 CPU架构的规范范畴,因此英特尔手册不会有对应说明
- 绝大多数x86兼容平台的默认行为是:
- 读操作:CPU将地址发送到总线后没有物理内存设备响应,会返回固定的无意义值(通常为全
0xFF或全0x00,具体看主板实现),不会触发CPU异常 - 写操作:写入的数据会被总线直接丢弃,不会产生任何实际效果
- 读操作:CPU将地址发送到总线后没有物理内存设备响应,会返回固定的无意义值(通常为全
内容的提问来源于stack exchange,提问作者Aryan Kumar
相关产品推荐
相关产品推荐

